При разработке в среде 1С:Предприятие 8.3 использование расширений стало стандартом де-факто, позволяя кастомизировать систему, не снимая основную конфигурацию с поддержки. Однако часто программисты сталкиваются с ситуацией, когда код, добавленный в расширение (например, для изменения печатной формы), игнорируется системой. Рассмотрим подробно, почему это происходит и как заставить ваш код работать.
Представим типичную ситуацию: вам необходимо внести изменения в алгоритм формирования инвентарной карточки ОС-6 в конфигурации "Бухгалтерия предприятия 3.0". Вы создаете расширение, добавляете в него модуль менеджера справочника ОсновныеСредства и перехватываете функцию ПечатьОС6_2003 с помощью аннотации &Вместо. При запуске печати система продолжает выдавать стандартную форму, а точка останова в расширении не срабатывает. Выясним основные причины такого поведения.
Это самая частая причина "невидимости" кода расширения. По умолчанию при подключении нового расширения в режиме 1С:Предприятие для него устанавливается флаг Безопасный режим. В этом режиме платформа ограничивает выполнение кода, который может быть потенциально опасным, и часто это приводит к тому, что механизмы перехвата методов (особенно в модулях менеджера или при работе с печатными формами) блокируются.
Разберем по шагам, как отключить безопасный режим:
Важно помнить, что в некоторых случаях снятие этой галочки требует также отключения флажка Защита от опасных действий в карточке пользователя, если расширение подключается программно или через нестандартные интерфейсы.
В нашем примере указан режим совместимости 8.3.10. Механизмы расширений активно развивались от версии к версии, и в старых режимах совместимости работа с функциями и процедурами модулей менеджера имела свои нюансы. Проанализируем ситуацию: если ваша платформа позволяет, рекомендуется повышать режим совместимости до актуального (минимум 8.3.15), так как именно в поздних версиях работа аннотации &Вместо для функций стала стабильной.
Если изменить режим совместимости невозможно, убедитесь, что сигнатура функции в расширении полностью совпадает с оригиналом. Посмотрим на пример кода:
&Вместо("ПечатьОС6_2003")
Функция Расш1_ПечатьОС6_2003(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
ТабДок = Новый ТабличныйДокумент;
// Ваш уникальный алгоритм заполнения ТабДок
Возврат ТабДок;
КонецФункции
Обратите внимание: если в основной конфигурации у функции изменится количество параметров, расширение перестанет работать "молча" — вызова просто не произойдет, либо система выдаст ошибку при попытке обращения.
Конфигурация "Бухгалтерия предприятия" построена на базе БСП (Библиотеки стандартных подсистем). Подсистема печати БСП использует сложные механизмы формирования команд. Иногда список доступных печатных форм кэшируется. Проанализируем ситуацию: вы добавили код, но подсистема печати обращается к методу напрямую через метаданные, которые могли не обновиться в памяти сервера.
Чтобы исключить влияние кэша, попробуйте следующие действия:
snccntx в каталоге данных сервера).Рассмотрим подробнее использование аннотаций. Программисты часто злоупотребляют &Вместо, хотя правильнее использовать &Перед или &После. В случае с функциями печати, которые должны возвращать сформированный табличный документ, &Вместо оправдано, но требует осторожности.
Посмотрим на пример правильного перехвата с сохранением возможности вызова базового кода:
&Вместо("ПечатьОС6_2003")
Функция Расш1_ПечатьОС6_2003(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
// Если мы хотим выполнить оригинальный код, а потом что-то добавить:
Результат = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
// Модифицируем Результат (ТабличныйДокумент)
Результат.Область(1,1).Текст = "Изменено через расширение";
Возврат Результат;
КонецФункции
Использование ПродолжитьВызов позволяет избежать дублирования стандартного кода в расширении, что критически важно для будущих обновлений конфигурации.
Один из самых важных вопросов при работе с расширениями: "Как понять при обновлении, что код в расширении стал неактуальным?". В отличие от изменений в основной конфигурации, где 1С показывает сравнение/объединение, расширения могут "сломаться" незаметно.
Выясним, как минимизировать риски:
&После для добавления реквизитов на форму или &Перед для предварительных проверок.Если вы всё проверили, но вызов так и не происходит, выполните "шаманский" метод диагностики, проверенный сообществом 1С-разработчиков:
ЗаписьЖурналаРегистрации("ПроверкаРасширения", УровеньЖурналаРегистрации.Информация, , , "Я тут!");.&Вместо на &Перед, сохранитесь, а затем верните &Вместо обратно. Это заставляет платформу перестроить таблицу соответствий методов.Подводя итог, можно сказать, что в 90% случаев проблема неработающего вызова в модуле менеджера при печати связана именно с безопасным режимом. Платформа 1С бережет систему от несанкционированных вызовов, и явное разрешение администратора на выполнение кода расширения является обязательным условием стабильной работы.