При автоматизации печати печатных форм часто возникает необходимость вывести несколько макетов в рамках одного процесса: например, первую и вторую страницу отпечатать на отдельных листах (односторонне), а последующие документы выдать на одном листе с двух сторон. Рассмотрим, с какими ограничениями можно столкнуться при решении этой задачи в разных версиях платформы 1С:Предприятие и какими способами можно реализовать требуемую логику.
Проанализируем механику работы 1С с принтером. Когда мы вызываем метод Напечатать() для каждого отдельного объекта ТабличныйДокумент, платформа формирует в очереди операционной системы самостоятельные независимые задания на печать. Реализовать двустороннюю печать между абсолютно разными заданиями невозможно технически, так как принтер воспринимает каждое задание как отдельный физический документ.
В платформе 1С:Предприятие 8.1 отсутствуют встроенные программные свойства для управления двусторонней печатью прямо из кода. Управление этим режимом полностью передается драйверу устройства. Однако существуют проверенные обходные пути для платформы 8.1, а также штатные механизмы, появившиеся в современных версиях платформы 8.3.
Это классический и самый надежный вариант для платформы 1С 8.1 и более ранних версий. Суть метода заключается в том, чтобы создать в операционной системе Windows два виртуальных устройства печати, указывающих на один и тот же физический принтер (по одному IP-адресу или локальному порту).
Разберем по шагам, как настроить такую схему:
HP_SingleSide и HP_Duplex.HP_SingleSide устанавливаем параметр двусторонней печати в положение Выкл (односторонняя печать).HP_Duplex включаем двустороннюю печать (переворот по длинной или короткой стороне).ИмяПринтера.Рассмотрим пример кода 1С:
// Печать первого документа на одностороннем принтере
ТабДок1 = Новый ТабличныйДокумент;
Макет1 = ПолучитьМакет("МакетОдин");
ТабДок1.Вывести(Макет1);
ТабДок1.ИмяПринтера = "HP_SingleSide";
ТабДок1.Напечатать();
// Печать второго и третьего документов на двустороннем принтере
ТабДокДвусторонний = Новый ТабличныйДокумент;
Макет2 = ПолучитьМакет("МакетДва");
Макет3 = ПолучитьМакет("МакетТри");
ТабДокДвусторонний.Вывести(Макет2);
ТабДокДвусторонний.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокДвусторонний.Вывести(Макет3);
ТабДокДвусторонний.ИмяПринтера = "HP_Duplex";
ТабДокДвусторонний.Напечатать();
Обратите внимание: для того чтобы документы, отправленные на двусторонний принтер, действительно отпечатались на двух стороны одного листа, их необходимо объединять в один ТабличныйДокумент с использованием метода ВывестиГоризонтальныйРазделительСтраниц().
Если принтер по умолчанию настроен на двусторонний режим, но часть страниц нужно отпечатать только с одной стороны, можно применить подход с добавлением пустых страниц.
Выясним, как работает данный метод:
ТабличныйДокумент.Начиная с платформы 8.3, у объекта ТабличныйДокумент появилось свойство ДвусторонняяПечать. Оно позволяет управлять режимом печати напрямую из кода 1С без создания дублирующих принтеров в ОС.
Свойство принимает значения системного перечисления ТипДвустороннейПечати:
ТипДвустороннейПечати.ПереворотВлево — двусторонняя печать с переворотом по длинной стороне страницы.ТипДвустороннейПечати.ПереворотВверх — двусторонняя печать с переворотом по короткой стороне страницы.ТипДвустороннейПечати.Нет — принудительная односторонняя печать.ТипДвустороннейПечати.Авто — использование настроек драйвера по умолчанию.Посмотрим на пример кода для 1С 8.3:
// Односторонний документ
ТабДокОдносторонний = Новый ТабличныйДокумент;
// Вывод области макета...
ТабДокОдносторонний.ДвусторонняяПечать = ТипДвустороннейПечати.Нет;
ТабДокОдносторонний.Напечатать();
// Двусторонний документ
ТабДокДвусторонний = Новый ТабличныйДокумент;
// Вывод нескольких страниц с разделителями...
ТабДокДвусторонний.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДокДвусторонний.Напечатать();
Важный нюанс: если в коде используется свойство КлючПараметровПечати, платформа автоматически восстанавливает ранее сохраненные пользовательские настройки печати. Чтобы программная установка двусторонней печати сработала корректно, присваивать значение свойству ДвусторонняяПечать необходимо строго после задания КлючПараметровПечати.
ТабДок.КлючПараметровПечати = "ПараметрыПечати_МояФорма";
// Устанавливаем режим ДвусторонняяПечать ПОСЛЕ ключа
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
Если драйвер конкретного устройства игнорирует команды управления двусторонней печатью из 1С 8.3, рекомендуется обновить драйвер принтера или использовать универсальный драйвер (Universal Print Driver PCL/PostScript).