К статье
Практический материал

Документы и Печать · 14 мин

Как программно распечатать документ в 1С

Как программно распечатать документ 1С: методы ТабличныйДокумент.Напечатать(), печать без предпросмотра, настройка печатных форм, типовые ошибки и примеры кода.

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

Ключевой объект любой печатной формы в 1С — табличный документ. Именно он формируется из макета, заполняется данными и затем либо показывается пользователю, либо отправляется на принтер. Понимание того, как построить этот объект и вызвать его печать, покрывает большинство прикладных сценариев.

Ниже разобраны основные способы: печать через метод Напечатать(), использование менеджера печати в типовых конфигурациях, печать без диалога и без предпросмотра, а также типичные ошибки, из-за которых документ не выводится на принтер или выводится некорректно.

Как устроена печать в 1С: табличный документ и макет

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

Макет обычно хранится в объекте метаданных (документе, справочнике, внешней обработке) и получается методом ПолучитьМакет("ИмяМакета"). Области макета извлекаются через ПолучитьОбласть("Шапка"), параметры заполняются через Параметры.НомерДокумента = ..., после чего область выводится в результирующий табличный документ методом Вывести().

Важно понимать различие двух режимов работы. Интерактивная печать — пользователь видит форму и сам жмёт «Печать». Программная печать — код формирует табличный документ и сразу отправляет его на принтер. Во втором случае вся ответственность за корректность данных, ориентацию страницы и выбор принтера ложится на разработчика.

Базовый способ: метод Напечатать() табличного документа

Самый прямой способ распечатать сформированную форму — вызвать метод Напечатать() у объекта ТабличныйДокумент. Метод принимает один параметр — режим использования диалога печати. Если передать РежимИспользованияДиалогаПечати.Использовать, пользователю будет показан стандартный диалог выбора принтера и числа копий.

Для полностью автоматической печати передаётся значение РежимИспользованияДиалогаПечати.НеИспользовать. В этом случае документ уйдёт на принтер, назначенный принтером по умолчанию в операционной системе, с настройками, заданными в самом табличном документе (ориентация, поля, масштаб, количество экземпляров).

bsl
Процедура РаспечататьДокумент(СсылкаНаДокумент) Экспорт

	ТабДок = Новый ТабличныйДокумент;

	Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати");
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
	ОбластьШапка.Параметры.ДатаДокумента = Формат(СсылкаНаДокумент.Дата, "ДЛФ=D");

	ТабДок.Вывести(ОбластьШапка);

	// Печать без диалога, на принтер по умолчанию
	ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

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

Перед вызовом печати полезно явно задать параметры страницы: ТабДок.ОриентацияСтраницы, ТабДок.АвтоМасштаб = Истина, ТабДок.ЭкземпляровНаСтранице и поля. Если этого не сделать, будут использованы настройки из макета, которые не всегда соответствуют реальному принтеру, и форма может обрезаться или разъезжаться на несколько листов.

Печать в типовых конфигурациях через менеджер печати

В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, Бухгалтерия и другие) формировать табличный документ вручную через ПолучитьМакет — плохая практика. Типовые печатные формы подключены к подсистеме «Печать», и правильный путь — вызвать менеджер печати объекта, который вернёт готовый табличный документ с учётом всех настроек, условий и дополнительных печатных форм.

Менеджер печати — это общий модуль вида Документы.РеализацияТоваровУслуг с экспортной процедурой Печать() либо функциями формирования конкретных форм. В новых версиях БСП удобно использовать программный интерфейс модуля УправлениеПечатью: он формирует коллекцию печатных форм по массиву ссылок и идентификатору макета.

bsl
// Формирование и печать типовой формы через БСП
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);

КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ТОРГ12");
ОбъектыПечати = Новый СписокЗначений;

Документы.РеализацияТоваровУслуг.Печать(
	МассивОбъектов,
	КоллекцияПечатныхФорм,
	ОбъектыПечати,
	Новый Структура);

Для Каждого ОписаниеФормы Из КоллекцияПечатныхФорм Цикл
	Если ОписаниеФормы.ТабличныйДокумент <> Неопределено Тогда
		ОписаниеФормы.ТабличныйДокумент.Напечатать(
			РежимИспользованияДиалогаПечати.НеИспользовать);
	КонецЕсли;
КонецЦикла;

Точные имена процедур и параметры зависят от версии БСП и конфигурации, поэтому перед написанием кода откройте модуль менеджера печати нужного документа и посмотрите сигнатуру процедуры Печать. Ориентируйтесь на реальный код своей конфигурации, а не на примеры из чужих версий — сигнатуры между релизами меняются.

Печать без предпросмотра и без диалога: ограничения и нюансы

