При пакетной печати комплектов документов (например, накладных, счетов-фактур, спецификаций или сертификатов качества) разработчики часто сталкиваются с аппаратными ограничениями оборудования. Если отправлять каждый отдельный PDF-файл в спулер операционной системы отдельным заданием, принтер начинает зависать, буфер переполняется, а паузы между заданиями приводят к существенным задержкам. Оптимальный выход из такой ситуации — предварительно объединить все сформированные PDF-файлы в один общий многостраничный документ и отправить его на физическое устройство единым заданием печати. Разберем по шагам, как решить эту задачу в 1С с помощью утилит Bullzip, специализированных консольных инструментов и методов платформы.
В состав виртуального принтера Bullzip входит консольная утилита mergepdf.exe, предназначенная для объединения нескольких входящих документов в один результирующий файл. Синтаксис вызова утилиты требует указания пути к выходному файлу через параметр output и перечисления всех исходных файлов через вертикальную черту в параметре input.
Рассмотрим структуру команды для командной строки:
"C:\Program Files\Bullzip\PDF Printer\mergepdf.exe" output="C:\Temp\Result.pdf" input="C:\Temp\Doc1.pdf|C:\Temp\Doc2.pdf|C:\Temp\Doc3.pdf"
Для выполнения этой команды непосредственно из программного кода 1С воспользуемся процедурой ЗапуститьПриложение(). Метод принимает строку команды, рабочий каталог и параметр ожидания завершения процесса, что критически важно для последовательной обработки файлов.
При практическом использовании утилиты mergepdf возникает распространенная ошибка: если путь к файлам содержит кириллические символы или пробелы, на выходе формируется пустой или поврежденный PDF-документ. Причина заключается в том, что консольные утилиты часто некорректно обрабатывают системные кодировки строк ANSI/Windows-1251, передаваемые из сеанса Windows-приложения.
Проанализируем два надежных способа обхода этой проблемы:
PROGRA~1). Получить такой путь в 1С можно через стандартный системный объект Scripting.FileSystemObject.КаталогВременныхФайлов()), объединяются, а затем временные копии удаляются с диска.Посмотрим на пример преобразования длинного пути с кириллицей в короткий DOS-формат:
ФСО = Новый COMОбъект("Scripting.FileSystemObject");
Файл = ФСО.GetFile(ДлинныйКириллическийПуть);
КороткийПуть = Файл.ShortPath;
Если развертывание компонентов Bullzip на рабочих местах пользователей или сервере вызывает сложности, рассмотрим альтернативные легковесные консольные инструменты, доказавшие стабильность при работе из 1С:
pdftk.exe input1.pdf input2.pdf cat output result.pdf.qpdf.exe --empty --pages file1.pdf file2.pdf -- result.pdf.gswin64c.exe -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=result.pdf -dBATCH file1.pdf file2.pdf.Помимо запуска исполняемых файлов, виртуальный принтер Bullzip предоставляет собственный программный интерфейс для автоматизации процесса создания документов через COM-объект Bullzip.PDFPrinterSettings. Это позволяет динамически задавать свойства печати без вывода диалоговых окон пользователю.
Разберем пример программной настройки параметров виртуального принтера:
НастройкиBullzip = Новый COMОбъект("Bullzip.PDFPrinterSettings");
НастройкиBullzip.SetValue("Output", "C:\Temp\Combined.pdf");
НастройкиBullzip.SetValue("ShowSaveAS", "never");
НастройкиBullzip.SetValue("ShowSettings", "never");
НастройкиBullzip.SetValue("ShowPDF", "no");
НастройкиBullzip.SetValue("ConfirmOverwrite", "no");
// Параметр MergeFile позволяет указать существующий файл для добавления новых страниц
НастройкиBullzip.SetValue("MergeFile", "C:\Temp\ExistingFile.pdf");
НастройкиBullzip.WriteSettings(Истина);
Важное ограничение: объект Bullzip.PDFPrinterSettings управляет формированием PDF-файла в файловой системе, но сам по себе виртуальный принтер не может отправить итоговый бинарный PDF на реальный физический принтер для печати на бумаге.
В платформе 1С:Предприятие нет штатной команды для прямой тихой передачи готового PDF-файла в спулер Windows без открытия внешних окон. Для реализации финального шага — вывода полученного общего документа на печать — применяются внешние обработчики:
КомандаПечати = СтрШаблон("SumatraPDF.exe -print-to ""%1"" -silent ""%2""", ИмяПринтера, ПутьКФайлу);
ЗапуститьПриложение(КомандаПечати, , Истина);
-print-to-default.PDFtoPrinter.exe "ПутьКФайлу.pdf" "ИмяПринтера".AcroRd32.exe /t "Путь" "Принтер". Следует учитывать, что процесс AcroRd32.exe часто остается висеть в диспетчере задач Windows после отправки задания, что требует его принудительного завершения.Объединим подготовку файлов, вызов утилиты объединения и последующую отправку на физический принтер в единую процедуру на языке 1С:
Процедура ОбъединитьИРаспечататьPDF(МассивПутейКФайлам, ИмяВыходногоФайла, ИмяПринтера) Экспорт
// 1. Формируем строку входящих файлов
СтрокаВходящихФайлов = "";
Для Каждого ПутьКФайлу Из МассивПутейКФайлам Цикл
СтрокаВходящихФайлов = СтрокаВходящихФайлов + ?(ПустаяСтрока(СтрокаВходящихФайлов), "", "|") + ПутьКФайлу;
КонецЦикла;
// 2. Вызываем утилиту объединения mergepdf
ПутьКMergePDF = "C:\Program Files\Bullzip\PDF Printer\mergepdf.exe";
ПараметрыОбъединения = СтрШаблон("""%1"" output=""%2"" input=""%3""", ПутьКMergePDF, ИмяВыходногоФайла, СтрокаВходящихФайлов);
КодВозврата = 0;
ЗапуститьПриложение(ПараметрыОбъединения, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ВызватьИсключение "Ошибка объединения файлов через mergepdf. Код возврата: " + КодВозврата;
КонецЕсли;
// 3. Отправляем сформированный документ на печать через SumatraPDF
ПутьКSumatra = "C:\Program Files\SumatraPDF\SumatraPDF.exe";
КомандаПечати = СтрШаблон("""%1"" -print-to ""%2"" -silent ""%3""", ПутьКSumatra, ИмяПринтера, ИмяВыходногоФайла);
ЗапуститьПриложение(КомандаПечати, , Истина, КодВозврата);
КонецПроцедуры
Такой двухэтапный сценарий полностью решает проблему перегрузки очереди печати, исключает подвисания принтера и обеспечивает полностью автоматическую работу в фоновом режиме.