Почему не работает перехват процедуры ПриСозданииНаСервере в расширении 1С и как его настроить?

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

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

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

В чем причина: отличие процедур модуля от событий формы

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

Если мы просто заимствуем форму в расширение и пишем в ее модуле код вида:


&Вместо("ПриСозданииНаСервере")
&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Наш код расширения
КонецПроцедуры

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

Способ 1. Назначение обработчика через палитру свойств заимствованной формы

Рассмотрим основной и наиболее наглядный способ подключения расширяющего обработчика события формы. Выполним следующие шаги:

  1. Добавим необходимый объект (например, регистр сведений или документ) и его форму в расширение конфигурации через контекстное меню Добавить в расширение.
  2. Откроем форму в дереве расширения и перейдем на корневой элемент в дереве элементов формы (саму форму).
  3. Откроем окно Свойства формы (нажав клавишу F4 или через контекстное меню).
  4. Найдем в списке событий нужное системное событие, например ПриСозданииНаСервере.
  5. Нажмем на кнопку с лупой (или кнопку выбора) напротив события. Конфигуратор предложит варианты создания обработчика в расширении: Вызывать перед, Вызывать после или Вызывать вместо.
  6. Выберем требуемый режим вызова (например, Вызывать вместо).
  7. Платформа автоматически сгенерирует в модуле формы расширения правильную сигнатуру процедуры с нужными директивами компиляции и зарегистрирует привязку события к форме.

После этого сгенерированная процедура гарантированно получит управление при открытии формы пользователем.

Способ 2. Добавление перехвата из модуля исходной формы

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

  1. Откроем модуль формы в основной конфигурации.
  2. Найдем заголовок процедуры, например: Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка).
  3. Нажмем правой кнопкой мыши на имя процедуры и выберем пункт Добавить в расширение.
  4. В появившемся диалоговом окне выберем расширение и способ расширения метода: Перед, После или Вместо.
  5. Если платформа выдаст предупреждение о том, что метод является обработчиком события, подтвердим создание расширения именно для обработчика события.

В модуле формы расширения появится корректно аннотированный метод с зарегистрированной связью.

Правильное использование аннотации &Вместо и вызов штатного кода

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


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

КонецПроцедуры

Если разделение логики до и после типового кода является единственной целью доработки, безопаснее использовать раздельные обработчики &Перед или &После. Это снижает риски возникновения ошибок при последующих обновлениях типовой конфигурации.

Дополнительные технические нюансы и частые ошибки

Проанализируем сопутствующие факторы, из-за которых расширение формы может вести себя некорректно:

  1. Совпадение директив компиляции. Директива расширяющего метода (&НаСервере, &НаКлиенте, &НаСервереБезКонтекста) должна строго совпадать с директивой исходного метода в типовой конфигурации.
  2. Количество и порядок параметров. Сигнатура процедуры в расширении обязана в точности повторять параметры оригинального метода.
  3. Автогенерируемые формы. Если у объекта метаданных (например, регистра сведений) в основной конфигурации форма записи не была физически создана разработчиком, а генерируется платформой на лету по умолчанию, перехватывать в ней нечего. В таком случае форму необходимо сначала создать в расширении или переопределить через событие ОбработкаПолученияФормы в модуле менеджера объекта.
  4. Безопасный режим и режим совместимости. Проверьте свойства расширения в дереве метаданных. Несоответствие режима совместимости расширения режиму совместимости основной конфигурации может приводить к сбоям выполнения аннотаций. Если для расширения включен Безопасный режим, серверные вызовы привилегированного кода могут блокироваться.
  5. Кэширование модулей. При отладке и динамическом обновлении расширений клиентское приложение может использовать кэшированную версию модуля формы. Для проверки работы рекомендуется перезапустить сеанс «1С:Предприятия» или очистить кэш.
← На главную