Платформа: 1С:Предприятие 8.3 (8.3.12.1790)

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

По идеи должно быть что-то вроде этого

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

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

Заранее, спасибо.
---
Попробуйте так:
1. оставляете

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

2. Вашу процедуру пишете так:

```1c
    Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)

    имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
    Выполнить(имяСтароеДействие);
    // Выполнение кода после
    сюда вписываете нужный поле-код
    //
    КонецПроцедуры
```
---
А так и не будет работать. Что за объект - Номенклатура?

Вот как у меня например работает

```1c
    СообщениеКлиенту = Элементы.Вставить("СообщениеКлиенту", Тип("ПолеФормы"), СтраницаИзвещения);
    СообщениеКлиенту.Вид = ВидПоляФормы.ПолеФлажка;
    СообщениеКлиенту.ПутьКДанным = "Объект.ОтправленоСообщениеКлиенту";
    СообщениеКлиенту.УстановитьДействие("ПриИзменении", "ПриИзмененииСообщениеКлиенту");
```
---
Элементы.Номенклатура это поле ввода.

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

Грубо говоря: что мне с этим кодом нужно сделать чтобы 1с поняла, что процедуру нужно выполнять именно после соответствующего события на форме основной конфигурации.

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

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

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

Мне нужно во-первых понять можно ли такое делать в принципе? Мне нужно делать такие дополнительные обработчики к элементам формы основной конфигурации, но я не хочу замещать стандартную процедуру своей.
---
Попробуйте так:
1. оставляете

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

2. Вашу процедуру пишете так:

```1c
    Процедура Расшир1_НоменклатураПриИзмененииПосле(Элемент)

    имяСтароеДействие = "НоменклатураПриИзменении(Элемент)";
    Выполнить(имяСтароеДействие);
    // Выполнение кода после
    сюда вписываете нужный поле-код
    //
    КонецПроцедуры
```
---
Замечательная идея - благодарю.

только не

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

а

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

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

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

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

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

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

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

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

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

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

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

Код рабочий. На форме действие не указывал. Вызов "УстановитьДействие" тоже не делал.
---
Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.
---
Это работает через аннотацию, только если в основной конфигурации существует процедура для перехватываемого в расширении действия. Проблема для существующих только в расширении (созданных программно) действий возникнет, если после очередного обновления появится "оригинальное "действие в основной конфигурации, а мы его переопределили в расширении програмно.

Можно сделать так.
В обработчике расширения "ПриСозданииНаСервере" проверять, установлен ли обработчик для элемента.
Если не задан - то задаем явно.

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

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

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

Если в основной конфигурации добавится обработчик - сработает перехват метода расширения.
---
Я хочу использовать не процедуру формы где установлен обработчик, а например процедуру формы владельца? или общего модуля? можно такое провернуть как нибудь?
---
Нет
---
что, до сих пор в платформе это не реализовали?