При работе с маркированным товаром в программе 1С:Управление нашей фирмой часто возникает задача массовой отправки кодов маркировки изготовителю или на контрактное производство. При объемах в 2000–3000 этикеток типовой механизм вывода через табличный документ и стандартную кнопку сохранения в файл .pdf начинает работать крайне медленно или приводит к зависанию сеанса пользователя. Разберем причины такого поведения платформы и рассмотрим эффективные варианты решения этой проблемы.
Выясним причины медленной работы
Проанализируем, почему типовой механизм печати испытывает сильные перегрузки при формировании многостраничных файлов:
Обработка тысяч графических объектов. Каждый код маркировки DataMatrix в макете ТабличныйДокумент представляет собой отдельный графический объект высокой четкости. При формировании документа на несколько тысяч страниц платформа вынуждена хранить в оперативной памяти и последовательно преобразовывать тысячи изображений в векторные потоки PDF, что резко увеличивает нагрузку на клиентское приложение.
Ограничения тонкого клиента. Сохранение из типовой формы предварительного просмотра печати выполняется на стороне клиента. В 32-разрядных приложениях это гарантированно приводит к исчерпанию адресного пространства памяти и критическим задержкам из-за частой работы сборщика мусора.
Сложная динамическая пагинация. Использование режима «Замостить» заставляет платформу рассчитывать границы печати, разрывы страниц и взаимное выравнивание ячеек для каждой отдельной этикетки строго последовательно в один поток.
Отрисовка в интерфейсе. Попытка загрузить и отобразить гигантский документ в окне предпросмотра создает колоссальную нагрузку на графическую подсистему интерфейса еще до момента нажатия кнопки сохранения.
Решение 1. Формирование в фоновых заданиях и объединение через утилиту qpdf
Рассмотрим технический подход, позволяющий задействовать серверные мощности и распараллелить генерацию страниц. Вместо создания одного огромного табличного документа на клиенте мы разбиваем массив этикеток на пачки и генерируем фрагменты PDF на сервере через фоновые задания.
Разберем алгоритм по шагам:
Разбиваем массив кодов маркировки на порции (например, по 200–500 штук).
Запускаем несколько фоновых потоков с помощью механизма ФоновыеЗадания.Выполнить().
Каждое фоновое задание формирует свой компактный ТабличныйДокумент и сохраняет его во временный файл вызовом метода Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF).
После завершения всех потоков собираем полученные файлы в один общий многостраничный PDF с помощью консольной утилиты qpdf, выполнив команду операционной системы через ЗапуститьПриложение().
Посмотрим на пример серверного кода запуска фонового задания для генерации части этикеток:
Решение 2. Оптимизация бизнес-процесса предварительного просмотра
Часто пользователи настаивают на открытии табличного документа перед печатью исключительно для того, чтобы визуально проконтролировать корректность расположения полей. Просмотр 3000 одинаковых этикеток человеком физически невозможен и не имеет практического смысла.
Разберем, как перестроить интерфейсный сценарий:
Предпросмотр только образца. В форму печати выводим только первые 1–3 этикетки для визуального контроля оператором. Это происходит мгновенно.
Серверная выгрузка всего объема. По кнопке печати запускаем регламентную процедуру генерации и сохранения полного файла на сервере без вывода в окно 1С.
Контроль готового результата. Если пользователю обязательно требуется перепроверить весь документ, открываем для него готовый результирующий PDF во внешней быстрой программе просмотра PDF, которая справляется с навигацией по тысячам страниц гораздо эффективнее табличного поля 1С.
Решение 3. Оптимизация макета и разрешения графики
Проанализируем параметры самого шаблона печати. Часто при создании этикеток DataMatrix генерируется с избыточным разрешением, что приводит к многократному увеличению размера файла.
Ограничение DPI. При генерации растрового кода маркировки ограничим разрешение до 203 или 300 DPI — этого полностью достаточно для термотрансферной печати на производстве, но объем графических данных в оперативной памяти снизится в разы.
Упрощение макета. Уберем из шаблона этикетки объединенные ячейки, лишние рамки, прозрачные подложки и сложные шрифты. Чем проще разметка макета, тем быстрее встроенный конвертер платформы 1С обрабатывает геометрию страниц.
Решение 4. Альтернативные форматы передачи кодов производителю
Рассмотрим производственные альтернативы, исключающие необходимость генерации тяжелых PDF-файлов внутри 1С:
Прямая выгрузка из СУЗ. Станция управления заказами позволяет получать готовые файлы этикеток в формате PDF через официальный API маркировки. В этом случае сервер 1С не тратит ресурсы на рендеринг страниц.
Использование языка разметки принтеров (ZPL/TSPL). Если на стороне изготовителя установлены промышленные принтеры (Zebra, TSC, Godex), целесообразно передавать файл с управляющими командами ZPL. Генерация 3000 этикеток в ZPL представляет собой простую конкатенацию текстовых строк, занимает не более 2 секунд и формирует текстовый файл размером всего в несколько мегабайт, исключая графику.
Передача данных в формате CSV. Экспорт кодов маркировки и реквизитов номенклатуры в текстовый файл для последующей печати через специализированное ПО (BarTender, NiceLabel) на стороне типографии или контрактного производства.