Как из внешней обработки добавить элемент формы и назначить ему обработчик события?

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

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

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


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

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

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

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

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

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

        КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Неотрицательный);
        ТипЧисло = Новый ОписаниеТипов("Число", КвалификаторыЧисла);            
        
        Форма = ПараметрыВыполнения.ЭтаФорма;
        
        // добавление нового реквизита
        Реквизиты = Новый Массив;
        Реквизиты.Добавить(Новый РеквизитФормы("ВозвратКоличество", ТипЧисло,  "Объект.Товары" , "Возврат количество", Ложь));
        Форма.ИзменитьРеквизиты(Реквизиты);
        
        // вставка нового элемента формы для созданного только что реквизита
        ВставитьПеред = Форма.Элементы.Найти("ТоварыУпаковкаЕдиницаИзмерения");
        ЭлементВозвратКоличество = Форма.Элементы.Вставить("ЭлементВозвратКоличество", Тип("ПолеФормы"),
                                        Форма.Элементы.Товары, ВставитьПеред);
        ЭлементВозвратКоличество.Вид = ВидПоляФормы.ПолеВвода;
        ЭлементВозвратКоличество.ТолькоПросмотр = Ложь;
        ЭлементВозвратКоличество.ЦветТекста  = WebЦвета.Серый;
        ЭлементВозвратКоличество.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
        ЭлементВозвратКоличество.ПутьКДанным = "Объект.Товары.ВозвратКоличество";
        // этот вызов игнорируется обработкой - ничего не происходит
        ЭлементВозвратКоличество.УстановитьДействие("ПриИзменении", "ЭлементВозвратКоличествоПриИзменении");
        
    КонецЕсли;
    
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Comrade88 7 24.12.19 21:11 Сейчас в теме
Программно назначить: УстановитьДействие(<ИмяСобытия>, <Действие>) и т.д.
3. dklp 42 24.12.19 23:13 Сейчас в теме
(2) Это как раз то, что у меня прописано в самом низу кода, но эта строка ни на что не влияет. Процедура действия на выполняется. Я так понимаю, внешняя обработка с типом команды ЗаполнениеФормы игнорирует процедуры &НаКлиенте.
4. dhurricane 25.12.19 07:28 Сейчас в теме
(3) Указанная Вами строчка не игнорируется. Просто обработчики событий как самой формы, так и ее элементов должны располагаться в модуле формы, и нигде иначе. Внешней обработкой Вашу задачу не решить. Попробуйте воспользоваться механизмом расширений.
Comrade88; +1 Ответить
5. dklp 42 25.12.19 22:33 Сейчас в теме
6. dklp 42 28.12.19 14:45 Сейчас в теме
Через расширение конфигурации всё получилось.

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

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

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

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

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

    КонецЕсли;

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


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

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

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

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

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

КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот