|
Как из внешней обработки добавить элемент формы и назначить ему обработчик события? | ☑ | ||
---|---|---|---|---|
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) Надо записать, скоро тоже надо будет решить подобное)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |