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

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

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

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

Причина проблемы: ограничения безопасного режима

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

Если попытаться применить аннотацию к серверному общему модулю в безопасном режиме, платформа регистрирует системную ошибку вида: Ошибка расширения модуля 'ОбщийМодуль.ИмяМодуля.Модуль': расширение модуля запрещено из-за того, что расширение подключено в безопасном режиме. В режиме предприятия эта ошибка часто отображается лишь в виде кратковременного всплывающего оповещения или в журнале регистрации, из-за чего её легко не заметить.

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

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

Способ 1. Через конфигуратор

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Перейдем в главное меню: Конфигурация — Расширения конфигурации.
  3. В открывшемся списке найдем наше расширение.
  4. В строке расширения снимем флажок в колонке Безопасный режим (а также при необходимости флажок Защита от опасных действий).
  5. Сохраним изменения.

Способ 2. В режиме «1С:Предприятие»

  1. Откроем программу в режиме «1С:Предприятие» с правами администратора.
  2. Перейдем в раздел НСИ и администрирование (или Администрирование) — Печатные формы, отчеты и обработки — Расширения.
  3. Выделим нужное расширение и нажмем кнопку изменения или снимем флажок Безопасный режим непосредственно в списке.
  4. Перезапустим сеанс «1С:Предприятия», чтобы обновить кэш и применить новые параметры подключения модулей.

Правильный выбор аннотации: почему &После предпочтительнее &Вместо

Рассмотрим код добавления объектов в процедуру переопределяемого модуля печати. Часто разработчики ошибочно используют директиву &Вместо:


&Вместо("ПриОпределенииОбъектовСКомандамиПечати")
Процедура РасшПечать_ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    СписокОбъектов.Добавить(Документы.РеализацияТоваровУслуг);
    СписокОбъектов.Добавить(Документы.АктВыполненныхРабот);
КонецПроцедуры

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

Для процедур-наполнителей коллекций и списков всегда безопаснее использовать директиву &После. Код выполняется следом за типовым алгоритмом, органично дополняя исходный массив:


&После("ПриОпределенииОбъектовСКомандамиПечати")
Процедура РасшПечать_ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    СписокОбъектов.Добавить(Документы.РеализацияТоваровУслуг);
    СписокОбъектов.Добавить(Документы.АктВыполненныхРабот);
КонецПроцедуры

Обязательные требования подсистемы печати

После снятия безопасного режима и корректного подключения общего модуля важно убедиться, что подключаемые объекты готовы к взаимодействию с подсистемой печати БСП:

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