Как добавить обработчик события формы в расширение с контролем?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке расширений конфигураций разработчики часто сталкиваются с ситуацией, когда типовой обработчик события формы требуется доработать точечно с сохранением контроля над изменениями в будущих релизах. Однако при попытке добавить процедуру как обработчик события вариант «Вызывать вместо (с контролем)» в мастере платформы оказывается недоступным. Выясним причину такого поведения платформы 1С и разберем правильный способ решения этой задачи.

В чем разница между обработчиком события и обычным методом

Проанализируем архитектурное устройство механизмов расширения кода в платформе 1С:Предприятие. В платформе разделены два принципиально разных уровня модификации логики:

  1. Расширение обработчика события формы. Данный механизм функционирует на уровне метаданных формы. Событие элемента управления или самого объекта формы связывается со специальной процедурой через аннотации &Перед, &После или &Вместо. Платформа управляет очередью вызовов обработчиков на уровне интерфейсного каркаса, поэтому сравнение текста процедуры с эталоном здесь изначально не заложено.
  2. Расширение обычного метода модуля. Данный механизм оперирует исключительно программным кодом. Директива &ИзменениеИКонтроль проверяет совпадение немодифицированных строк исходной процедуры с типовой конфигурацией с помощью инструкций препроцессора #Вставка и #Удаление.

Попытка вручную прописать директиву &ИзменениеИКонтроль над процедурой, которая в свойствах формы зарегистрирована именно как перехват события, приведет к конфликту логики платформы: система не сможет корректно валидировать неизменность оригинального кода при обновлении или обработает вызов некорректно.

Правильный способ: заимствование процедуры как обычного метода

Если нам необходимо точечно изменить код типового события формы и контролировать его обновление, рассмотрим пошаговый алгоритм правильной реализации:

  1. Откроем модуль формы в основной конфигурации и найдем имя нужной процедуры-обработчика (например, обработчик нажатия кнопки или изменения реквизита).
  2. Нажмем правой кнопкой мыши на имя процедуры и выберем в контекстном меню команду Изменить в расширении.
  3. В открывшемся окне выбора способа добавления обязательно выберем вариант «Как расширение обычного метода», а не вариант расширения обработчика события.
  4. В списке типов вызова выберем пункт «Вызывать вместо (с контролем)».

В модуле формы расширения платформа автоматически сгенерирует заготовку процедуры с директивой &ИзменениеИКонтроль и полным телом исходного метода. Посмотрим на пример оформления такого кода:


&Вместо("ПриСозданииНаСервере")
&ИзменениеИКонтроль("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Типовой неизменяемый код процедуры
    Элементы.ГруппаРеквизитов.Видимость = Истина;
#Вставка
    // Наша доработка в расширении
    Элементы.ДополнительноеПоле.Доступность = Ложь;
#КонецВставки
КонецПроцедуры

Будет ли процедура вызываться как событие?

Разберем, как отработает платформа при наступлении события в пользовательском режиме:

  1. Пользователь совершает действие на форме (например, форма открывается или нажимается кнопка).
  2. Событие формы инициирует вызов штатной процедуры основной конфигурации, которая назначена в свойствах формы типового решения.
  3. Так как типовая процедура перехвачена директивой &ИзменениеИКонтроль, платформа исполняет модифицированный код из модуля расширения.
  4. При установке обновлений конфигурации платформа штатно выполняет проверку применимости расширения и сигнализирует разработчику, если типовой метод изменился.

Таким образом, логика события отрабатывает штатно, а разработчик получает полноценный контроль над изменениями кода.

Важные ограничения и рекомендации

При использовании данного подхода обратим внимание на следующие правила:

  1. Не назначайте обработчик в свойствах формы внутри расширения. Если процедура уже заимствована как обычный метод с директивой контроля, нельзя вручную привязывать её в палитре свойств элементов формы в расширении. В противном случае произойдет дублирование вызова метода при возникновении события.
  2. Наличие исходного метода. Заимствовать процедуру как обычный метод с контролем можно только в том случае, если в основной конфигурации на это событие уже назначена процедура. Если событие в типовой конфигурации пустое, перехватывать нечего — в этом случае обработчик создается в расширении заново.
  3. Несколько событий на одной процедуре. Если разработчики типовой конфигурации назначили одну и ту же процедуру сразу на несколько разных элементов формы, расширить её как обработчик события платформа не позволит вовсе. В таком сценарии перехват через «обычный метод» является единственным технически возможным решением.
← На главную