Как в 1С настроить автоматическую печать двух страниц на альбомном листе с двух сторон?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При организации фоновой или пакетной печати документов часто возникает задача вывести макет с четко заданными параметрами: две копии или две страницы книжной ориентации на одном альбомном листе (2-up), с автоматическим дуплексом и разбором по копиям. При этом печать должна производиться без показа диалога пользователю.

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

В чем причина некорректного вывода страниц через свойства ТабличныйДокумент

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


ТабДок.ИмяПринтера = "HP LaserJet";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ЭкземпляровНаСтранице = 2;
ТабДок.КоличествоЭкземпляров = 2;
ТабДок.РазборПоКопиям = Истина;
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Напечатать();

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

Выясним причину такого поведения. Свойство ЭкземпляровНаСтранице в 1С работает по внутреннему алгоритму виртуального деления физического листа. Платформа делит лист на равные прямоугольные зоны без сопутствующего поворота содержимого на 90 градусов (в отличие от полноценного драйверного режима N-up). Кроме того, при вызове метода Напечатать() без отображения диалога 1С переопределяет системную структуру параметров печати Windows (DEVMODE) собственными свойствами табличного документа, принудительно сбрасывая тонкие настройки компоновки драйвера.

Рассмотрим проверенные способы решения этой проблемы.

Способ 1. Создание выделенного принтера в Windows с предустановленными параметрами

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

Разберем по шагам, как настроить систему:

  1. В операционной системе добавьте еще один логический принтер, указывающий на то же самое физическое устройство или сетевой порт. Назовите его понятным образом, например: HP_LaserJet_2up_Duplex.
  2. Откройте свойства созданного принтера, перейдите на вкладку «Дополнительно» и нажмите кнопку «Умолчания...» (Printing Defaults). Также проверьте настройки на вкладке «Общие» в разделе «Настройка печати».
  3. В настройках драйвера задайте целевые параметры: ориентация бумаги — Альбомная (Landscape), компоновка страниц — 2 страницы на лист, двусторонняя печать — Включена.
  4. В коде 1С сформируйте табличный документ как обычные полноразмерные страницы книжной ориентации. Свойство ЭкземпляровНаСтранице при этом указывать не нужно (оно должно оставаться равным 1), чтобы 1С не вмешивалась в компоновку.

Посмотрим на пример кода 1С при использовании настроенного принтера:


ТабДок.ИмяПринтера = "HP_LaserJet_2up_Duplex";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.КоличествоЭкземпляров = 2;
ТабДок.РазборПоКопиям = Истина;
// ЭкземпляровНаСтранице не устанавливаем!
ТабДок.Напечатать();

В этом сценарии 1С передает в спулер печати стандартный поток книжных страниц формата А4, а драйвер принтера самостоятельно масштабирует их, разворачивает и размещает по две штуки на каждом альбомном листе.

Способ 2. Параллельный вывод областей макета средствами 1С

Если печать выполняется на клиентских машинах, где нет возможности администрировать системные принтеры, скомпонуйте две копии документа непосредственно в макете 1С.

Рассмотрим логику формирования такого документа:

  1. Задайте для табличного документа альбомную ориентацию: ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.
  2. В макете печатной формы подготовьте область, рассчитанную ровно на половину альбомного листа.
  3. При выводе строк используйте связку методов Вывести() (для левой части листа) и Присоединить() (для правой части листа).

Посмотрим, как выглядит программное заполнение:


ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;

Для Каждого СтрДанных Из ТаблицаДокументов Цикл
    // Выводим левую половину листа
    ТабДок.Вывести(ОбластьДокумента);
    
    // Присоединяем правую половину листа (вторую копию)
    ТабДок.Присоединить(ОбластьДокумента);
КонецЦикла;

ТабДок.КоличествоЭкземпляров = 1;
ТабДок.Напечатать();

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

Способ 3. Экспорт в PDF с отправкой через внешнюю утилиту

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

Разберем алгоритм реализации:

  1. Сохраните сформированный табличный документ во временный каталог:
    
    ИмяФайла = КаталогВременныхФайлов() + "print_job.pdf";
    ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
    
  2. С помощью метода ЗапуститьПриложение() передайте сформированный PDF-файл сторонней утилите печати, указав необходимые аргументы командной строки (режим компоновки 2-up, дуплекс и количество копий).

Важный нюанс двусторонней печати при альбомной компоновке

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

Если при альбомной ориентации задать переворот по широкой стороне, оборотная сторона листа выйдет перевернутой вверх ногами. Поэтому при настройке дуплекса для альбомных листов выбирайте переворот по короткому краю листа (Short Edge Binding).

← На главную