При работе с доработанными или нетиповыми документами в конфигурациях на базе «1С:Управление торговлей 11» (или других решениях на управляемых формах) разработчики иногда сталкиваются со сбоем еще на этапе открытия формы списка документов. Платформа выдает ошибку инициализации модуля менеджера вида:
{Документ.БесплатныйАкт.МодульМенеджера(20,7)}: Переменная не определена (УправлениеПечатью)
{Документ.БесплатныйАкт.МодульМенеджера(30,2)}: Переменная не определена (ФормированиеПечатныхФорм)
Проанализируем причины возникновения этой проблемы и разберем способы ее исправления.
Разберем механизм работы платформы «1С:Предприятие 8.3». Когда приложение запускается в режиме «Толстый клиент (управляемое приложение)», компиляция модулей менеджеров объектов может происходить не только на сервере, но и на стороне клиента. Это происходит при инициализации командной панели формы, формировании стандартных команд печати или первом обращении системы к метаданным документа.
В типовых конфигурациях Библиотеки Стандартных Подсистем (БСП) такие общие модули, как УправлениеПечатью и ФормированиеПечатныхФорм, предназначены для исполнения исключительно на сервере. В их свойствах установлены флаги «Сервер» и «Внешнее соединение», но снята галочка «Клиент (управляемое приложение)».
Когда толстый клиент пытается скомпилировать код процедуры Печать в модуле менеджера документа на клиентской стороне, он «не видит» серверные общие модули и выдает синтаксическую ошибку отсутствия переменной.
Для того чтобы серверный код модуля менеджера не пытался компилироваться на клиенте, его необходимо защитить инструкциями препроцессора. Это стандартный и наиболее правильный подход при разработке под управляемое приложение.
Откроем модуль менеджера проблемного документа и обернем процедуру печати (или весь код модуля) следующим образом:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Акт_АНВИК") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"Акт_АНВИК",
НСтр("ru = 'Акт на информационные услуги'"),
ПечатьАктНаИнформационныеУслуги("Анвик_АктНаИнформационныеУслуги", МассивОбъектов),
,
"Документ.Анвик_БесплатныйАкт.Анвик_АктНаИнформационныеУслуги");
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
#КонецЕсли
Благодаря инструкции #Если Сервер... клиентский компилятор пропустит данный блок кода при инициализации модуля в толстом клиенте, и ошибка исчезнет.
Основным и штатным режимом работы для всех современных конфигураций 1С (УТ 11, ERP, КА) является Тонкий клиент. В тонком клиенте модуль менеджера всегда компилируется исключительно на сервере, поэтому обращения к серверным общим модулям УправлениеПечатью и ФормированиеПечатныхФорм проходят успешно.
Не следует включать флаг «Клиент (управляемое приложение)» в свойствах самих общих модулей УправлениеПечатью или ФормированиеПечатныхФорм. Эти модули содержат прямые запросы к базе данных и работу с метаданными, которые принципиально не могут исполняться на клиенте. Включение клиентского флага приведет к множеству других ошибок компиляции при вызове этих модулей.