Как из внешней обработки добавить элемент формы и назначить ему обработчик события?
В УТ 11.4 есть документ "КорректировкаРеализации", нужно в табличную часть "Товары" добавить колонку "Возврат количество" и назначить ей обработчик события, чтобы при вводе данных в эту колонку автоматически пересчитывались данные в колонке "Количество после корректировки". Это реально сделать через внешнюю обработку?
Пробовал воспользоваться внешней обработкой вида ЗаполнениеОбъекта с типом команды ЗаполнениеФормы. С её помощью можно программно добавить новую колонку для ввода данных в табличную часть уже открытого документа. А как связать ввод данных в этой колонке с пересчетом данных в другой колонке? Здесь тупик. С помощью обработки вида ЗаполнениеОбъекта с типом команды ВызовКлиентскогоМетода тоже ничего не получается. Там вообще нельзя программно добавлять на форму новые реквизиты и элементы. Есть ли еще какие-то варианты?
Ниже содержимое модуля объекта текущей версии обработки с типом команды ЗаполнениеФормы.
Пробовал воспользоваться внешней обработкой вида ЗаполнениеОбъекта с типом команды ЗаполнениеФормы. С её помощью можно программно добавить новую колонку для ввода данных в табличную часть уже открытого документа. А как связать ввод данных в этой колонке с пересчетом данных в другой колонке? Здесь тупик. С помощью обработки вида ЗаполнениеОбъекта с типом команды ВызовКлиентскогоМетода тоже ничего не получается. Там вообще нельзя программно добавлять на форму новые реквизиты и элементы. Есть ли еще какие-то варианты?
Ниже содержимое модуля объекта текущей версии обработки с типом команды ЗаполнениеФормы.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Наименование = "Корректировка Реализации: Пересчет количества при возврате";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.КорректировкаРеализации");
ПараметрыРегистрации.БезопасныйРежим = Истина;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Показать доп. колонку при возврате'");
НоваяКоманда.Идентификатор = "ПоказатьДопКолонкуПриВозврате";
// указываю тип команды "ЗаполнениеФормы" вместо "ВызовКлиентскогоМетода"
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
&НаКлиенте
// эта процедура игнорируется обработкой - ничего не происходит
Процедура ЭлементВозвратКоличествоПриИзменении(Элемент)
Сообщить("Данные изменены!");
//ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ПоказатьДопКолонкуПриВозврате" Тогда
КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Неотрицательный);
ТипЧисло = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
Форма = ПараметрыВыполнения.ЭтаФорма;
// добавление нового реквизита
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("ВозвратКоличество", ТипЧисло, "Объект.Товары" , "Возврат количество", Ложь));
Форма.ИзменитьРеквизиты(Реквизиты);
// вставка нового элемента формы для созданного только что реквизита
ВставитьПеред = Форма.Элементы.Найти("ТоварыУпаковкаЕдиницаИзмерения");
ЭлементВозвратКоличество = Форма.Элементы.Вставить("ЭлементВозвратКоличество", Тип("ПолеФормы"),
Форма.Элементы.Товары, ВставитьПеред);
ЭлементВозвратКоличество.Вид = ВидПоляФормы.ПолеВвода;
ЭлементВозвратКоличество.ТолькоПросмотр = Ложь;
ЭлементВозвратКоличество.ЦветТекста = WebЦвета.Серый;
ЭлементВозвратКоличество.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
ЭлементВозвратКоличество.ПутьКДанным = "Объект.Товары.ВозвратКоличество";
// этот вызов игнорируется обработкой - ничего не происходит
ЭлементВозвратКоличество.УстановитьДействие("ПриИзменении", "ЭлементВозвратКоличествоПриИзменении");
КонецЕсли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Методика упрощения поддержки конфигураций. Переопределение и вызов обработчиков событий для УФ 1С 8.2-8.3
- Как вносить значительные изменения в типовую конфигурацию 1С, сохранив возможность ее обновления с минимальными трудозатратами
- Под капотом управляемых форм
- Расширяем возможности дополнительных обработок и настраиваем их отладку
- "Привет, мир!": Сервис telegram-бота на 1С:Предприятие.Элемент
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Указанная Вами строчка не игнорируется. Просто обработчики событий как самой формы, так и ее элементов должны располагаться в модуле формы, и нигде иначе. Внешней обработкой Вашу задачу не решить. Попробуйте воспользоваться механизмом расширений.
Через расширение конфигурации всё получилось.
1. Добавляю в расширение форму документа из типовой конфигурации.
2. Саму форму не трогаю, добавление нового реквизита и элемента формы произвожу программно в модуле формы.
Код модуля формы:
1. Добавляю в расширение форму документа из типовой конфигурации.
2. Саму форму не трогаю, добавление нового реквизита и элемента формы произвожу программно в модуле формы.
Код модуля формы:
//*************************************************************************************
// Прописываем на клиенте обработчик события для нового элемента формы.
// Важно! При добавлении обработчика нужно также переопределить стандартную процедуру
// модуля формы КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении(),
// чтобы включить в неё проверку добавленного элемента - иначе вылезает ошибка.
//*************************************************************************************
&НаКлиенте
// обработчик события ПриИзменении для новой колонки Возврат (Количество)
Процедура ВозвратКоличествоПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
// пересчитываем значение в стандартной колонке Количество
НовоеЗначениеКоличество = ТекущаяСтрока.Количество - ТекущаяСтрока.ВозвратКоличество;
ТекущаяСтрока.Количество = ?(НовоеЗначениеКоличество > 0, НовоеЗначениеКоличество, 0);
// вызываем стандартный обработчик события ПриИзменении для колонки Количество
ТоварыКоличествоПриИзменении(Элемент);
КонецПроцедуры
&НаКлиенте
&Вместо("КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении")
// переопределяем стандартную процедуру модуля формы
Процедура Расш1_КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении(Элемент)
ПродолжитьСтандартныйВызов = Истина;
// включаем в проверку наш добавленный элемент
Если Элемент.Имя = "ВозвратКоличество" Тогда
ВозвратКоличествоПриИзменении(Элемент);
ПродолжитьСтандартныйВызов = Ложь;
// если добавляли еще какие-то новые элементы и обработчики событий
// нужно их также включить в проверку, например:
//ИначеЕсли Элемент.Имя = "ВозвратСумма" Тогда
//ВозвратСуммаПриИзменении(Элемент);
//ПродолжитьСтандартныйВызов = Ложь;
КонецЕсли;
Если ПродолжитьСтандартныйВызов Тогда
ПродолжитьВызов(Элемент);
КонецЕсли;
КонецПроцедуры
//*************************************************************************************
// Дополняем стандартную процедуру модуля формы ПриСозданииНаСервере,
// чтобы программно добавить туда новые реквизиты и элементы формы.
//*************************************************************************************
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ДобавитьКолонкуВозвратКоличество();
КонецПроцедуры
&НаСервере
// вспомогательная процедура для добавления колонки ВозвратКоличество
Процедура ДобавитьКолонкуВозвратКоличество()
КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Неотрицательный);
ТипЧисло = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
// добавляем новый реквизит (Объект.Товары.ВозвратКоличество)
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("ВозвратКоличество", ТипЧисло, "Объект.Товары", "Возврат", Ложь));
ИзменитьРеквизиты(Реквизиты);
// добавляем новый элемент формы (ВозвратКоличество)
ЭлементРодитель = Элементы.Товары;
ЭлементВставитьПеред = Элементы.ТоварыУпаковкаЕдиницаИзмерения;
НовыйЭлемент = Элементы.Вставить("ВозвратКоличество", Тип("ПолеФормы"), ЭлементРодитель, ЭлементВставитьПеред);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Ложь;
НовыйЭлемент.ЦветТекстаЗаголовка = Новый Цвет(119, 136, 153);
НовыйЭлемент.ЦветТекста = Новый Цвет(119, 136, 153);
НовыйЭлемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
НовыйЭлемент.ПутьКДанным = "Объект.Товары.ВозвратКоличество";
НовыйЭлемент.УстановитьДействие("ПриИзменении", "ВозвратКоличествоПриИзменении");
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот