При разработке расширений конфигурации в платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда перехват стандартных процедур модулей объектов или общих команд через аннотацию &Вместо отрабатывает без проблем, а перехват событий управляемых форм (например, ПриСозданииНаСервере или ПриОткрытии) игнорируется платформой. При открытии формы в режиме «1С:Предприятие» продолжает выполняться штатный код основной конфигурации, а метод из расширения даже не вызывается.
Разберем детально, почему так происходит, в чем принципиальная разница между перехватом процедур модулей и событий формы, и как правильно реализовать расширение логики управляемой формы.
Проанализируем механику работы управляемых форм в платформе 1С:Предприятие. В отличие от обычных экспортных процедур общих модулей или модулей менеджера, системные события формы (ПриСозданииНаСервере, ПриЧтенииНаСервере, ПриОткрытии и др.) вызываются платформой не просто по совпадению текстового имени в модуле, а на основании жесткой привязки события в палитре свойств формы к конкретному обработчику.
Если мы просто заимствуем форму в расширение и пишем в ее модуле код вида:
&Вместо("ПриСозданииНаСервере")
&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Наш код расширения
КонецПроцедуры
Платформа может не связать данный метод с событием формы, если в свойствах заимствованной формы в расширении не определен соответствующий обработчик события, либо если в исходной конфигурации обработчик для этого события не был явно назначен в палитре свойств (событие не было переопределено разработчиком типового решения).
Рассмотрим основной и наиболее наглядный способ подключения расширяющего обработчика события формы. Выполним следующие шаги:
ПриСозданииНаСервере.После этого сгенерированная процедура гарантированно получит управление при открытии формы пользователем.
Разберем альтернативный способ, который удобно использовать, если в основной конфигурации обработчик события уже существует и содержит типовой код:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка).В модуле формы расширения появится корректно аннотированный метод с зарегистрированной связью.
Посмотрим на пример правильного переопределения метода с сохранением типового функционала. Если мы полностью заменим процедуру аннотацией &Вместо, стандартный код конфигурации выполняться не будет. Чтобы выполнить типовую логику и дополнить ее своими проверками, необходимо использовать оператор ПродолжитьВызов():
&Вместо("ПриСозданииНаСервере")
&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Код, выполняемый ДО типового алгоритма
// Например, инициализация параметров или предварительная проверка прав
// 2. Вызов штатного обработчика из основной конфигурации
ПродолжитьВызов(Отказ, СтандартнаяОбработка);
// 3. Код, выполняемый ПОСЛЕ типового алгоритма
// Например, настройка видимости элементов формы
Если Не Отказ Тогда
Элементы.Реквизит1.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Если разделение логики до и после типового кода является единственной целью доработки, безопаснее использовать раздельные обработчики &Перед или &После. Это снижает риски возникновения ошибок при последующих обновлениях типовой конфигурации.
Проанализируем сопутствующие факторы, из-за которых расширение формы может вести себя некорректно:
&НаСервере, &НаКлиенте, &НаСервереБезКонтекста) должна строго совпадать с директивой исходного метода в типовой конфигурации.ОбработкаПолученияФормы в модуле менеджера объекта.