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