Проанализируем довольно специфичную, но крайне неприятную проблему, с которой сталкиваются пользователи классической платформы 1С 7.7 при переходе на более современные серверные операционные системы, начиная с Windows Server 2008 R2. Суть проблемы заключается в следующем: при отправке на печать документа в нескольких экземплярах (копиях) с включенной двусторонней печатью (дуплексом), принтер печатает первую страницу документа на обеих сторонах первого листа, вторую страницу — на обеих сторонах второго листа и так далее. Функция «Разобрать по копиям» банально перестает работать.
Разберем подробнее, почему так происходит и как мы можем эту ситуацию исправить.
Корень проблемы кроется во взаимодействии устаревшего механизма печати 1С 7.7 (которая является 16/32-битным приложением с очень старыми API-вызовами) со спулером (диспетчером печати) современных 64-битных ОС Windows. При печати из старых программ спулер либо не видит флаг Collate (Разобрать по копиям), который передает 1С, либо принудительно сбрасывает его в ложное значение.
Из-за этого листы уходят на печать в последовательности «1-1, 2-2, 3-3», а не «1-2-3, 1-2-3». При включенном дуплексе принтер честно выполняет свою задачу: берет первые две страницы из очереди (а это страница 1 и копия страницы 1) и печатает их на двух сторонах одного физического листа.
Посмотрим на варианты решения данной проблемы. Мы разберем как программные методы, так и административные хитрости.
Это самый надежный способ для программистов. Мы можем перехватить диалог печати с помощью популярных внешних компонент (таких как FormEx и Йоксель / tabledoc.dll) и принудительно установить параметр разбора по копиям без вызова стандартного, "глючного" окна печати 1С.
Рассмотрим пример кода. Сначала нам необходимо загрузить компоненты при старте системы:
Процедура ПриНачалеРаботыСистемы()
// Загружаем необходимые библиотеки
ЗагрузитьВнешнююКомпоненту("formex.dll");
ЗагрузитьВнешнююКомпоненту("tabledoc.dll");
КонецПроцедуры
Далее перехватываем глобальное событие печати таблицы и устанавливаем свойство Collate в единицу (истина):
Процедура ПриПечатиТаблицы(Таблица, ФлагПредпросмотра, Заголовок, ИмяПринтера)
// Создаем объект Йокселя
Менеджер = СоздатьОбъект("МенеджерТабличногоДокумента");
Менеджер.УстановитьТаблицу(Таблица);
// Получаем доступ к параметрам страницы и принудительно включаем разбор по копиям
ПараметрыСтраницы = Менеджер.ПараметрыСтраницы;
ПараметрыСтраницы.Collate = 1;
КонецПроцедуры
Таким образом, мы обходим стандартный диалог 1С, который портит настройки, и напрямую передаем драйверу принтера правильную команду разбора.
Если нет возможности использовать внешние компоненты, проанализируем другой вариант в коде: можно запустить цикл и отправлять документ на печать ровно столько раз, сколько нам нужно копий, при этом указывая количество копий равным единице.
Для к = 1 по КоличествоКопий Цикл
Таб.Напечатать(0);
КонецЦикла;
Важный нюанс: у этого метода есть побочные эффекты. После первого вызова метода Напечатать() без предварительного показа (Показать()), объект табличного документа часто очищается ("превращается в тыкву"). Также, если использовать перехватчик событий печати, этот код может уйти в бесконечный цикл. Этот вариант стоит использовать с осторожностью, перерабатывая логику вывода макета внутри цикла.
Разберем вариант для системных администраторов, который не требует изменения программного кода конфигурации 1С. Поскольку проблема возникает именно в момент передачи параметров из диалогового окна 1С в ОС, мы можем жестко зафиксировать эти настройки на уровне самой Windows.
Printer_Normal и Printer_Duplex.Printer_Duplex в самой ОС (Панель управления) и жестко установим в настройках по умолчанию двустороннюю печать и разбор по копиям.Таб.ПараметрыСтраницы(), передавая имя специально настроенного принтера. Принтер сам "подхватит" свои железные настройки из ОС.Еще один популярный и эффективный обходной путь. Мы можем настроить печать всех документов из 1С на виртуальный принтер (например, PDFCreator). 1С формирует обычный односторонний PDF-файл и сохраняет его в папку.
Далее с помощью скриптов (или настроек самого виртуального принтера) полученный PDF-файл автоматически отправляется на физический принтер. Поскольку печать инициируется уже современным приложением (обработчиком PDF), а не старой платформой 1С 7.7, разбор по копиям и дуплекс отрабатывают абсолютно корректно.
Посмотрим на проблему со стороны драйверов. Проблема часто усугубляется современными универсальными драйверами PCL 6. 1С передает драйверу устаревшие структуры данных, драйвер берет тиражирование страниц на себя, но не учитывает разбор по копиям.
Во многих случаях помогает установка классических базовых драйверов PCL 5 или PostScript (PS) для вашей модели принтера. С этими драйверами старый механизм печати Windows взаимодействует гораздо более стабильно.