Как исправить ошибку «Переменная не определена (УправлениеПечатью)» при записи документа в 1С:Бухгалтерия 3.0?

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

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

Анализ и причина возникновения ошибки

Рассмотрим ситуацию, когда при интерактивной записи нового или существующего документа на тонком клиенте платформа выдает следующую ошибку:


Ошибка инициализации модуля: Документ.ЗаявкаНаПеревозку.МодульМенеджера
по причине:
{Документ.ЗаявкаНаПеревозку.МодульМенеджера(44,7)}: Переменная не определена (УправлениеПечатью)
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПоручениеЭкспедитору") Тогда

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

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

Решение проблемы: обрамление кода директивами препроцессора

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

  1. Откроем модуль менеджера созданного документа (например, Документ.ЗаявкаНаПеревозку.МодульМенеджера).
  2. Найдем процедуры и функции, отвечающие за печать макетов и работу с подсистемой печати (процедуры Печать, ДобавитьКомандыПечати и вспомогательные серверные функции).
  3. Обернем соответствующий блок кода в директиву препроцессора:

#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ВнешнееСоединение Тогда

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПоручениеЭкспедитору") Тогда
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "ПоручениеЭкспедитору",
            "Поручение экспедитору",
            СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати));
    КонецЕсли;

КонецПроцедуры

#КонецЕсли

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

Дополнительные рекомендации по работе с подсистемой печати

Посмотрим на важные нюансы, которые следует учитывать при интеграции печатных форм в БСП:

Разделение клиентского и серверного вызова: Если требуется вызвать методы печати непосредственно в модуле формы или клиентском модуле, используйте специализированный модуль УправлениеПечатьКлиент (например, метод УправлениеПечатьКлиент.ВыполнитьКомандуПечати), так как серверный модуль УправлениеПечатью на клиенте недоступен.

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

← На главную