При пакетной печати первичных документов (счетов на оплату, УПД, товарных накладных ТОРГ-12, счетов-фактур) пользователи часто сталкиваются с неприятным поведением: при включении двусторонней печати второй документ из списка начинает выводиться на оборотной стороне первого документа, если тот занял всего одну страницу. В результате нарушается целостность комплектов, а распечатанные бланки приходится перепечатывать вручную. Разберем детально, почему возникает такая ситуация и какими способами ее можно устранить.
Проанализируем техническую сторону работы механизма печати пакета документов. В типовых решениях 1С для одновременного вывода нескольких печатных форм используется объект ПакетОтображаемыхДокументов и его метод Напечатать().
Поведение этого механизма менялось в зависимости от версии технологической платформы и установленного режима совместимости конфигурации:
ПакетОтображаемыхДокументов, отправлялся в спулер операционной системы как отдельное задание печати. Принтер физически начинал каждое новое задание с лицевой стороны нового листа бумаги, поэтому одностраничные документы не смешивались.В платформе 1С данное поведение было зафиксировано как официальная ошибка с кодом 10167935 («При печати объекта ПакетОтображаемыхДокументов, в случае использования двусторонней печати, разные документы печатаются на одном листе»).
Разработчиками платформы 1С ошибка была полностью устранена. Для типовых конфигураций, в которых режим совместимости отключен или установлен выше версии 8.3.8, правильным и рекомендуемым решением является обновление платформы:
Если возможность оперативно обновить платформу отсутствует (например, на рабочих местах действуют строгие корпоративные регламенты), проблему можно решить программной доработкой алгоритма формирования печатных форм. Разберем этот подход подробнее.
Суть метода заключается в том, чтобы перед помещением документа в пакет проверить общее количество страниц. Если документ содержит нечетное количество страниц, мы программно добавляем в него разрыв страницы и пустую область, превращая количество страниц в четное.
Посмотрим на пример реализации такого алгоритма:
Для Каждого ТабДок Из МассивТабличныхДокументов Цикл
// Проверяем, включена ли двусторонняя печать
Если ТабДок.ДвусторонняяПечать <> ТипДвустороннейПечати.Нет Тогда
// Получаем общее количество страниц
ВсегоСтраниц = ТабДок.КоличествоСтраниц();
// Если страниц нечетное количество, добавляем пустую страницу
Если ВсегоСтраниц % 2 <> 0 Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Выводим пустую область или пустую строку, чтобы разрыв зафиксировался
ОбластьПустая = ТабДок.ПолучитьОбласть("ПустаяСтрока");
Если ОбластьПустая <> Неопределено Тогда
ТабДок.Вывести(ОбластьПустая);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПакетДокументов.Состав.Добавить(ТабДок);
КонецЦикла;
Важное ограничение: при использовании данного метода необходимо убедиться, что в настройках драйвера принтера отключена опция пропуска пустых страниц (например, «Skip Blank Pages» или «Пропускать пустые страницы»). Если эта опция активна, процессор принтера проигнорирует пустую страницу и сдвиг документов снова повторится.
Еще один обходной путь — отказаться от объединения табличных документов через ПакетОтображаемыхДокументов и отправлять каждый сформированный ТабличныйДокумент на печать индивидуально.
Рассмотрим, как это выглядит в коде:
Для Каждого ТабДок Из МассивТабличныхДокументов Цикл
ТабДок.ИмяПринтера = ВыбранныйПринтер;
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВверх;
// Отправляем документ сразу на принтер без вывода диалогового окна
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЦикла;
При таком подходе операционная система создает отдельное задание спулера на каждый документ, что гарантирует старт печати с нового листа независимо от версии платформы. Однако следует учитывать, что при интенсивной сетевой печати в среде с большим количеством пользователей порядок вывода листов может нарушаться, если сторонние задания вклинятся в очередь между отправленными документами.
Разберем влияние драйверов на обработку очередей печати. Опыт показывает, что разные версии драйверов (PCL 6, PostScript, KX-драйверы для Kyocera) неодинаково обрабатывают логические границы внутри одного составного задания.
Если печать работает некорректно на конкретной модели принтера, выполним следующие действия: