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