Имя: Пароль:
1C
1С v8
Как из внешней обработки добавить элемент формы и назначить ему обработчик события?
0 alexey980
 
24.12.19
20:36
В УТ 11.4 есть документ "КорректировкаРеализации", нужно в табличную часть "Товары" добавить колонку "Возврат количество" и назначить ей обработчик события, чтобы при вводе данных в эту колонку автоматически пересчитывались данные в колонке "Количество после корректировки". Это реально сделать через внешнюю обработку?

Пробовал воспользоваться внешней обработкой вида "ЗаполнениеОбъекта" с типом команды "ЗаполнениеФормы". С её помощью можно программно добавить новую колонку для ввода данных в табличную часть уже открытого документа. А как связать ввод данных в этой колонке с пересчетом данных в другой колонке? С помощью обработки вида "ЗаполнениеОбъекта" с типом команды "ВызовКлиентскогоМетода" тоже ничего не получается. Там вообще нельзя программно добавлять на форму новые реквизиты и элементы. Есть ли еще какие-то варианты?

Ниже содержимое модуля объекта текущей версии обработки с типом команды "ЗаполнениеФормы".


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");

    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Наименование = "Корректировка Реализации: Пересчет количества при возврате";        
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.КорректировкаРеализации");
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Показать доп. колонку при возврате'");
    НоваяКоманда.Идентификатор = "ПоказатьДопКолонкуПриВозврате";
    
    // указываю тип команды "ЗаполнениеФормы" вместо "ВызовКлиентскогоМетода"     
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

&НаКлиенте
// эта процедура игнорируется обработкой - ничего не происходит
Процедура ЭлементВозвратКоличествоПриИзменении(Элемент)

    Сообщить("Данные изменены!");
    //ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
    
    Если ИдентификаторКоманды = "ПоказатьДопКолонкуПриВозврате" Тогда

        КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Неотрицательный);
        ТипЧисло = Новый ОписаниеТипов("Число", КвалификаторыЧисла);            
        
        Форма = ПараметрыВыполнения.ЭтаФорма;
        
        // добавление нового реквизита
        Реквизиты = Новый Массив;
        Реквизиты.Добавить(Новый РеквизитФормы("ВозвратКоличество", ТипЧисло,  "Объект.Товары" , "Возврат количество", Ложь));
        Форма.ИзменитьРеквизиты(Реквизиты);
        
        // вставка нового элемента формы для созданного только что реквизита
        ВставитьПеред = Форма.Элементы.Найти("ТоварыУпаковкаЕдиницаИзмерения");
        ЭлементВозвратКоличество = Форма.Элементы.Вставить("ЭлементВозвратКоличество", Тип("ПолеФормы"),
                                        Форма.Элементы.Товары, ВставитьПеред);
        ЭлементВозвратКоличество.Вид = ВидПоляФормы.ПолеВвода;
        ЭлементВозвратКоличество.ТолькоПросмотр = Ложь;
        ЭлементВозвратКоличество.ЦветТекста  = WebЦвета.Серый;
        ЭлементВозвратКоличество.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
        ЭлементВозвратКоличество.ПутьКДанным = "Объект.Товары.ВозвратКоличество";
        // этот вызов игнорируется обработкой - ничего не происходит
        ЭлементВозвратКоличество.УстановитьДействие("ПриИзменении", "ЭлементВозвратКоличествоПриИзменении");
        
    КонецЕсли;
    
КонецПроцедуры
1 alexey980
 
28.12.19
14:53
В общем, через внешние обработки не получится. Пошел другим путем и задействовал механизм расширения конфигурации.

1. Добавляю в расширение форму документа из типовой конфигурации.
2. Саму форму не трогаю, добавление нового реквизита и элемента формы произвожу программно в модуле формы.

Код модуля формы:

//*************************************************************************************
// Прописываем на клиенте обработчик события для нового элемента формы.
// Важно! При добавлении обработчика нужно также переопределить стандартную процедуру
// модуля формы КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении(),
// чтобы включить в неё проверку добавленного элемента - иначе вылезает ошибка.
//*************************************************************************************

&НаКлиенте
// обработчик события ПриИзменении для новой колонки Возврат (Количество)    
Процедура ВозвратКоличествоПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // пересчитываем значение в стандартной колонке Количество
    НовоеЗначениеКоличество = ТекущаяСтрока.Количество - ТекущаяСтрока.ВозвратКоличество;
    ТекущаяСтрока.Количество = ?(НовоеЗначениеКоличество > 0, НовоеЗначениеКоличество, 0);
    // вызываем стандартный обработчик события ПриИзменении для колонки Количество
    ТоварыКоличествоПриИзменении(Элемент);
    
КонецПроцедуры

&НаКлиенте
&Вместо("КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении")
// переопределяем стандартную процедуру модуля формы
Процедура Расш1_КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении(Элемент)
    
    ПродолжитьСтандартныйВызов = Истина;
    
    // включаем в проверку наш добавленный элемент
    Если Элемент.Имя = "ВозвратКоличество" Тогда
        ВозвратКоличествоПриИзменении(Элемент);
        ПродолжитьСтандартныйВызов = Ложь;
        
    // если добавляли еще какие-то новые элементы и обработчики событий  
    // нужно их также включить в проверку, например:
    //ИначеЕсли Элемент.Имя = "ВозвратСумма" Тогда
    //ВозвратСуммаПриИзменении(Элемент);
    //ПродолжитьСтандартныйВызов = Ложь;

    КонецЕсли;

    Если ПродолжитьСтандартныйВызов Тогда
        ПродолжитьВызов(Элемент);
    КонецЕсли;    
    
КонецПроцедуры


//*************************************************************************************
// Дополняем стандартную процедуру модуля формы ПриСозданииНаСервере,
// чтобы программно добавить туда новые реквизиты и элементы формы.
//*************************************************************************************

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    ДобавитьКолонкуВозвратКоличество();
    
КонецПроцедуры

&НаСервере
// вспомогательная процедура для добавления колонки ВозвратКоличество
Процедура ДобавитьКолонкуВозвратКоличество()

        КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Неотрицательный);
        ТипЧисло = Новый ОписаниеТипов("Число", КвалификаторыЧисла);    
        
        // добавляем новый реквизит (Объект.Товары.ВозвратКоличество)
        Реквизиты = Новый Массив;
        Реквизиты.Добавить(Новый РеквизитФормы("ВозвратКоличество", ТипЧисло, "Объект.Товары", "Возврат", Ложь));
        ИзменитьРеквизиты(Реквизиты);
        
        // добавляем новый элемент формы (ВозвратКоличество)
        ЭлементРодитель = Элементы.Товары;
        ЭлементВставитьПеред = Элементы.ТоварыУпаковкаЕдиницаИзмерения;
        НовыйЭлемент = Элементы.Вставить("ВозвратКоличество", Тип("ПолеФормы"), ЭлементРодитель, ЭлементВставитьПеред);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ТолькоПросмотр = Ложь;
        НовыйЭлемент.ЦветТекстаЗаголовка = Новый Цвет(119, 136, 153);
        НовыйЭлемент.ЦветТекста = Новый Цвет(119, 136, 153);
        НовыйЭлемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
        НовыйЭлемент.ПутьКДанным = "Объект.Товары.ВозвратКоличество";
        НовыйЭлемент.УстановитьДействие("ПриИзменении", "ВозвратКоличествоПриИзменении");

КонецПроцедуры
2 Капитан Джек Воробей
 
28.12.19
15:02
(1) Надо записать, скоро тоже надо будет решить подобное)