Имя: Пароль:
1C
1C 7.7
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) ?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший