УстановитьДействие в расширении.

1. Sonnya1909 04.02.20 08:59 Сейчас в теме
Платформа: 1С:Предприятие 8.3 (8.3.12.1790)

Как программно установить действия для полей ввода (ПриИзмененииПеред, ПриИзмененииПосле, ПриИзмененииВместо) в расширении конфигурации?

По идеи должно быть что-то вроде этого
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");

Но если бы это работало - вопроса бы не было.

Заранее, спасибо.
По теме из базы знаний
Найденные решения
4. vv2 06.02.20 08:48 Сейчас в теме
Попробуйте так:
1. оставляете
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");

2. Вашу процедуру пишете так:
Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)
    
    имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
    Выполнить(имяСтароеДействие);
    // Выполнение кода после 
        сюда вписываете нужный поле-код
    //
КонецПроцедуры
Показать
user1951539; surr; user591389_aska_rabota; CepeLLlka; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. lefthander 04.02.20 09:08 Сейчас в теме
(1)А так и не будет работать. Что за объект - Номенклатура?

Вот как у меня например работает
	СообщениеКлиенту = Элементы.Вставить("СообщениеКлиенту", Тип("ПолеФормы"), СтраницаИзвещения);
	СообщениеКлиенту.Вид = ВидПоляФормы.ПолеФлажка;
	СообщениеКлиенту.ПутьКДанным = "Объект.ОтправленоСообщениеКлиенту";
	СообщениеКлиенту.УстановитьДействие("ПриИзменении", "ПриИзмененииСообщениеКлиенту");
3. Sonnya1909 06.02.20 07:16 Сейчас в теме
(2)Элементы.Номенклатура это поле ввода.

Все правильно, ваш код работает, но это не то что я спрашиваю.
Меня интересует именно как указать, директиву например "После" для событий полей ввода в расширении - программно.

Грубо говоря: что мне с этим кодом нужно сделать чтобы 1с поняла, что процедуру нужно выполнять именно после соответствующего события на форме основной конфигурации.
 Элементы.Номенклатура.УстановитьДействие("ПриИзменении", "Расшир1_НоменклатураПриИзмененииПосле"); 


Или совсем по-простому: как сделать так, чтобы добиться такого-же эффекта как на скрине, пользуясь только кодом?
Прикрепленные файлы:
5. lefthander 06.02.20 09:00 Сейчас в теме
(3)
как сделать так, чтобы добиться такого-же эффекта как на скрине, пользуясь только кодом?

На скрине расширение формы или основная форма? Вообще не очень понятен смысл вашего "танца"... Может, если все еще актуально, расскажите что именно должно получиться... ;)
6. Sonnya1909 06.02.20 09:54 Сейчас в теме
(5)На скрине свойства формы расширения (у основной конфигурации нет разделения событий по директориям: Перед, после и Вместо).

Вообще не очень понятен смысл вашего "танца"... Может, если все еще актуально, расскажите что именно должно получиться... ;)


Мне нужно во-первых понять можно ли такое делать в принципе? Мне нужно делать такие дополнительные обработчики к элементам формы основной конфигурации, но я не хочу замещать стандартную процедуру своей.
4. vv2 06.02.20 08:48 Сейчас в теме
Попробуйте так:
1. оставляете
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");

2. Вашу процедуру пишете так:
Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)
    
    имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
    Выполнить(имяСтароеДействие);
    // Выполнение кода после 
        сюда вписываете нужный поле-код
    //
КонецПроцедуры
Показать
user1951539; surr; user591389_aska_rabota; CepeLLlka; +4 Ответить
7. Sonnya1909 06.02.20 09:58 Сейчас в теме
(4) Замечательная идея - благодарю.

только не
Элементы.Номенклатура.УстановитьДействие("ПриИзмененииПосле", "Расшир1_НоменклатураПриИзмененииПосле");

а
Элементы.Номенклатура.УстановитьДействие("ПриИзменении", "Расшир1_НоменклатураПриИзмененииПосле");



Из того что я начитал везде, где только можно, вот прям как я хочу - делать нельзя.
Но ваш вариант - очень хорошая альтернатива 10/10))
8. Kilka_v_Kepke 01.02.22 12:03 Сейчас в теме
(4)
имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
Выполнить(имяСтароеДействие);

словил зацикливание при таком решении. Решил дополнить

Столкнулся с проблемой что не отрабатывает добавить в расширение обработчика действия как расширение метода, нарисовал костыль

При создании на сервере:

//устанавливаем действие, при этом типовой код не отработает(без наших усилий в обработке действий)
Элементы.БанковскийСчет.УстановитьДействие("ПриИзменении", "ПИК_БанковскийСчетПриИзмененииПосле");


//Данный реквизит нужен что бы избежать зацикливания в обработке события
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("ПИК_Выполнено",Новый ОписаниеТипов("Булево"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект.ПИК_Выполнено = Ложь;



&НаКлиенте
Процедура ПИК_БанковскийСчетПриИзмененииПосле(Элемент)

имяСтароеДействие = "БанковскийСчетПриИзменении(Элемент)";
Если Не ЭтотОбъект.ПИК_Выполнено Тогда
ЭтотОбъект.ПИК_Выполнено = Истина;
Выполнить(имяСтароеДействие);
КонецЕсли;
ЭтотОбъект.ПИК_Выполнено = Ложь;

//наше действия
НастройкаВидимостиИДоступностиПриПеремещенииВ1Организации();

КонецПроцедуры
9. sidsukana 10.03.22 15:50 Сейчас в теме
Помоему простой, но не совсем очевидный вариант решения этой проблемы - добавить аннотации к вызову вашего обработчика вручную

&НаКлиенте
&После("ПриОткрытии")
Процедура СТ_ПриОткрытииПосле(Отказ)	
КонецПроцедуры


Код рабочий. На форме действие не указывал. Вызов "УстановитьДействие" тоже не делал.
10. fatman78 17 08.08.22 22:09 Сейчас в теме
(9)Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.
11. alexsey777 09.08.22 06:48 Сейчас в теме
(10)
Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.


Можно сделать так.
В обработчике расширения "ПриСозданииНаСервере" проверять, установлен ли обработчик для элемента.
Если не задан - то задаем явно.
&НаСервере
Процедура sappi_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	СобытиеОсновнойКонфигурации = Элементы.Товары.ПолучитьДействие("ПриНачалеРедактирования");
	Если ПустаяСтрока(СобытиеОсновнойКонфигурации) Тогда
		Элементы.Товары.УстановитьДействие("ПриНачалеРедактирования","sappi_ТоварыПриНачалеРедактирования");
	КонецЕсли;
КонецПроцедуры


Сам обработчик прописать таким образом.

&НаКлиенте
&После("ТоварыПриНачалеРедактирования")
Процедура sappi_ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	Если Копирование Тогда 
		ТекущиеДанные.ИдентификаторСтроки = Новый УникальныйИдентификатор;
	КонецЕсли;	
КонецПроцедуры


Если в основной конфигурации добавится обработчик - сработает перехват метода расширения.
g_b; user1951539; BBons; eeeio; +4 Ответить
12. fixin 4253 05.04.24 21:46 Сейчас в теме
что, до сих пор в платформе это не реализовали?
Оставьте свое сообщение

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