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