Автоматическая печать без диалога работает только там, где платформа имеет доступ к принтеру. На тонком клиенте печать выполняется на стороне клиента — код формирования табличного документа должен выполняться в клиентском контексте, иначе метод Напечатать() будет недоступен или уйдёт не туда. На сервере 1С прямая печать на принтер пользователя невозможна: сервер физически не видит клиентские принтеры.

Типовой шаблон для клиент-серверного режима: серверная функция формирует и возвращает табличный документ (или его адрес во временном хранилище), а клиентская процедура получает результат и вызывает Напечатать(). Пытаться вызвать печать в серверной процедуре с директивой &НаСервере — одна из самых частых ошибок начинающих разработчиков.

В веб-клиенте ситуация сложнее: прямой доступ к принтерам ограничен браузером. Обычно печать выполняется через стандартный диалог печати браузера, и полностью «тихая» печать без участия пользователя в веб-клиенте недоступна. Если требуется автоматическая печать (например, этикеток на складе), используют тонкий клиент, отдельное клиентское приложение-агент или печать из регламентного задания на серверный принтер.

Выбор принтера и настройки страницы программно

Когда печать идёт без диалога, принтер определяется настройками операционной системы — используется принтер по умолчанию. Программно подменить принтер из встроенного языка штатными средствами нельзя: 1С не предоставляет API для перечисления и выбора принтеров. Обходные пути — назначение нужного принтера принтером по умолчанию перед печатью (скриптом ОС), либо показ диалога печати, где пользователь выберет принтер вручную.

Зато параметры самой страницы контролируются полностью. У табличного документа можно задать ориентацию, размер полей (ПолеСлева, ПолеСверху и другие, в миллиметрах), масштаб, режим разбиения на страницы, колонтитулы и число экземпляров через свойство КоличествоЭкземпляров. Эти свойства действуют и при программной печати без диалога.

Для печати на нестандартных носителях — этикетках, чековой ленте, ценниках — критично точно совместить размер страницы табличного документа с размером носителя в настройках драйвера принтера. Если высота области в макете не совпадает с высотой этикетки, принтер будет пропускать этикетки или печатать со смещением. Проверяйте настройку на реальном устройстве, а не только на экране.

Порядок действий для автоматической печати
  1. 1
    Сформируйте табличный документ: получите макет, заполните параметры, выведите области
  2. 2
    Задайте параметры страницы: ориентацию, поля, автомасштаб, число экземпляров
  3. 3
    Проверьте результат визуально, открыв табличный документ методом Показать()
  4. 4
    Вызовите Напечатать() с режимом НеИспользовать на тестовом документе
  5. 5
    Убедитесь, что на клиенте назначен правильный принтер по умолчанию
  6. 6
    Только после успешной проверки включайте печать в массовую обработку

Альтернатива печати: сохранение в файл и отправка

Не всегда документ нужно сразу выводить на бумагу. Часто практичнее сохранить печатную форму в PDF или Excel и передать дальше — по электронной почте, в ЭДО или в архив. Табличный документ поддерживает метод Записать() с указанием типа файла: ТипФайлаТабличногоДокумента.PDF, MXL, XLSX и другие.

PDF особенно удобен для автоматизации: файл можно сформировать полностью на сервере, без клиентского контекста, и затем распечатать любым внешним инструментом или отправить контрагенту. Это также снимает проблему недоступности принтеров на сервере — печать выполняет та машина, которая получила файл.

Сравнение вариантов вывода

Напечатать() с диалогом

Подходит для интерактивной работы: пользователь сам выбирает принтер и копии. Не подходит для автоматизации.

Напечатать() без диалога

Автоматическая печать на принтер по умолчанию. Требует клиентского контекста и предварительной проверки настроек.

Запись в PDF

Работает на сервере, не требует принтера. Подходит для отправки по почте, ЭДО и отложенной печати.

Показать() пользователю

Предпросмотр с возможностью ручной печати. Самый безопасный вариант для отладки новых форм.

Типичные ошибки и как их диагностировать

Наиболее частая ситуация — код выполняется без ошибок, но на принтере ничего не появляется. Причины обычно три: метод вызван в серверном контексте, где печать недоступна; табличный документ пуст, потому что области не были выведены; на клиенте не назначен или недоступен принтер по умолчанию. Диагностику начинайте с замены Напечатать() на Показать() — если форма отображается корректно, проблема в контексте выполнения или принтере, а не в данных.

Вторая группа ошибок связана с макетом: обращение к несуществующей области вызывает исключение, а незаполненные параметры выводятся пустыми строками без какого-либо предупреждения. Если в печатной форме пустые поля, проверьте имена параметров в макете — они чувствительны к регистру написания в коде только косвенно, но опечатка в имени просто не найдёт параметр.

