Проблема медленной печати этикеток на специализированных принтерах (таких как Datamax E-4203) — классическая задача для разработчиков 1С. Ситуация, когда специализированное ПО вроде Bartender выдает «змею» из этикеток мгновенно, а 1С делает мучительную паузу после каждого экземпляра, связана с фундаментальным различием в способах передачи данных. Разберем подробно, почему так происходит, и какими способами можно добиться максимальной скорости печати.
Проанализируем ситуацию. Когда мы печатаем из 1С стандартным способом, программа формирует графический образ страницы (GDI-объект). Для Windows-принтера это выглядит как огромная картинка, даже если на этикетке всего пара строк текста и штрих-код. 1С 7.7 при вызове метода Напечатать() в цикле для каждой копии заново инициализирует задание печати, что и вызывает ту самую секундную задержку.
Профессиональные программы (Bartender, NiceLabel) работают иначе: они передают на принтер не картинку, а короткие текстовые команды на родном языке принтера (например, DPL для Datamax или ZPL для Zebra). Принтер сам «рисует» шрифт и штрих-код в своей памяти, что происходит мгновенно.
Это самый радикальный и эффективный метод. Мы полностью отказываемся от графической таблицы 1С и формируем текстовый файл с командами Datamax Programming Language (DPL). Рассмотрим пример логики формирования такого задания:
Вместо визуального проектирования этикетки, мы создаем строку, описывающую координаты и значения элементов. Пример типичной команды для Datamax может выглядеть так:
// Пример формирования команды DPL
ТекстКоманды = "STX L " + РазделительСтрок; // Начало задания
ТекстКоманды = ТекстКоманды + "191100001000050" + "Товар: Печенье" + РазделительСтрок; // Текст
ТекстКоманды = ТекстКоманды + "1E4202000200100" + "460123456789" + РазделительСтрок; // Штрих-код
ТекстКоманды = ТекстКоманды + "E" + РазделительСтрок; // Конец задания
После формирования строки её нужно отправить напрямую в порт. Выясним, как это сделать в 1С 7.7. Можно использовать объект Текст для записи в файл, а затем скопировать его в порт принтера командой ОС:
// Отправка файла в порт через командную строку
КомандаСистемы("copy /b c:\label.txt \\ИмяПК\ИмяПринтера");
При таком подходе принтер получит всего несколько байт данных, и печать будет происходить с максимально возможной скоростью, на которую способен механизм протяжки ленты.
Если переписывать печать на язык команд слишком сложно, попробуем оптимизировать стандартный механизм. Большинство принтеров этикеток корректно работают с драйверами от Seagull Scientific. Рассмотрим настройки, которые могут ускорить процесс:
Backfeed в значение Never или Smart.Разберем типичную ошибку в коде 1С. Программисты часто пишут так:
// ОШИБОЧНЫЙ ВАРИАНТ (медленно)
Для Ном = 1 По КолвоКопий Цикл
Таб.ВывестиСекцию("Этикетка");
Таб.Напечатать(0); // Каждый вызов создает новое задание в очереди Windows
КонецЦикла;
Правильный подход заключается в формировании одного многостраничного документа. Выясним, как это сделать:
// ПРАВИЛЬНЫЙ ВАРИАНТ (быстрее)
Для Ном = 1 По КолвоКопий Цикл
Таб.ВывестиСекцию("Этикетка");
Если Ном < КолвоКопий Тогда
Таб.НоваяСтраница();
КонецЕсли;
КонецЦикла;
Таб.Напечатать(0); // Одно задание на все копии
При использовании НоваяСтраница() драйвер принтера получает один документ с множеством страниц. Если в настройках драйвера при этом стоит «Печатать сразу на принтер», задержка между страницами должна исчезнуть или значительно сократиться.
Проанализируем еще одну причину «тормозов» — компоненту 1С:Печать штрих-кодов. Она генерирует картинку (Metafile), которая весит довольно много. Чтобы облегчить задачу принтеру, установите в систему специальный шрифт (например, Code39.ttf). В макете 1С 7.7 выведите штрих-код просто как текстовое поле, назначив ему этот шрифт. Для принтера это будет обычный текст, который обрабатывается мгновенно.
Выясним, какой путь выбрать именно вам. Если вам важна максимальная скорость (печать тысяч этикеток в день) — осваивайте язык DPL и прямую отправку в порт. Это гарантирует отсутствие любых пауз.
Если объем печати небольшой, достаточно будет установить драйверы от Seagull Scientific, настроить в них Backfeed и оптимизировать код 1С, чтобы он не плодил сотни заданий в очереди печати, а отправлял один документ через НоваяСтраница(). Также убедитесь, что в настройках порта принтера отключена опция «Разрешить двусторонний обмен данными», которая иногда вызывает лишние ожидания ответа от устройства.