Разработка и Конфигурация · 11 мин
Как вывести макет на печать в 1С 8.3 программно
Пошаговая инструкция по программному выводу табличного документа на печать в 1С 8.3: макеты, области, параметры, ТабДок.Показать и Печать без диалога.
Программный вывод макета на печать в 1С 8.3 строится на объекте «Табличный документ» (ТабличныйДокумент). Разработчик получает макет, последовательно выводит его области в табличный документ, заполняет параметры, а затем либо показывает результат пользователю, либо отправляет на принтер в фоновом режиме. Этот механизм одинаково работает и в управляемых, и в обычных формах.
Типовой сценарий состоит из пяти шагов: получить макет через ПолучитьМакет(), получить область методом ПолучитьОбласть(), заполнить параметры области, вывести область методом Вывести() и завершить работу вызовом Показать() или Напечатать(). Ниже разобран каждый шаг с примерами кода и типичными ошибками.
Создание макета и подготовка табличного документа
Макет — это шаблон печатной формы, который хранится в конфигурации. Его можно добавить в объект метаданных (справочник, документ, отчёт) через кнопку «Макеты» в палитре свойств или создать общий макет в ветке «Общие → Макеты». Для печатных форм используется тип макета «Табличный документ».
Внутри макета выделяют именованные области: «Шапка», «СтрокаТовары», «Подвал» и т.д. Область выделяется по строкам или по столбцам, а имя задаётся в свойствах выделенного диапазона. В ячейках области указывают либо фиксированный текст, либо параметры в фигурных скобках — например {НомерДокумента}, которые заполняются из кода.
В коде работа начинается с создания табличного документа и получения макета:
ТабДок = Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");
Для общих макетов вызов выглядит иначе: ПолучитьОбщийМакет("ИмяМакета"). Если макет хранится в менеджере печати объекта, получение выполняется через УправлениеПечатью.МакетПечатнойФормы() в конфигурациях на БСП.
Получение областей и заполнение параметров
Область макета получают методом ПолучитьОбласть("ИмяОбласти"). Результат — тоже табличный документ, у которого есть коллекция Параметры. Каждому параметру, объявленному в ячейках макета, присваивают значение по имени:
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = НомерДок;
ОбластьШапка.Параметры.ДатаДокумента = Формат(ДатаДок, "ДЛФ=D");
ТабДок.Вывести(ОбластьШапка);
Если параметр не заполнить, в готовой печатной форме он выведется как пустая строка — ошибки не возникнет, но документ будет неполным. Поэтому перед выводом полезно проверять обязательные реквизиты и сообщать пользователю, каких данных не хватает.
Для табличных частей область строки выводится в цикле. Каждая итерация заполняет параметры текущей строки и добавляет область в итоговый документ:
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовары");
Для Каждого СтрокаТЧ Из Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Метод Параметры.Заполнить() удобен, когда имена параметров совпадают с именами колонок выборки или табличной части — он переносит значения автоматически.
Вывод документа пользователю: предпросмотр и печать
Когда все области выведены, табличный документ показывают пользователю методом Показать("Заголовок") — откроется окно предпросмотра, из которого документ можно напечатать, сохранить или отредактировать. Это самый безопасный вариант: пользователь видит результат до отправки на принтер.
Для печати без предпросмотра используется метод Напечатать(). Ему можно передать параметр РежимИспользованияДиалогаПечати.НеИспользовать — тогда документ сразу уйдёт на принтер по умолчанию:
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Перед печатью задают служебные свойства документа: ОриентацияСтраницы (книжная или альбомная), АвтоМасштаб, КоличествоЭкземпляров, ИмяПринтера. Эти свойства позволяют управлять выводом без участия пользователя, что важно для автоматических рассылок и пакетной печати.
ТабДок = Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("МакетПечати");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.НомерДокумента = НомерДок;
ТабДок.Вывести(Область);
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.Показать("Печатная форма");Печать из управляемой формы и через менеджер печати
В управляемых формах табличный документ нельзя просто показать модально — вместо Показать() применяют открытие формы с реквизитом типа «ТабличныйДокумент» либо стандартную команду печати. В конфигурациях на Библиотеке стандартных подсистем печатные формы регистрируются в модуле менеджера печати объекта процедурой ДобавитьКомандыПечати.
Механизм БСП работает так: в модуле менеджера объекта описывается процедура Печать, которая по идентификатору команды формирует табличный документ и помещает его в коллекцию печатных форм. Платформа сама показывает пользователю окно предпросмотра с кнопками печати и сохранения.
Для простых доработок без БСП достаточно кнопки на форме, в обработчике которой формируется табличный документ и вызывается Показать() на клиенте. Важно помнить: получение макета и запросы к данным выполняются на сервере, поэтому формирование документа выносят в серверную процедуру, а результат возвращают на клиент для отображения.
- 1Создайте макет типа «Табличный документ» и разметьте именованные области
- 2В серверной процедуре создайте объект ТабличныйДокумент и получите макет
- 3Получите области, заполните параметры и выведите их в нужном порядке
- 4Установите ориентацию, масштаб и другие свойства печати
- 5Вызовите Показать() для предпросмотра или Напечатать() для вывода на принтер
- 6Проверьте результат на тестовом документе с реальными данными
Разрывы страниц, повтор шапки и проверка помещаемости
Длинные таблицы требуют управления разбиением на страницы. Метод ПроверитьВывод(МассивОбластей) возвращает Истина, если указанные области помещаются на текущей странице. Если нет — вызывают ВывестиГоризонтальныйРазделительСтраниц() и повторно выводят шапку таблицы.
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтрока);
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок.Вывести(ОбластьШапкаТаблицы);
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
Альтернатива — свойство макета «Повторять при печати» для строк заголовка таблицы: тогда платформа сама повторит шапку на каждой странице. Этот вариант проще, но менее гибок, когда шапку нужно дополнять номером страницы или промежуточными итогами.
Сохранение в файл и альтернативы печати
Не всегда нужен физический принтер: часто печатную форму требуется сохранить или отправить. Метод Записать() сохраняет табличный документ в форматах MXL, PDF, Excel, HTML и других:
ТабДок.Записать("C:\\Temp\\Счет.pdf", ТипФайлаТабличногоДокумента.PDF);
Такой подход используют для автоматической отправки документов по электронной почте, выгрузки в ЭДО и архивирования. При сохранении в PDF учитывайте, что шрифты и масштаб должны быть заданы до записи — иначе документ может разбиваться на страницы иначе, чем в предпросмотре.
Для массовой печати нескольких документов формируют один общий табличный документ, разделяя формы разрывами страниц, либо выводят каждый документ отдельным вызовом Напечатать() в цикле. Второй вариант корректнее, когда у документов разные настройки ориентации или принтеры.
Проверка результата и типичные проблемы
После формирования печатной формы проверьте: заполнены ли все параметры, не разорваны ли строки таблицы между страницами, корректно ли выведены итоги в подвале. Быстрый способ — открыть предпросмотр и пролистать документ целиком.
Если область не выводится, чаще всего имя области в коде не совпадает с именем в макете (учитывайте регистр и пробелы). Если документ выводится пустым — проверьте, что вызов Вывести() действительно выполняется, а не пропущен условием. Ошибку «Метод объекта не обнаружен» при печати из управляемой формы обычно вызывает попытка выполнить серверный метод на клиенте.
Как проверить результат
В предпросмотре нет пустых мест на месте данных
Пустые ячейки там, где должны быть номер, дата, суммы
Строки не разорваны, шапка повторяется на каждой странице
Строка разрезана пополам или шапка есть только на первой странице
Документ выходит на нужном принтере в одном экземпляре
Печать идёт на другой принтер или задание дублируется
Что важно запомнить
Программная печать в 1С 8.3 — это цепочка: макет → области → параметры → ТабличныйДокумент → Показать() или Напечатать(). Формирование выполняйте на сервере, для длинных таблиц используйте ПроверитьВывод, а пакетную печать без диалога обязательно тестируйте на малом объёме.
Частые вопросы
Как напечатать документ без открытия предпросмотра?
Вызовите метод ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать). Документ уйдёт на принтер по умолчанию. Чтобы указать конкретный принтер, заранее установите свойство ИмяПринтера табличного документа.
Почему ПолучитьМакет выдаёт ошибку в управляемой форме?
Получение макета доступно только на сервере. Перенесите формирование табличного документа в серверную процедуру (директива &НаСервере) и верните готовый табличный документ на клиент для отображения.
Как вывести одну и ту же область несколько раз?
Получите область один раз через ПолучитьОбласть() и вызывайте ТабДок.Вывести(Область) в цикле, каждый раз заново заполняя параметры. Повторно получать область из макета не требуется.
Можно ли заполнить параметры области из структуры?
Да. Метод Область.Параметры.Заполнить(Структура) переносит значения по совпадающим ключам. Это удобно, когда данные собраны из разных источников в одну структуру.
Как сохранить печатную форму в PDF программно?
Используйте ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF). На сервере убедитесь, что у процесса есть права на запись в указанный каталог, а путь формируйте через временные файлы.
Чем Показать() отличается от Напечатать()?
Показать() открывает окно предпросмотра, где пользователь сам решает, печатать ли документ. Напечатать() сразу отправляет документ в очередь печати — с диалогом выбора принтера или без него, в зависимости от параметра.