Почему в расширении 1С не работают аннотации &Перед, &После и &Вместо в модуле объекта?

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

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

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

Анализ проблемы: перехват методов в модуле объекта

Рассмотрим типовой пример. Требуется программно скорректировать параметры печатной формы типового отчета (например, «График отпусков Т-7»). Объект отчета заимствуется в расширение, и в модуле объекта создается процедура-перехватчик:


&После("ВывестиМакет")
Процедура СМУ_ВывестиМакет(ДокументРезультат, Данные)
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ДокументРезультат.АвтоМасштаб = Истина;
КонецПроцедуры

Однако при формировании отчета процедура СМУ_ВывестиМакет не вызывается. Проанализируем причину такого поведения платформы 1С:Предприятие.

Главная причина: ограничения безопасного режима расширения

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

В безопасном режиме платформа накладывает жесткие ограничения на модификацию серверного кода:

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

Пошаговое решение: отключение безопасного режима

Чтобы серверные перехватчики в модулях объектов заработали, разберем порядок действий по отключению безопасного режима:

  1. В режиме конфигуратора: перейдем в меню Конфигурация → Расширения конфигурации. В открывшемся списке расширений найдем нужное расширение, откроем палитру его свойств и снимем флажок Безопасный режим, имя профиля безопасности (или установим значение Ложь).
  2. В режиме «1С:Предприятие» (если расширение подключено в режиме пользователя): перейдем в раздел Администрирование → Печатные формы, отчеты и обработки → Расширения. В строке расширения снимем флаг Безопасный режим и перезапустим сеанс.
  3. Если на сервере 1С:Предприятия настроены профили безопасности кластера, вместо полного снятия безопасного режима необходимо указать корректное имя разрешенного профиля безопасности.

Дополнительные факторы, влияющие на работу аннотаций

Если безопасный режим отключен, но перехват метода по-прежнему не срабатывает, проверим следующие критические моменты:

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