Как ускорить сохранение большого количества этикеток с кодами маркировки в PDF в 1С:УНФ?

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

При работе с маркированным товаром в программе 1С:Управление нашей фирмой часто возникает задача массовой отправки кодов маркировки изготовителю или на контрактное производство. При объемах в 2000–3000 этикеток типовой механизм вывода через табличный документ и стандартную кнопку сохранения в файл .pdf начинает работать крайне медленно или приводит к зависанию сеанса пользователя. Разберем причины такого поведения платформы и рассмотрим эффективные варианты решения этой проблемы.

Выясним причины медленной работы

Проанализируем, почему типовой механизм печати испытывает сильные перегрузки при формировании многостраничных файлов:

  1. Обработка тысяч графических объектов. Каждый код маркировки DataMatrix в макете ТабличныйДокумент представляет собой отдельный графический объект высокой четкости. При формировании документа на несколько тысяч страниц платформа вынуждена хранить в оперативной памяти и последовательно преобразовывать тысячи изображений в векторные потоки PDF, что резко увеличивает нагрузку на клиентское приложение.
  2. Ограничения тонкого клиента. Сохранение из типовой формы предварительного просмотра печати выполняется на стороне клиента. В 32-разрядных приложениях это гарантированно приводит к исчерпанию адресного пространства памяти и критическим задержкам из-за частой работы сборщика мусора.
  3. Сложная динамическая пагинация. Использование режима «Замостить» заставляет платформу рассчитывать границы печати, разрывы страниц и взаимное выравнивание ячеек для каждой отдельной этикетки строго последовательно в один поток.
  4. Отрисовка в интерфейсе. Попытка загрузить и отобразить гигантский документ в окне предпросмотра создает колоссальную нагрузку на графическую подсистему интерфейса еще до момента нажатия кнопки сохранения.

Решение 1. Формирование в фоновых заданиях и объединение через утилиту qpdf

Рассмотрим технический подход, позволяющий задействовать серверные мощности и распараллелить генерацию страниц. Вместо создания одного огромного табличного документа на клиенте мы разбиваем массив этикеток на пачки и генерируем фрагменты PDF на сервере через фоновые задания.

Разберем алгоритм по шагам:

  1. Разбиваем массив кодов маркировки на порции (например, по 200–500 штук).
  2. Запускаем несколько фоновых потоков с помощью механизма ФоновыеЗадания.Выполнить().
  3. Каждое фоновое задание формирует свой компактный ТабличныйДокумент и сохраняет его во временный файл вызовом метода Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF).
  4. После завершения всех потоков собираем полученные файлы в один общий многостраничный PDF с помощью консольной утилиты qpdf, выполнив команду операционной системы через ЗапуститьПриложение().

Посмотрим на пример серверного кода запуска фонового задания для генерации части этикеток:


ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ПакетКодовМаркировки);
ПараметрыЗадания.Добавить(ПутьКФайлуЧасти);

Задание = ФоновыеЗадания.Выполнить("МойОбщийМодуль.СформироватьПакетЭтикетокВPDF", 
    ПараметрыЗадания, 
    , 
    "Генерация пакета этикеток PDF");

После формирования всех частей объединяем их консольной утилитой:


КомандаСборки = СтрШаблон("qpdf --empty --pages %1/*.pdf -- %2", КаталогВременныхФайлов, РезультирующийФайлPDF);
ЗапуститьПриложение(КомандаСборки, , Истина);

Решение 2. Оптимизация бизнес-процесса предварительного просмотра

Часто пользователи настаивают на открытии табличного документа перед печатью исключительно для того, чтобы визуально проконтролировать корректность расположения полей. Просмотр 3000 одинаковых этикеток человеком физически невозможен и не имеет практического смысла.

Разберем, как перестроить интерфейсный сценарий:

  1. Предпросмотр только образца. В форму печати выводим только первые 1–3 этикетки для визуального контроля оператором. Это происходит мгновенно.
  2. Серверная выгрузка всего объема. По кнопке печати запускаем регламентную процедуру генерации и сохранения полного файла на сервере без вывода в окно 1С.
  3. Контроль готового результата. Если пользователю обязательно требуется перепроверить весь документ, открываем для него готовый результирующий PDF во внешней быстрой программе просмотра PDF, которая справляется с навигацией по тысячам страниц гораздо эффективнее табличного поля 1С.

Решение 3. Оптимизация макета и разрешения графики

Проанализируем параметры самого шаблона печати. Часто при создании этикеток DataMatrix генерируется с избыточным разрешением, что приводит к многократному увеличению размера файла.

  1. Ограничение DPI. При генерации растрового кода маркировки ограничим разрешение до 203 или 300 DPI — этого полностью достаточно для термотрансферной печати на производстве, но объем графических данных в оперативной памяти снизится в разы.
  2. Упрощение макета. Уберем из шаблона этикетки объединенные ячейки, лишние рамки, прозрачные подложки и сложные шрифты. Чем проще разметка макета, тем быстрее встроенный конвертер платформы 1С обрабатывает геометрию страниц.

Решение 4. Альтернативные форматы передачи кодов производителю

Рассмотрим производственные альтернативы, исключающие необходимость генерации тяжелых PDF-файлов внутри 1С:

  1. Прямая выгрузка из СУЗ. Станция управления заказами позволяет получать готовые файлы этикеток в формате PDF через официальный API маркировки. В этом случае сервер 1С не тратит ресурсы на рендеринг страниц.
  2. Использование языка разметки принтеров (ZPL/TSPL). Если на стороне изготовителя установлены промышленные принтеры (Zebra, TSC, Godex), целесообразно передавать файл с управляющими командами ZPL. Генерация 3000 этикеток в ZPL представляет собой простую конкатенацию текстовых строк, занимает не более 2 секунд и формирует текстовый файл размером всего в несколько мегабайт, исключая графику.
  3. Передача данных в формате CSV. Экспорт кодов маркировки и реквизитов номенклатуры в текстовый файл для последующей печати через специализированное ПО (BarTender, NiceLabel) на стороне типографии или контрактного производства.
← На главную