Проблема игнорирования количества экземпляров при печати документов — это одна из самых «древних» и неприятных особенностей работы платформы 1С:Предприятие на операционных системах семейства Linux. В течение многих лет системные администраторы и разработчики сталкивались с ситуацией, когда при отправке задания на печать напрямую с сервера (например, в фоновом задании или при использовании регламентной печати этикеток), принтер упорно выдавал только одну копию, независимо от настроек в 1С. В этой статье мы подробно разберем, как обстоят дела с этой ошибкой в новых релизах и какие существуют проверенные способы её обхода для тех, кто пока не планирует обновление.
Для начала давайте разберем, почему эта проблема вообще возникает. В ОС Windows печать организована через графическую подсистему GDI или XPS, где 1С передает параметры печати драйверу принтера довольно прозрачно. В Linux за печать отвечает подсистема CUPS (Common Unix Printing System). При формировании задания 1С должна передать в очередь CUPS специфический атрибут copies. Долгое время в реализации серверной части платформы под Linux этот параметр передавался некорректно или вовсе игнорировался подсистемой генерации табличного документа. Ситуация осложнялась тем, что при печати через предварительный просмотр на Windows-клиенте всё работало отлично, так как обработкой количества копий занимался локальный диспетчер печати Windows.
Хорошая новость заключается в том, что фирма 1С официально заявила об исправлении этой ошибки в ветке платформы 8.3.26. В частности, была исправлена ошибка с кодом 10214643. Суть изменений сводится к следующему:
КоличествоЭкземпляров в атрибуты задания CUPS.Если ваша инфраструктура позволяет, переход на версию 8.3.26 и выше является самым правильным и «чистым» решением проблемы. Однако перед обновлением обязательно проверьте совместимость ваших драйверов принтеров с новой версией платформы, так как требования к библиотекам OpenSSL и графическому окружению в последних релизах стали значительно строже.
Если вы используете платформы версий 8.3.24, 8.3.25 или более ранние, и обновление в ближайшее время невозможно, разберем наиболее распространенный метод решения — использование программного цикла в коде 1С. Вместо того чтобы указывать количество копий в параметрах печати, мы вызываем метод Напечатать() столько раз, сколько нам нужно экземпляров.
Рассмотрим пример кода, который позволяет реализовать этот подход универсально:
// Предположим, у нас есть ТабличныйДокумент, который нужно распечатать
КоличествоКопий = ТабличныйДокумент.КоличествоЭкземпляров;
// Сбрасываем количество экземпляров в 1, чтобы сама платформа не пыталась их множить
ТабличныйДокумент.КоличествоЭкземпляров = 1;
// Запускаем цикл по количеству нужных копий
Для Сч = 1 По КоличествоКопий Цикл
// Метод Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать)
// отправляет задание напрямую на принтер, установленный по умолчанию или в параметрах
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЦикла;
Важный нюанс: Этот способ создает в очереди печати CUPS столько отдельных заданий, сколько копий вы заказали. Если принтер сетевой и на него одновременно печатают несколько человек, ваши копии могут «перемешаться» с чужими документами. Это главный минус данного метода.
Более продвинутый метод, который часто используют системные администраторы и опытные разработчики — это выгрузка документа во временный PDF-файл и последующая его отправка в очередь печати Linux через консольную утилиту lpr. Этот способ позволяет передать параметр количества копий на уровне самой операционной системы, минуя возможные баги платформы 1С.
Давайте разберем по шагам, как это реализовать:
-# (количество копий).ЗапуститьПриложение.Пример программной реализации:
// 1. Формируем путь к временному файлу
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
// 2. Определяем имя принтера (можно получить через lpstat -p -d в консоли)
ИмяПринтера = "HP_LaserJet_400";
Копий = ТабличныйДокумент.КоличествоЭкземпляров;
// 3. Формируем строку команды
// -P указывает принтер, -# указывает количество экземпляров
СтрокаКоманды = "lpr -P " + ИмяПринтера + " -# " + Формат(Копий, "ЧГ=0") + " " + ИмяФайла;
// 4. Запускаем выполнение на сервере
ЗапуститьПриложение(СтрокаКоманды, , Истина); // Истина - ждать завершения
Этот метод считается более надежным для высоконагруженной печати, так как CUPS воспринимает это как единое задание с указанным количеством копий, и принтер отработает их последовательно, не разделяя на отдельные листы.
Проанализируем ситуацию, когда даже после обновления или применения скриптов печать работает нестабильно. Выясним причины, которые могут мешать корректной работе:
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт (или Портрет) непосредственно перед печатью.rphost (обычно это пользователь usr1cv8), должен иметь права на выполнение команд печати и доступ к временным папкам.Подводя итог, можно сказать, что проблема с количеством экземпляров на Linux в 1С наконец-то получила официальное решение в 26-й платформе. Мы рекомендуем по возможности обновиться до этого релиза, чтобы избавиться от лишнего кода в конфигурации. Если же обновление невозможно, используйте метод с lpr для критически важных документов или простой цикл Для...КонецЦикла для несложных задач. Помните, что стабильность печати в Linux на 50% зависит от корректности настройки самой службы CUPS и качества PPD-драйвера принтера.