Платформа: 1С:Предприятие 8.3 (8.3.12.1790)
Как программно установить действия для полей ввода (ПриИзмененииПеред, ПриИзмененииПосле, ПриИзмененииВместо) в расширении конфигурации?
По идеи должно быть что-то вроде этого
Но если бы это работало - вопроса бы не было.
Заранее, спасибо.
Как программно установить действия для полей ввода (ПриИзмененииПеред, ПриИзмененииПосле, ПриИзмененииВместо) в расширении конфигурации?
По идеи должно быть что-то вроде этого
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");
Но если бы это работало - вопроса бы не было.
Заранее, спасибо.
По теме из базы знаний
- Доработки объектов метаданных и форм (только кодом) с помощью расширений на примере типовых конфигураций: 1C:ERP Управление предприятием 2.4 и 1С:Альфа-Авто: Автосалон+Автосервис+Автозапчасти КОРП 6
- Об обновлениях
- Счета учета расчетов с контрагентами по видам договоров в 1С:Бухгалтерия предприятия
- Прием программирования, минимизирующий изменения в модулях управляемых форм при доработке типовых конфигураций и сокращающий время обновления при переходе на новую версию
- Перемещение товаров между филиалами в одной информационной базе 1С с применением RLS
Найденные решения
Попробуйте так:
1. оставляете
2. Вашу процедуру пишете так:
1. оставляете
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");
2. Вашу процедуру пишете так:
Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)
имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
Выполнить(имяСтароеДействие);
// Выполнение кода после
сюда вписываете нужный поле-код
//
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)А так и не будет работать. Что за объект - Номенклатура?
Вот как у меня например работает
Вот как у меня например работает
СообщениеКлиенту = Элементы.Вставить("СообщениеКлиенту", Тип("ПолеФормы"), СтраницаИзвещения);
СообщениеКлиенту.Вид = ВидПоляФормы.ПолеФлажка;
СообщениеКлиенту.ПутьКДанным = "Объект.ОтправленоСообщениеКлиенту";
СообщениеКлиенту.УстановитьДействие("ПриИзменении", "ПриИзмененииСообщениеКлиенту");
(2)Элементы.Номенклатура это поле ввода.
Все правильно, ваш код работает, но это не то что я спрашиваю.
Меня интересует именно как указать, директиву например "После" для событий полей ввода в расширении - программно.
Грубо говоря: что мне с этим кодом нужно сделать чтобы 1с поняла, что процедуру нужно выполнять именно после соответствующего события на форме основной конфигурации.
Или совсем по-простому: как сделать так, чтобы добиться такого-же эффекта как на скрине, пользуясь только кодом?
Все правильно, ваш код работает, но это не то что я спрашиваю.
Меня интересует именно как указать, директиву например "После" для событий полей ввода в расширении - программно.
Грубо говоря: что мне с этим кодом нужно сделать чтобы 1с поняла, что процедуру нужно выполнять именно после соответствующего события на форме основной конфигурации.
Элементы.Номенклатура.УстановитьДействие("ПриИзменении", "Расшир1_НоменклатураПриИзмененииПосле");
Или совсем по-простому: как сделать так, чтобы добиться такого-же эффекта как на скрине, пользуясь только кодом?
Прикрепленные файлы:
(3)
На скрине расширение формы или основная форма? Вообще не очень понятен смысл вашего "танца"... Может, если все еще актуально, расскажите что именно должно получиться... ;)
как сделать так, чтобы добиться такого-же эффекта как на скрине, пользуясь только кодом?
На скрине расширение формы или основная форма? Вообще не очень понятен смысл вашего "танца"... Может, если все еще актуально, расскажите что именно должно получиться... ;)
(5)На скрине свойства формы расширения (у основной конфигурации нет разделения событий по директориям: Перед, после и Вместо).
Мне нужно во-первых понять можно ли такое делать в принципе? Мне нужно делать такие дополнительные обработчики к элементам формы основной конфигурации, но я не хочу замещать стандартную процедуру своей.
Вообще не очень понятен смысл вашего "танца"... Может, если все еще актуально, расскажите что именно должно получиться... ;)
Мне нужно во-первых понять можно ли такое делать в принципе? Мне нужно делать такие дополнительные обработчики к элементам формы основной конфигурации, но я не хочу замещать стандартную процедуру своей.
Попробуйте так:
1. оставляете
2. Вашу процедуру пишете так:
1. оставляете
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");
2. Вашу процедуру пишете так:
Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)
имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
Выполнить(имяСтароеДействие);
// Выполнение кода после
сюда вписываете нужный поле-код
//
КонецПроцедуры
Показать
(4) Замечательная идея - благодарю.
только не
а
Из того что я начитал везде, где только можно, вот прям как я хочу - делать нельзя.
Но ваш вариант - очень хорошая альтернатива 10/10))
только не
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");
а
Элементы.Номенклатура.УстановитьДействие("ПриИзменении", "Расшир1_НоменклатураПриИзмененииПосле");
Из того что я начитал везде, где только можно, вот прям как я хочу - делать нельзя.
Но ваш вариант - очень хорошая альтернатива 10/10))
(4)
словил зацикливание при таком решении. Решил дополнить
Столкнулся с проблемой что не отрабатывает добавить в расширение обработчика действия как расширение метода, нарисовал костыль
При создании на сервере:
//устанавливаем действие, при этом типовой код не отработает(без наших усилий в обработке действий)
Элементы.БанковскийСчет.УстановитьДействие("ПриИзменении", "ПИК_БанковскийСчетПриИзмененииПосле");
//Данный реквизит нужен что бы избежать зацикливания в обработке события
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("ПИК_Выполнено",Новый ОписаниеТипов("Булево"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект.ПИК_Выполнено = Ложь;
&НаКлиенте
Процедура ПИК_БанковскийСчетПриИзмененииПосле(Элемент)
имяСтароеДействие = "БанковскийСчетПриИзменении(Элемент)";
Если Не ЭтотОбъект.ПИК_Выполнено Тогда
ЭтотОбъект.ПИК_Выполнено = Истина;
Выполнить(имяСтароеДействие);
КонецЕсли;
ЭтотОбъект.ПИК_Выполнено = Ложь;
//наше действия
НастройкаВидимостиИДоступностиПриПеремещенииВ1Организации();
КонецПроцедуры
имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
Выполнить(имяСтароеДействие);
Выполнить(имяСтароеДействие);
словил зацикливание при таком решении. Решил дополнить
Столкнулся с проблемой что не отрабатывает добавить в расширение обработчика действия как расширение метода, нарисовал костыль
При создании на сервере:
//устанавливаем действие, при этом типовой код не отработает(без наших усилий в обработке действий)
Элементы.БанковскийСчет.УстановитьДействие("ПриИзменении", "ПИК_БанковскийСчетПриИзмененииПосле");
//Данный реквизит нужен что бы избежать зацикливания в обработке события
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("ПИК_Выполнено",Новый ОписаниеТипов("Булево"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект.ПИК_Выполнено = Ложь;
&НаКлиенте
Процедура ПИК_БанковскийСчетПриИзмененииПосле(Элемент)
имяСтароеДействие = "БанковскийСчетПриИзменении(Элемент)";
Если Не ЭтотОбъект.ПИК_Выполнено Тогда
ЭтотОбъект.ПИК_Выполнено = Истина;
Выполнить(имяСтароеДействие);
КонецЕсли;
ЭтотОбъект.ПИК_Выполнено = Ложь;
//наше действия
НастройкаВидимостиИДоступностиПриПеремещенииВ1Организации();
КонецПроцедуры
Помоему простой, но не совсем очевидный вариант решения этой проблемы - добавить аннотации к вызову вашего обработчика вручную
Код рабочий. На форме действие не указывал. Вызов "УстановитьДействие" тоже не делал.
&НаКлиенте
&После("ПриОткрытии")
Процедура СТ_ПриОткрытииПосле(Отказ)
КонецПроцедуры
Код рабочий. На форме действие не указывал. Вызов "УстановитьДействие" тоже не делал.
(9)Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.
(10)
Можно сделать так.
В обработчике расширения "ПриСозданииНаСервере" проверять, установлен ли обработчик для элемента.
Если не задан - то задаем явно.
Сам обработчик прописать таким образом.
Если в основной конфигурации добавится обработчик - сработает перехват метода расширения.
Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.
Можно сделать так.
В обработчике расширения "ПриСозданииНаСервере" проверять, установлен ли обработчик для элемента.
Если не задан - то задаем явно.
&НаСервере
Процедура sappi_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
СобытиеОсновнойКонфигурации = Элементы.Товары.ПолучитьДействие("ПриНачалеРедактирования");
Если ПустаяСтрока(СобытиеОсновнойКонфигурации) Тогда
Элементы.Товары.УстановитьДействие("ПриНачалеРедактирования","sappi_ТоварыПриНачалеРедактирования");
КонецЕсли;
КонецПроцедуры
Сам обработчик прописать таким образом.
&НаКлиенте
&После("ТоварыПриНачалеРедактирования")
Процедура sappi_ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если Копирование Тогда
ТекущиеДанные.ИдентификаторСтроки = Новый УникальныйИдентификатор;
КонецЕсли;
КонецПроцедуры
Если в основной конфигурации добавится обработчик - сработает перехват метода расширения.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот