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