|
v7: ТабличноеПоле | ☑ | ||
---|---|---|---|---|
0
varelchik
05.08.15
✎
12:40
|
Делаю класс наследник от ТабличноеПоле.
В нем прописую процедуры Процедура ПриРедактированииЗначения(_Строка, _Колонка, Регион, Значение) Экспорт Сообщить("ПриРедактированииЗначения"); ИмяКолонки =_Колонка.Имя; Если ИмяКолонки<>"Количество" Тогда Возврат; КонецЕсли; Поставщик.УстановитьЗначение(_Строка, ИмяКолонки, Значение); Изменен=1; ТП.ОбновитьСтроки(); КонецПроцедуры // ПриРедактированииЗначения Процедура Выбор(_Строка, _Колонка, Регион) Экспорт Сообщить("Выбор"); ИмяКолонки=_Колонка.Имя; Значение =Поставщик.ПолучитьЗначение(_Строка, ИмяКолонки); Если ИмяКолонки="Артикул" Тогда Конт.АктивизироватьОбъект(Поставщик.ПолучитьЗначение(_Строка,"Элемент")); Возврат; КонецЕсли; Если ИмяКолонки="Плюс" Тогда Значение =Поставщик.ПолучитьЗначение(_Строка,"Количество"); Поставщик.УстановитьЗначение(_Строка,"Количество",Значение+1); Изменен=1; ТП.ОбновитьСтроки(); Возврат; ИначеЕсли ИмяКолонки="Минус" Тогда Значение =Поставщик.ПолучитьЗначение(_Строка,"Количество"); НовЗначение=Значение-1; Если НовЗначение=0 Тогда Поставщик.УдалитьСтроку(_Строка); Иначе Поставщик.УстановитьЗначение(_Строка,"Количество",НовЗначение); КонецЕсли; Изменен=1; ТП.ОбновитьСтроки(); Возврат; КонецЕсли; мДлина=6; мТочность=2; dpSkipOnEnter = "0x00000004"; // пропускать при вводе dpFastChoice = "0x00000008"; // быстрый выбор dpUseHelpString = "0x00000010"; // использовать описание (в качестве подсказки) dpHasButton = "0x00000020"; // имеет кнопку выбора dpDisableAutoChoice = "0x00000200"; // автовыбор выкл dpUndefined = "0x00100000"; // неопределенный тип (тип может быть назначен) Флаг=dpFastChoice; ТП.РедактироватьЗначение(_Строка, _Колонка, Регион, Значение,мДлина,мТочность, "ВыбЗнач", dpHasButton); Изменен=1; КонецПроцедуры // Выбор Процедура ПриНажатииКлавиши(КодКлавиши,Данные,Клавиатура,ФСО) Экспорт Сообщить(КодКлавиши); Если КодКлавиши=13 Тогда лТовар=ТП.ТекущиеДанные.Элемент; Конт.АктивизироватьОбъект(лТовар); ИначеЕсли КодКлавиши=46 Тогда Изменен=1; Если Поставщик.КоличествоСтрок()=0 Тогда Возврат; КонецЕсли; Поставщик.УдалитьСтроку(ТП.ТекущиеДанные.НомерСтроки); ТП.ОбновитьСтроки(); КонецЕсли; КонецПроцедуры // ПриНажатииКлавиши но они чет не срабатуют. подскажите что не так. |
|||
1
trad
05.08.15
✎
12:44
|
создаешь наследника?
|
|||
2
varelchik
05.08.15
✎
12:56
|
(2)да.
|
|||
3
trad
05.08.15
✎
13:04
|
1. ТП на форме создается?
2. Инстанцирующий код покажи. |
|||
4
varelchik
05.08.15
✎
13:30
|
Процедура Инициализация() Экспорт
ТП=я(); Конт=ТП.ПолучитьКонтекстОкружения(); ЗапросЦены=глСоединение(); Текст=" |select |top 1 |s.id [ЭлементЦены $Справочник.Цены] |from $Справочник.Цены s (nolock) |WHERE |s.ParentExt=? |and |$s.КатегорияЦены=:ВыбКатегория |"; ЗапросЦены.ДобПараметр(1,14,9,0); ЗапросЦены.УстановитьТекстовыйПараметр("ВыбКатегория",Конт.КатегорияЦен); стат=ЗапросЦены.Подготовить(Текст); Если стат=0 Тогда Сообщить(ЗапросЦены.ОписаниеОшибки()); КонецЕсли; Изменен=0; Поставщик=ТП.ПоставщикДанных.ИндексированнаяТаблица; ТаблицаПодбора=СоздатьОбъект("ТаблицаЗначений"); ТаблицаПодбора.НоваяКолонка("Плюс","Число",1,,"+",17,,3); ТаблицаПодбора.НоваяКолонка("Минус","Число",1,,"-",17,,3); ТаблицаПодбора.НоваяКолонка("Элемент"); ТаблицаПодбора.НоваяКолонка("Артикул",,,,"Выбранный товар",,,1); ТаблицаПодбора.НоваяКолонка("Количество",,,,"к-во",80,,2); ТаблицаПодбора.НоваяКолонка("ЭлементЦены"); Колонки=ТП.Колонки; ФабрикаОбъектов=СоздатьОбъект("ФабрикаОбъектов"); лШрифт=ФабрикаОбъектов.Шрифт("MS Sans Serif",8,1); Для н=1 По ТаблицаПодбора.КоличествоКолонок() Цикл Имя=""; Идент=""; Ширина=0; Положение=0; Идент=ТаблицаПодбора.ПолучитьПараметрыКолонки(н,,,,Имя,Ширина,,Положение); Видимость=1-ПустоеЗначение(Имя); Поставщик.НоваяКолонка(Идент); Если Найти(Имя,"Элемент")>0 Тогда Продолжить; КонецЕсли; Колонка=Колонки.Добавить(Идент); Колонка.ШрифтЗаголовка=лШрифт; Колонка.Данные=Идент; Колонка.Заголовок=Имя; Колонка.ИзменениеРазмера=0; Колонка.Видимость=Видимость; Колонка.ГоризонтальноеВыравнивание=Положение; Если н<3 Тогда Колонка.ИзменениеРазмера=0; Колонка.ГоризонтальноеВыравнивание=3; Колонка.Шрифт=лШрифт; КонецЕсли; Если н=1 Тогда Колонка.ЦветТекста=65280; ИначеЕсли н=2 Тогда Колонка.ЦветТекста=255; КонецЕсли; Колонка.ИзменятьВидимость=0; Если Число(Ширина)>0 Тогда Колонка.Ширина=Ширина; Иначе Колонка.ИзменениеРазмера=1; КонецЕсли; КонецЦикла; Поставщик.ДобавитьИндекс("инд","*Элемент"); ВнКонт=Конт.ВнКонтекст; ВнКонт.ВыбратьСтроки(); Пока ВнКонт.ПолучитьСтроку()=1 Цикл Поставщик.НоваяСтрока(); Поставщик.Элемент=ВнКонт.Товар; Поставщик.Артикул=ВнКонт.Товар.Артикул; Поставщик.Плюс="+"; Поставщик.Минус="-"; Поставщик.Количество=ВнКонт.Количество; ЗапросЦены.УстПараметр(1,Поставщик.Элемент); Поставщик.ЭлементЦены=ЗапросЦены.ВыполнитьСкалярный(); КонецЦикла; Если Поставщик.КоличествоСтрок()>0 Тогда Поставщик.НомерСтроки=1; Спр=СоздатьОбъект("Справочник.Номенклатура"); Спр.НайтиЭлемент(Поставщик.Элемент); Конт.АктивизироватьОбъект(Спр.ТекущийЭлемент()); //Сообщить(Спр.ТекущийЭлемент()); КонецЕсли; ТП.ОбновитьСтроки(); КонецПроцедуры // Инициализация |
|||
5
varelchik
05.08.15
✎
13:31
|
В ПослеОткрытия()
ТППодбор=СоздатьОбъект("ТППодбор"); ТППодбор.Инит(Контекст,"ТППодбор"); ТППодбор.Инициализация(); |
|||
6
varelchik
05.08.15
✎
13:33
|
(3) Да нормально как и положено.
Но только методы (1) и чихании на ТП нереагируют. |
|||
7
varelchik
05.08.15
✎
13:36
|
Конечно можно перенести эти методы в сам контекст там то они точно будут работать.
но хотелось бы меньше мусорить. |
|||
8
trad
05.08.15
✎
14:25
|
не видно где и как создается элемент формы экземпляра ТППодбор
|
|||
9
varelchik
07.08.15
✎
10:00
|
(8)Блин забыл.
класс ТППодбор = Класс_ТППодбор@MD :ТабличноеПолеИТЗ { }; а вот ТабличноеПолеИТЗ и есть наследник класс ТабличноеПолеИТЗ = Класс_ТабличноеПолеИТЗ@MD : ТабличноеПолеСНастройками { }; а класс ТабличноеПолеСНастройками = Класс_ТабличноеПолеСНастройками@MD : ТабличноеПоле { }; о! |
|||
10
trad
07.08.15
✎
10:27
|
и что? эта матрешка не работает?
|
|||
11
trad
07.08.15
✎
10:27
|
+ так и нет ответа на (8)
|
|||
12
varelchik
07.08.15
✎
13:01
|
(11)Забыл.
Это в ТабличноеПолеИТЗ Функция Инит(КонтекстФормы, ИдентификаторРеквизита) Экспорт оФорма = СоздатьОбъект("Форма"); оФорма.УстановитьФорму(КонтекстФормы.Форма); оФорма.СоздатьЭлементУправления(я(), ИдентификаторРеквизита); Источник = СоздатьОбъект("ПоставщикДанныхИТ"); ИТЗ=СоздатьОбъект("ИндексированнаяТаблица"); Источник.ИндексированнаяТаблица = ИТЗ; я().ПоставщикДанных=Источник; Колонки=я().Колонки; Колонка=Колонки.Добавить("_НомерСтроки"); Колонка.Заголовок="№"; Колонка.Данные="НомерСтроки"; я().АвтоШирина(); Колонка.ИзменятьВидимость=0; Возврат 1; КонецФункции |
|||
13
varelchik
07.08.15
✎
13:02
|
В контексте:
ПослеОткрытия() ТППодбор=СоздатьОбъект("ТППодбор"); ТППодбор.Инит(Контекст,"ТППодбор"); ТППодбор.Инициализация(); |
|||
14
varelchik
07.08.15
✎
13:02
|
Вроде все.
Посмотрел как у ПоставщикДанных сделано. Все работает. Непойму че в мене не пашет? |
|||
15
trad
07.08.15
✎
13:53
|
все ясно как божий день
ТабличноеПолеИТЗ::Инит() я() - в данном случае возвращает ссылку на базу в контексте которой вызывается этот я(), т.е. на ТабличноеПолеИТЗ, и события цепляются этой базы. А твои события определены в наследнике. Что бы работало, надо в СоздатьЭлементУправления передавать ссылку на сам ТППодбор |
|||
16
varelchik
07.08.15
✎
14:00
|
(15)Ткни носом куда вставить?
|
|||
17
varelchik
07.08.15
✎
14:00
|
в этой матрешке шоб заработало.
|
|||
18
trad
07.08.15
✎
14:05
|
СоздатьЭлементУправления(вирт()...
|
|||
19
trad
07.08.15
✎
14:06
|
оФорма.СоздатьЭлементУправления(вирт(), ИдентификаторРеквизита);
|
|||
20
trad
07.08.15
✎
14:09
|
ну и везде где в _предках_ нужно полиморфное поведение нужно использовать вирт() а не я()
|
|||
21
varelchik
07.08.15
✎
14:21
|
(20) сенкс.
ОГРОМНОЕ СПАСИБО! Заработало. |
|||
22
trad
07.08.15
✎
14:30
|
отлично.
А теперь, внимание, вопрос! Возможно ли ответить однозначно на вопрос: Что вернет выражение ?(вирт()=я(),1,0) ? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |