Механизм расширений конфигурации в платформе 1С:Предприятие 8.3 позволяет модифицировать поведение типовых конфигураций без снятия их с поддержки. Однако разработчики нередко сталкиваются с ситуацией, когда процедура заимствована, аннотация &Перед, &После или &Вместо прописана корректно, но при выполнении кода управление в расширяющий метод не передается. Разберем по шагам причины такого поведения и способы решения проблемы.
Одной из наиболее частых причин игнорирования или некорректной работы методов расширений является активность безопасного режима. Если для расширения установлен флаг Безопасный режим (или задан профиль безопасности), платформа может блокировать выполнение определенных вызовов, операций с файловой системой, внешними компонентами или привилегированными процедурами.
Рассмотрим, как отключить безопасный режим:
Для корректного связывания перехватываемого метода и метода расширения директива компиляции в расширении должна соответствовать контексту исходной процедуры. Если в исходном модуле метод выполняется на клиенте или на сервере, в модуле расширения необходимо явно указать соответствующую директиву перед аннотацией перехвата.
Посмотрим на пример правильного оформления:
&НаСервере
&Перед("ЗаписатьПриоритетныеИзмененияВСообщениеОбмена")
Процедура ЕР_ЗаписатьПриоритетныеИзмененияВСообщениеОбмена(Знач ЗаписьСообщения)
// Собственный код до вызова основного метода
Сообщить("Выполняется код расширения перед записью изменений");
КонецПроцедуры
Если оригинальная процедура расположена в контексте клиента, используем директиву &НаКлиенте:
&НаКлиенте
&Перед("ОбработкаКоманды")
Процедура ЕР_ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// Логика расширения на клиенте
КонецПроцедуры
Проанализируем ограничения платформы, связанные с версиями режима совместимости конфигурации:
&Перед, &После и &Вместо могут перехватывать только экспортные процедуры (объявленные с ключевым словом Экспорт). Перехват неэкспортных локальных методов модуля стал доступен только начиная с версии платформы 8.3.14. Если в режиме 8.3.10 процедура не является экспортной, аннотация не сработает.&Перед и &После применимы исключительно к процедурам. Для перехвата функций необходимо использовать аннотацию &Вместо с возвратом значения либо директиву #ИзменениеИКонтроль (доступную начиная с версии 8.3.15).Знач в методе расширения должны в точности повторять заголовок исходной процедуры. Любое расхождение в объявлении сигнатуры приведет к ошибке связывания или пропуску вызова.Выясним особенности работы платформы с различными типами модулей:
ПриСозданииНаСервере или ПриОткрытии), перехват в расширении задается через Палитру свойств расширенной формы выбором соответствующего типа перехвата (Перед, После, Вместо), а не только ручным написанием аннотации в коде.