При разработке расширений для 1С:Предприятие программисты часто сталкиваются с ситуацией, когда добавленный функционал (например, новые печатные формы) идеально работает в Тонком клиенте, но вызывает фатальные ошибки при запуске системы в режиме Толстого клиента. Самая распространенная ошибка в этом случае звучит так: «Ошибка инициализации модуля: Документ.ИмяДокумента.МодульМенеджера», а в расшифровке указывается, что некая переменная (часто это имя общего модуля) не определена. Давайте вместе разберем, почему это происходит и как правильно адаптировать код расширения для стабильной работы во всех режимах.
Для начала проанализируем ситуацию. В системе 1С существует фундаментальное различие в том, как компилируются модули менеджеров объектов в разных клиентских приложениях. Рассмотрим это подробнее:
Клиент (толстый клиент), компилятор на стороне клиента выдаст ошибку: Переменная не определена.В нашем случае проблема возникла с модулем ФормированиеПечатныхФорм. Этот модуль является частью Библиотеки стандартных подсистем (БСП). Разработчики БСП намеренно отключают у таких модулей доступность для толстого клиента в целях оптимизации и безопасности, оставляя только флаги Сервер и Внешнее соединение. В результате, когда ваше расширение «подмешивает» код в модуль менеджера, толстый клиент спотыкается о неизвестное ему имя модуля.
Самый правильный и надежный способ — это использование директив препроцессора. Мы должны явно указать платформе, какие участки кода следует компилировать только на сервере, игнорируя их при компиляции клиентской части в толстом клиенте. Посмотрим на пример кода, который вызывает ошибку:
// Ошибочный код в расширении
КолонкаКодов = ФормированиеПечатныхФорм.ИмяДополнительнойКолонки();
Для исправления ситуации нам необходимо обернуть этот вызов в инструкцию #Если Сервер Тогда. Это заставит компилятор толстого клиента «пропустить» эту строку при проверке на стороне клиента. Рассмотрим правильный вариант реализации:
&НаСервере
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
#Если Сервер Тогда
// Этот код увидит только серверный компилятор
КолонкаКодов = ФормированиеПечатныхФорм.ИмяДополнительнойКолонки();
#КонецЕсли
// Продолжение логики...
КонецПроцедуры
Важно понимать разницу между аннотацией &НаСервере и инструкцией #Если Сервер. Аннотация управляет тем, где будет исполняться процедура, а инструкция препроцессора управляет тем, попадет ли код в конкретный программный блок при компиляции. В толстом клиенте для модулей менеджера важны оба этих механизма.
Проанализируем типовой модуль менеджера того документа, который вы расширяете (например, ПеремещениеТоваров). Если вы посмотрите на начало типового модуля, вы наверняка увидите там инструкции препроцессора, которые ограничивают область видимости всего кода модуля.
При создании расширения крайне важно соблюдать ту же структуру. Если типовой метод обернут в #Если Сервер Или ТолстыйКлиентОбычноеПриложение..., то и ваш метод в расширении должен следовать этой логике. Если вы просто добавляете метод без обертки, вы создаете «дыру» в архитектуре, через которую толстый клиент пытается прочитать серверные объекты.
Многие разработчики жалуются, что отладчик не останавливается на строке с ошибкой и просто выдает сообщение о сбое инициализации. Выясним причину этого поведения. Данная ошибка является ошибкой компиляции, а не ошибкой времени выполнения (runtime error).
Система 1С не может даже начать выполнять код вашего расширения, потому что она не может построить исполняемый файл модуля — для нее обращение к ФормированиеПечатныхФорм выглядит как синтаксическая ошибка (использование необъявленной переменной). Чтобы диагностировать такие проблемы заранее, рекомендуется использовать встроенную проверку конфигурации (меню «Конфигурация» — «Проверка конфигурации»), обязательно установив флажок Толстый клиент в параметрах проверки.
При работе с печатными формами в расширениях стоит придерживаться следующих правил:
Сервер и вызывать его.Назначение вашего расширения. Для печатных форм обычно выбирают Адаптация или Дополнение. Если установлено Исправление, система может вести себя более строго при проверке контекстов.Подведем итог: если вы столкнулись с ошибкой инициализации модуля менеджера в Толстом клиенте, первым делом проверьте наличие всех обращений к общим модулям и оберните их в инструкции #Если Сервер Тогда ... #КонецЕсли. Это обеспечит корректную работу вашего расширения независимо от того, какой клиент использует конечный пользователь.