При организации фоновой или пакетной печати документов часто возникает задача вывести макет с четко заданными параметрами: две копии или две страницы книжной ориентации на одном альбомном листе (2-up), с автоматическим дуплексом и разбором по копиям. При этом печать должна производиться без показа диалога пользователю.
Однако при попытке решить эту задачу программно через свойства объекта ТабличныйДокумент разработчики регулярно сталкиваются с неожиданным поведением компоновки листа. Разберем детально, почему так происходит и какие существуют надежные способы обойти ограничения платформы.
Проанализируем типовую попытку программной настройки параметров печати перед вызовом метода Напечатать():
ТабДок.ИмяПринтера = "HP LaserJet";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ЭкземпляровНаСтранице = 2;
ТабДок.КоличествоЭкземпляров = 2;
ТабДок.РазборПоКопиям = Истина;
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Напечатать();
При выполнении этого кода на печать выходит лист в портретной ориентации, на котором две страницы сплющены и расположены вертикально одна под другой. Если же изменить ориентацию листа на ОриентацияСтраницы.Ландшафт, страницы также переворачиваются боком, но не встают рядом в нормальном книжном виде.
Выясним причину такого поведения. Свойство ЭкземпляровНаСтранице в 1С работает по внутреннему алгоритму виртуального деления физического листа. Платформа делит лист на равные прямоугольные зоны без сопутствующего поворота содержимого на 90 градусов (в отличие от полноценного драйверного режима N-up). Кроме того, при вызове метода Напечатать() без отображения диалога 1С переопределяет системную структуру параметров печати Windows (DEVMODE) собственными свойствами табличного документа, принудительно сбрасывая тонкие настройки компоновки драйвера.
Рассмотрим проверенные способы решения этой проблемы.
Это наиболее надежный и простой подход, который не требует переделки печатных форм и подключения внешних библиотек. Идея заключается в том, чтобы перенести задачу поворота и масштабирования страниц на сам драйвер печати.
Разберем по шагам, как настроить систему:
ЭкземпляровНаСтранице при этом указывать не нужно (оно должно оставаться равным 1), чтобы 1С не вмешивалась в компоновку.Посмотрим на пример кода 1С при использовании настроенного принтера:
ТабДок.ИмяПринтера = "HP_LaserJet_2up_Duplex";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.КоличествоЭкземпляров = 2;
ТабДок.РазборПоКопиям = Истина;
// ЭкземпляровНаСтранице не устанавливаем!
ТабДок.Напечатать();
В этом сценарии 1С передает в спулер печати стандартный поток книжных страниц формата А4, а драйвер принтера самостоятельно масштабирует их, разворачивает и размещает по две штуки на каждом альбомном листе.
Если печать выполняется на клиентских машинах, где нет возможности администрировать системные принтеры, скомпонуйте две копии документа непосредственно в макете 1С.
Рассмотрим логику формирования такого документа:
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.Вывести() (для левой части листа) и Присоединить() (для правой части листа).Посмотрим, как выглядит программное заполнение:
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;
Для Каждого СтрДанных Из ТаблицаДокументов Цикл
// Выводим левую половину листа
ТабДок.Вывести(ОбластьДокумента);
// Присоединяем правую половину листа (вторую копию)
ТабДок.Присоединить(ОбластьДокумента);
КонецЦикла;
ТабДок.КоличествоЭкземпляров = 1;
ТабДок.Напечатать();
Такой подход полностью исключает зависимость от драйверов принтера и гарантирует одинаковый результат на любых рабочих станциях.
Еще один практичный вариант для полной автоматизации — сохранение готового табличного документа в промежуточный PDF-файл с последующей отправкой на печать внешней консольной утилитой или виртуальным PDF-принтером (например, PDFCreator).
Разберем алгоритм реализации:
ИмяФайла = КаталогВременныхФайлов() + "print_job.pdf";
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ЗапуститьПриложение() передайте сформированный PDF-файл сторонней утилите печати, указав необходимые аргументы командной строки (режим компоновки 2-up, дуплекс и количество копий).Обратите внимание: когда две книжные страницы размещаются на одном альбомном листе, меняется геометрия смены сторон бумаги. Переворот по длинному краю книжной страницы физически превращается в переворот по короткому краю альбомного листа.
Если при альбомной ориентации задать переворот по широкой стороне, оборотная сторона листа выйдет перевернутой вверх ногами. Поэтому при настройке дуплекса для альбомных листов выбирайте переворот по короткому краю листа (Short Edge Binding).