Почему принтер этикеток Datamax печатает медленно из 1С 7.7 и как это исправить

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Проблема медленной печати этикеток на специализированных принтерах (таких как Datamax E-4203) — классическая задача для разработчиков 1С. Ситуация, когда специализированное ПО вроде Bartender выдает «змею» из этикеток мгновенно, а 1С делает мучительную паузу после каждого экземпляра, связана с фундаментальным различием в способах передачи данных. Разберем подробно, почему так происходит, и какими способами можно добиться максимальной скорости печати.

Причина проблемы: Графика против Команд

Проанализируем ситуацию. Когда мы печатаем из 1С стандартным способом, программа формирует графический образ страницы (GDI-объект). Для Windows-принтера это выглядит как огромная картинка, даже если на этикетке всего пара строк текста и штрих-код. 1С 7.7 при вызове метода Напечатать() в цикле для каждой копии заново инициализирует задание печати, что и вызывает ту самую секундную задержку.

Профессиональные программы (Bartender, NiceLabel) работают иначе: они передают на принтер не картинку, а короткие текстовые команды на родном языке принтера (например, DPL для Datamax или ZPL для Zebra). Принтер сам «рисует» шрифт и штрих-код в своей памяти, что происходит мгновенно.

Решение 1: Прямая печать команд в порт принтера (DPL)

Это самый радикальный и эффективный метод. Мы полностью отказываемся от графической таблицы 1С и формируем текстовый файл с командами Datamax Programming Language (DPL). Рассмотрим пример логики формирования такого задания:

Вместо визуального проектирования этикетки, мы создаем строку, описывающую координаты и значения элементов. Пример типичной команды для Datamax может выглядеть так:


// Пример формирования команды DPL
ТекстКоманды = "STX L " + РазделительСтрок; // Начало задания
ТекстКоманды = ТекстКоманды + "191100001000050" + "Товар: Печенье" + РазделительСтрок; // Текст
ТекстКоманды = ТекстКоманды + "1E4202000200100" + "460123456789" + РазделительСтрок; // Штрих-код
ТекстКоманды = ТекстКоманды + "E" + РазделительСтрок; // Конец задания

После формирования строки её нужно отправить напрямую в порт. Выясним, как это сделать в 1С 7.7. Можно использовать объект Текст для записи в файл, а затем скопировать его в порт принтера командой ОС:


// Отправка файла в порт через командную строку
КомандаСистемы("copy /b c:\label.txt \\ИмяПК\ИмяПринтера");

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

Решение 2: Оптимизация работы через Windows-драйвер

Если переписывать печать на язык команд слишком сложно, попробуем оптимизировать стандартный механизм. Большинство принтеров этикеток корректно работают с драйверами от Seagull Scientific. Рассмотрим настройки, которые могут ускорить процесс:

  1. Использование внутреннего счетчика копий: В настройках драйвера (вкладка «Параметры печати» -> «Настройка страницы») нужно найти опцию «Использовать внутренний счетчик копий принтера». Если она включена, 1С отправит задание один раз, а принтер сам размножит его.
  2. Подмена шрифтов: В настройках драйвера включите использование встроенных шрифтов принтера вместо загружаемых TrueType шрифтов Windows. Это уменьшит объем данных.
  3. Настройка Backfeed (Обратная подача): Пауза часто вызвана тем, что принтер выдвигает этикетку для отрыва, а потом втягивает её обратно. Установите параметр Backfeed в значение Never или Smart.

Решение 3: Оптимизация алгоритма в 1С (Метод НоваяСтраница)

Разберем типичную ошибку в коде 1С. Программисты часто пишут так:


// ОШИБОЧНЫЙ ВАРИАНТ (медленно)
Для Ном = 1 По КолвоКопий Цикл
    Таб.ВывестиСекцию("Этикетка");
    Таб.Напечатать(0); // Каждый вызов создает новое задание в очереди Windows
КонецЦикла;

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


// ПРАВИЛЬНЫЙ ВАРИАНТ (быстрее)
Для Ном = 1 По КолвоКопий Цикл
    Таб.ВывестиСекцию("Этикетка");
    Если Ном < КолвоКопий Тогда
        Таб.НоваяСтраница();
    КонецЕсли;
КонецЦикла;
Таб.Напечатать(0); // Одно задание на все копии

При использовании НоваяСтраница() драйвер принтера получает один документ с множеством страниц. Если в настройках драйвера при этом стоит «Печатать сразу на принтер», задержка между страницами должна исчезнуть или значительно сократиться.

Решение 4: Использование шрифтов штрих-кода

Проанализируем еще одну причину «тормозов» — компоненту 1С:Печать штрих-кодов. Она генерирует картинку (Metafile), которая весит довольно много. Чтобы облегчить задачу принтеру, установите в систему специальный шрифт (например, Code39.ttf). В макете 1С 7.7 выведите штрих-код просто как текстовое поле, назначив ему этот шрифт. Для принтера это будет обычный текст, который обрабатывается мгновенно.

Выводы и рекомендации

Выясним, какой путь выбрать именно вам. Если вам важна максимальная скорость (печать тысяч этикеток в день) — осваивайте язык DPL и прямую отправку в порт. Это гарантирует отсутствие любых пауз.

Если объем печати небольшой, достаточно будет установить драйверы от Seagull Scientific, настроить в них Backfeed и оптимизировать код 1С, чтобы он не плодил сотни заданий в очереди печати, а отправлял один документ через НоваяСтраница(). Также убедитесь, что в настройках порта принтера отключена опция «Разрешить двусторонний обмен данными», которая иногда вызывает лишние ожидания ответа от устройства.

← На главную