При автоматизации складской логистики и маркировки товаров программисты 1С часто сталкиваются с неприятной особенностью встроенного механизма сохранения табличных документов в формат PDF. Проблема заключается в том, что 1С принудительно прописывает в метаданных файла параметр /PickTrayByPDFSize (в интерфейсе Adobe Reader он отображается как «Выбирать источник бумаги по размеру страницы PDF») в значение true.
Для обычных офисных документов это может быть полезно, но при печати этикеток на специализированных принтерах (Zebra, Xprinter, TSC, Godex) этот флаг заставляет драйвер игнорировать настройки размера носителя, установленные в системе. В результате изображение этикетки может разворачиваться на 90 градусов, масштабироваться с искажениями или печататься со смещением. В этой статье мы подробно разберем, как победить эту особенность и добиться корректной печати.
Давайте проанализируем ситуацию: почему стандартные настройки ТабличныйДокумент в 1С не помогают? Параметры страницы, такие как масштаб, ориентация или размер бумаги, которые мы задаем в коде 1С, влияют на визуальное содержимое PDF, но не на словарь ViewerPreferences внутри структуры самого файла. Флаг /PickTrayByPDFSize прописывается «движком» 1С по умолчанию. Когда консольная утилита для печати (например, Foxit Reader или Adobe Acrobat через командную строку) отправляет такой файл на принтер, драйвер видит команду: «Забудь о настройках лотка в Windows, ищи бумагу, которая точно совпадает с размером PDF». Из-за микроскопических расхождений в миллиметрах драйвер принтера этикеток решает, что оптимально будет развернуть страницу, что и портит результат.
Одним из самых надежных способов решения задачи является постобработка готового PDF-файла консольной утилитой Ghostscript. Это мощный инструмент, который позволяет пересобрать PDF, очистив его от мешающих параметров. Рассмотрим подробнее, как это реализовать.
Для начала нам необходимо скачать и установить Ghostscript (для Windows обычно используется версия gswin64c.exe). Процесс взаимодействия будет выглядеть так: 1С сохраняет этикетку во временный файл, затем вызывается Ghostscript, который создает «чистую» копию PDF, и уже этот новый файл отправляется на печать.
Разберем по шагам команду для фоновой обработки файла:
// Пример формирования командной строки для Ghostscript
КомандаЗапуска = """C:\Program Files\gs\gs9.50\bin\gswin64c.exe"" "
+ "-sOutputFile=""C:\Temp\output.pdf"" "
+ "-sDEVICE=pdfwrite "
+ "-dBATCH "
+ "-dNOPAUSE "
+ "C:\Temp\input.pdf";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Проанализируем используемые ключи:
-sOutputFile — путь к новому, исправленному файлу.-sDEVICE=pdfwrite — указывает, что на выходе мы хотим получить снова PDF.-dBATCH — завершить работу после обработки всех файлов (не оставлять окно программы открытым).-dNOPAUSE — отключает паузы между страницами, что критично для автоматической фоновой печати.В результате такой «перегонки» Ghostscript создает PDF, в котором параметры ViewerPreferences будут установлены в значения по умолчанию, что позволит драйверу принтера корректно обработать размер страницы.
Как было замечено в обсуждении, при печати через виртуальный принтер Microsoft Print to PDF параметр «Бумага по размеру страницы» устанавливается в значение «Нет» автоматически. Однако у этого способа есть существенный минус — диалоговое окно с запросом имени файла. Чтобы обойти это ограничение в 1С, можно программно настроить порт принтера или использовать специализированные библиотеки. Но, как показывает практика, этот путь сложнее в реализации для серверных решений, чем использование Ghostscript.
Иногда проблему можно решить, не изменяя сам PDF, а настроив «Hardware Override» в самой операционной системе. Разберем, на что стоит обратить внимание системному администратору:
ТабличныйДокумент масштаб установлен в 100%, а не в «По ширине страницы». Даже если визуально это выглядит одинаково, для PDF-контейнера это создает разные записи о границах документа.Если Ghostscript кажется вам слишком тяжеловесным (он действительно занимает немало места), можно воспользоваться утилитой QPDF. Она позволяет модифицировать структуру PDF без полной пересборки.
С помощью QPDF можно «разжать» (uncompress) PDF-файл, превратив его в текстовый вид, после чего простым поиском и заменой строки /PickTrayByPDFSize true на /PickTrayByPDFSize false (с помощью скрипта на Python или даже средствами 1С через ТекстовыйДокумент) изменить поведение файла. Затем файл можно сжать обратно или оставить как есть — большинство программ для чтения PDF поймут его.
Для того чтобы сделать процесс печати максимально надежным, мы рекомендуем следующий алгоритм в коде 1С:
// 1. Формируем этикетку
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табдока ...
ТабДок.АвтоМасштаб = Ложь;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
// 2. Сохраняем во временный PDF
ВременныйПуть = КаталогВременныхФайлов() + "label_raw.pdf";
ТабДок.Записать(ВременныйПуть, ТипФайлаТабличногоДокумента.PDF);
// 3. Обрабатываем через Ghostscript (исправляем флаг PickTrayByPDFSize)
ПутьИсправленный = КаталогВременныхФайлов() + "label_final.pdf";
КомандаGS = СтрШаблон("""%1"" -sOutputFile=""%2"" -sDEVICE=pdfwrite -dBATCH -dNOPAUSE ""%3""",
ПутьКГхостскрипту, ПутьИсправленный, ВременныйПуть);
ЗапуститьПриложение(КомандаGS, , Истина);
// 4. Отправляем на печать через консольную утилиту (например, SumatraPDF или Foxit)
КомандаПечати = СтрШаблон("""%1"" -print-to ""%2"" ""%3""",
ПутьКПринтеруPDF, ИмяПринтераЭтикеток, ПутьИсправленный);
ЗапуститьПриложение(КомандаПечати, , Истина);
Такой подход гарантирует, что на принтер попадет документ, который не будет пытаться «умничать» и перенастраивать лотки бумаги. Это сэкономит время и километры испорченной ленты этикеток.
Подводя итог, можно сказать, что борьба с PDF в 1С при печати этикеток — это задача, требующая выхода за рамки встроенных средств платформы. Использование связки 1С + Ghostscript на данный момент является наиболее стабильным «костылем», который успешно применяется в крупных торговых сетях и на производствах.