Третья группа — проблемы разбиения на страницы. Длинные табличные части обрезаются или переносятся криво, если не вызван метод ПроверитьВывод() перед выводом очередной строки. Для документов с переменным числом строк всегда проверяйте, помещается ли очередная область на текущей странице, и при необходимости выводите горизонтальный разделитель страниц через ВывестиГоризонтальныйРазделительСтраниц().

Типичные ошибки
01
Вызов Напечатать() в серверной процедуре — печать не выполняется или падает с ошибкой, так как сервер не имеет доступа к клиентским принтерам
02
Печать пустого табличного документа — области созданы из макета, но не выведены методом Вывести(), в результате уходит пустое задание
03
Отсутствие ПроверитьВывод() для многострочных форм — строки табличной части обрезаются на границе страницы
04
Опечатки в именах параметров макета — поля выводятся пустыми без сообщения об ошибке
05
Массовая печать без теста на одном документе — десятки некорректных заданий попадают в очередь принтера

Проверка результата перед запуском в работу

Перед тем как включать программную печать в рабочий процесс, пройдите контрольный цикл: сформируйте форму, покажите её на экране, сверьте данные с документом, затем распечатайте один экземпляр и проверьте бумажный результат. Особое внимание уделите полям, заполняемым программно, — итогам, суммам прописью, штрихкодам и подписям.

Для форм со штрихкодами проверка обязательна реальным сканером: штрихкод, который выглядит корректно на экране, может не читаться из-за неподходящего шрифта, масштабирования при печати или недостаточного разрешения принтера. Отключите автомасштаб для форм со штрихкодами, если замечаете проблемы со считыванием.

Контрольные точки

Как проверить результат

Отображение формы через Показать()
Норма

Все поля заполнены, разбиение на страницы корректное

Тревожный признак

Пустые поля, обрезанные строки, лишние пустые листы

Печать одного тестового экземпляра
Норма

Задание ушло на нужный принтер, бумажная форма совпадает с экранной

Тревожный признак

Печать ушла не на тот принтер или не выполнилась вовсе

Штрихкоды и QR-коды
Норма

Сканер уверенно считывает код с распечатки

Тревожный признак

Код виден, но не читается — проблема со шрифтом или масштабом

Контекст выполнения
Норма

Напечатать() вызывается в клиентской процедуре

Тревожный признак

Вызов на сервере — ошибка или отсутствие печати

Часто задаваемые вопросы

Можно ли распечатать документ 1С на конкретном принтере, а не на принтере по умолчанию?

Штатными средствами встроенного языка — нет: 1С не предоставляет API для выбора принтера программно. Варианты обхода: показать диалог печати, где пользователь выберет принтер; назначить нужный принтер принтером по умолчанию средствами ОС перед печатью; либо сохранить форму в PDF и распечатать внешней утилитой с указанием принтера в параметрах командной строки.

Почему Напечатать() не работает в регламентном задании?

Регламентные задания выполняются на сервере, где нет доступа к принтерам пользователей и вообще к интерактивному сеансу. В этом сценарии формируйте табличный документ и сохраняйте его в PDF или MXL, а печать выполняйте отдельно — клиентским приложением или внешними средствами ОС на машине с подключённым принтером.

Как распечатать сразу несколько документов одним заданием?

Выведите печатные формы всех документов в один табличный документ, разделяя их методом ВывестиГоризонтальныйРазделительСтраниц(), и вызовите Напечатать() один раз. Это быстрее, чем отправлять каждую форму отдельным заданием, и снижает нагрузку на очередь печати.

Можно ли программно распечатать внешнюю печатную форму?

Да. Получите объект внешней обработки через ВнешниеОбработки.Создать() или справочник дополнительных отчетов и обработок в БСП, сформируйте табличный документ штатной функцией печати этой обработки и вызовите Напечатать() у результата. Учитывайте, что в безопасном режиме возможности внешней обработки могут быть ограничены.

Чем отличается печать в тонком клиенте от веб-клиента?

Тонкий клиент имеет доступ к локальным принтерам и поддерживает печать без диалога. Веб-клиент работает внутри браузера, поэтому печать возможна только через диалог печати браузера — полностью автоматическая «тихая» печать в веб-клиенте недоступна.

Как убедиться, что форма не обрежется при печати без предпросмотра?

Задайте АвтоМасштаб = Истина, чтобы форма подгонялась под ширину страницы, либо точно настройте поля и ориентацию под целевой принтер. Перед запуском автопечати обязательно протестируйте форму через Показать() и одну пробную распечатку на реальном устройстве.

Итог

Что важно запомнить

Программная печать в 1С сводится к трём шагам: сформировать табличный документ, настроить параметры страницы, вызвать Напечатать(). Печать без диалога работает только в клиентском контексте и на принтер по умолчанию; на сервере формируйте PDF. В типовых конфигурациях используйте менеджер печати, а массовую печать запускайте только после проверки на одном документе.