Как отключить параметр «Бумага по размеру страницы» при печати этикеток из PDF в 1С

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При автоматизации складской логистики и маркировки товаров программисты 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». Из-за микроскопических расхождений в миллиметрах драйвер принтера этикеток решает, что оптимально будет развернуть страницу, что и портит результат.

Решение проблемы с помощью Ghostscript

Одним из самых надежных способов решения задачи является постобработка готового 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";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Проанализируем используемые ключи:

  1. -sOutputFile — путь к новому, исправленному файлу.
  2. -sDEVICE=pdfwrite — указывает, что на выходе мы хотим получить снова PDF.
  3. -dBATCH — завершить работу после обработки всех файлов (не оставлять окно программы открытым).
  4. -dNOPAUSE — отключает паузы между страницами, что критично для автоматической фоновой печати.

В результате такой «перегонки» Ghostscript создает PDF, в котором параметры ViewerPreferences будут установлены в значения по умолчанию, что позволит драйверу принтера корректно обработать размер страницы.

Альтернативный вариант: Использование Microsoft Print to PDF

Как было замечено в обсуждении, при печати через виртуальный принтер Microsoft Print to PDF параметр «Бумага по размеру страницы» устанавливается в значение «Нет» автоматически. Однако у этого способа есть существенный минус — диалоговое окно с запросом имени файла. Чтобы обойти это ограничение в 1С, можно программно настроить порт принтера или использовать специализированные библиотеки. Но, как показывает практика, этот путь сложнее в реализации для серверных решений, чем использование Ghostscript.

Тонкая настройка драйверов принтера

Иногда проблему можно решить, не изменяя сам PDF, а настроив «Hardware Override» в самой операционной системе. Разберем, на что стоит обратить внимание системному администратору:

  1. Драйверы от Seagull Scientific: Если вы используете принтеры Zebra, TSC или Datamax, попробуйте установить драйверы от компании Seagull Scientific. Они часто более корректно игнорируют команды масштабирования из PDF, чем «родные» драйверы производителей.
  2. Параметры страницы в драйвере: Зайдите в «Устройства и принтеры» -> «Настройка печати» вашего принтера этикеток. На вкладке «Параметры страницы» найдите настройку «Использовать настройки приложения» и попробуйте переключить её в режим «Использовать настройки принтера».
  3. Масштабирование: Убедитесь, что в 1С в объекте ТабличныйДокумент масштаб установлен в 100%, а не в «По ширине страницы». Даже если визуально это выглядит одинаково, для PDF-контейнера это создает разные записи о границах документа.

Продвинутый метод: Модификация PDF через QPDF

Если 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 на данный момент является наиболее стабильным «костылем», который успешно применяется в крупных торговых сетях и на производствах.

← На главную