При автоматизации складских и учетных процессов часто возникает задача автоматической печати этикеток, наклеек или накладных в формате PDF без участия пользователя — по расписанию через регламентное задание или в фоновом потоке. При этом разработчики часто сталкиваются с ситуацией, когда интерактивный запуск кода на клиенте успешно отправляет документ на принтер, но при выполнении того же кода на стороне сервера печать не происходит или процесс 1С намертво зависает.
Разберем детально, почему стандартный вызов программ просмотра PDF дает сбой на сервере 1С, и рассмотрим проверенные способы реализации надежной серверной печати.
Проанализируем системные факторы, которые блокируют фоновую печать из серверного контекста 1С:
rphost.exe) функционирует в неинтерактивной системной сессии Windows. Программы с графическим интерфейсом (такие как Adobe Acrobat Reader) при запуске в этой сессии не могут инициализировать окна и зависают в ожидании закрытия диалогов лицензии, обновления или подтверждения параметров печати, отобразить которые операционная система не может.USR1CV8 или SYSTEM). У этой учетной записи отсутствует загруженный пользовательский профиль, нет доступа к подключенным сетевым принтерам конкретного пользователя и часто отсутствуют права на сетевые очереди.print /d:... выполняет прямую передачу байтов в порт (raw print). Если принтер не оснащен встроенным аппаратным интерпретатором PostScript или Direct PDF, он напечатает испорченный текст либо выдаст пустые листы.Выясним, как обойти ограничения графической оболочки. Для этого вместо тяжелых офисных программ применим легковесные консольные утилиты (CLI), специально разработанные для работы в фоновом режиме без открытия окон (silent mode).
Наиболее популярными и надежными решениями являются утилиты SumatraPDF и PDFtoPrinter. Рассмотрим пример вызова утилиты SumatraPDF из серверного кода 1С:
Процедура ПечатьPDFНаСервере(ПутьКФайлу, ИмяПринтера) Экспорт
// Путь к консольной утилите на сервере
ПутьКУтилите = "C:\Tools\SumatraPDF\SumatraPDF.exe";
// Формируем параметры тихой печати на указанный принтер
// Параметр -print-settings позволяет управлять масштабированием (например, "noscale" для этикеток или "fit")
ПараметрыЗапуска = СтрШаблон("-print-to ""%1"" -silent -print-settings ""noscale"" ""%2""", ИмяПринтера, ПутьКФайлу);
СтрокаКоманды = СтрШаблон("""%1"" %2", ПутьКУтилите, ПараметрыЗапуска);
WshShell = Новый COMОбъект("WScript.Shell");
КодВозврата = WshShell.Run(СтрокаКоманды, 0, Истина);
Если КодВозврата <> 0 Тогда
ЗаписьЖурналаРегистрации("Печать PDF", УровеньЖурналаРегистрации.Ошибка,,,
СтрШаблон("Ошибка печати файла %1. Код возврата: %2", ПутьКФайлу, КодВозврата));
КонецЕсли;
КонецПроцедуры
Если принтер печатает этикетку формата A6 на стандартном листе A4 или сбивает границы, необходимо правильно сконфигурировать системные параметры печати на самом сервере 1С:
\\Сервер\Принтер привязаны к пользовательской сессии. На сервере 1С принтер должен быть установлен как локальный с созданием стандартного порта Standard TCP/IP Port. Это гарантирует доступность очереди печати учетной записи USR1CV8.USR1CV8 права «Печать» и «Управление документами».В случаях, когда политика безопасности запрещает установку сторонних утилит и драйверов на сервер приложений 1С, применим паттерн с разделением формирования и вывода на печать:
Записать()) и сохраняет его во временную таблицу базы данных или сетевой каталог со статусом «К печати».