Как эффективно печатать сложные этикетки на термопринтере Zebra из 1С:Управление торговлей 11?

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

В работе с 1С:Управление торговлей 11 (УТ 11) многие пользователи сталкиваются с задачей печати этикеток на термопринтерах, таких как Zebra ZT230. Стандартный функционал программы, к сожалению, часто оказывается недостаточным. Он не позволяет создавать сложные макеты с множеством элементов (например, несколько штрихкодов, логотипы, QR-коды) и не обеспечивает необходимую скорость при печати больших объемов. Кроме того, возникают сложности с печатью произвольного текста, не привязанного к справочникам номенклатуры.

Мы рассмотрим эти ограничения и предложим проверенное решение, которое позволяет значительно повысить гибкость и скорость печати этикеток. Вместе мы разберем, как отправлять команды напрямую на принтер, используя язык ZPL (Zebra Programming Language), и как реализовать это средствами 1С.

Принципы прямой печати на термопринтер через ZPL/EPL

Прежде всего, давайте выясним, почему стандартные подходы к печати в 1С оказываются неэффективными для термопринтеров — для решения проблем есть расширение возможностей печати этикеток в 1С:УТ 11. Обычно 1С формирует изображение этикетки в виде растровой графики и отправляет ее на печать через стандартные драйверы Windows. Этот процесс имеет несколько недостатков:

  1. Низкая скорость: Передача и обработка растрового изображения занимает значительное время, особенно когда требуется оптимизация печати больших тиражей этикеток. Принтер может "тормозить" или даже зависать.
  2. Ограниченная гибкость: Шаблоны этикеток в 1С часто имеют жесткую структуру.
  3. Зависимость от драйверов: Производительность и стабильность зависят от корректной работы драйверов принтера, которые не всегда оптимизированы для высокоскоростной термопечати.

Альтернативный и гораздо более эффективный подход — это прямая печать этикеток на Zebra (ZPL) из 1С через TCP/IP сокеты без драйверов. Суть этого метода заключается в том, что мы не отправляем графическое изображение. Вместо этого, мы формируем текстовый файл, содержащий команды ZPL, которые описывают, что и где должно быть напечатано на этикетке. Принтер получает эти команды и сам "рисует" этикетку, используя свои встроенные возможности и шрифты. Это значительно быстрее, так как объем передаваемых данных минимален, а обработка происходит на стороне принтера.

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

Подключение и отправка команд по TCP/IP из 1С

Для реализации прямой отправки ZPL-команд из 1С нам потребуется установить сетевое соединение с принтером. Большинство современных термопринтеров поддерживают подключение по TCP/IP. Мы будем использовать объект TCPСоединение в 1С, что является основой руководства по организации высокоскоростной печати.

Процесс выглядит следующим образом:

  1. Определяем IP-адрес и порт принтера. Принтер должен быть подключен к локальной сети и иметь статический IP-адрес. Стандартный порт для прямой печати ZPL-команд по TCP/IP обычно 9100. Вы можете найти эту информацию в настройках принтера или в его документации.

  2. Формируем строку с ZPL-командами. Это самая важная часть, которую мы подробно разберем далее. Перед печатью важно убедиться, что данные в системе актуальны.

  3. Создаем объект TCPСоединение. В 1С мы инициализируем этот объект, передавая ему IP-адрес и порт принтера, а также таймаут для соединения.

    
    Сокет = Новый TCPСоединение("IP_Адрес_Принтера", 9100, , 1000); // IP принтера, порт, таймаут
    

    Здесь "IP_Адрес_Принтера" должен быть заменен на реальный IP-адрес вашего термопринтера. Таймаут в 1000 миллисекунд (1 секунда) обычно достаточен, но его можно увеличить при необходимости.

  4. Устанавливаем таймауты для приема и отправки данных. Это поможет избежать зависаний, если принтер по какой-то причине не отвечает.

    Сокет.УстановитьТаймаут(Прием=1000, Отправка=1000);
  5. Отправляем ZPL-строку на принтер. Мы преобразуем нашу ZPL-строку в двоичные данные, используя соответствующую кодировку (об этом подробнее поговорим позже) и отправляем их через созданное соединение.

    
    // Кодировку КодировкиТекста.UTF8 необходимо заменить на актуальную для принтера,
    // чаще всего КодировкиТекста.Windows или КодировкиТекста.DOS.
    Сокет.Отправить(Новый ДвоичныеДанные(КодировкиТекста.UTF8.ПолучитьБайты(СтрокаZPL)));
    

    Важно: убедитесь, что ваш принтер доступен по сети (пингуется), иначе попытка соединения завершится ошибкой.

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

    Сокет.Закрыть();

Объединив все эти шаги, мы получаем следующий пример программного кода для отправки ZPL-команд:


Процедура ОтправитьZPLНаПринтер(IP_Адрес_Принтера, СтрокаZPL, КодировкаДляПринтера = Неопределено)

    Если КодировкаДляПринтера = Неопределено Тогда
        // По умолчанию попробуем Windows (CP1251), так как часто используется для русского текста
        // или настроена на принтере. Подробнее о кодировках ниже.
        КодировкаДляПринтера = КодировкиТекста.Windows; 
    КонецЕсли;

    Попытка
        Сокет = Новый TCPСоединение(IP_Адрес_Принтера, 9100, , 1000); // IP принтера, порт, таймаут соединения
        Сокет.УстановитьТаймаут(Прием=1000, Отправка=1000);

        ДанныеДляОтправки = Новый ДвоичныеДанные(КодировкаДляПринтера.ПолучитьБайты(СтрокаZPL));
        Сокет.Отправить(ДанныеДляОтправки);
        Сокет.Закрыть();

        Сообщить("ZPL-команды успешно отправлены на принтер " + IP_Адрес_Принтера);

    Исключение
        Сообщить("Ошибка при отправке ZPL-команд: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;

КонецПроцедуры

// Пример использования:
// СтрокаZPL = "^XA^FO50,50^A0N,30,30^FDПривет Мир^FS^XZ";
// ОтправитьZPLНаПринтер("192.168.1.100", СтрокаZPL, КодировкиТекста.Windows);

Формирование ZPL-команд для создания сложных макетов

ZPL предоставляет широкий набор команд для создания этикеток любой сложности. Каждая команда начинается с символа ^. Мы рассмотрим использование языка ZPL для формирования сложных этикеток в 1С:Предприятие 8 и разберем часто используемые команды — для этой задачи есть расширение для печати GTIN и Data Matrix на этикетках.

Любая ZPL-последовательность начинается с ^XA (Start Format) и заканчивается ^XZ (End Format). Внутри этих команд мы размещаем все элементы этикетки.

Вот базовый пример ZPL-кода для печати простой строки "Hello World":


^XA
^FO50,50^A0N,30,30^FDHello World^FS
^XZ

Давайте разберем основные команды, которые помогут нам создавать сложные макеты:

  1. ^XA...^XZ: Start Format / End Format. Открывают и закрывают блок команд ZPL.

  2. ^FOx,y: Field Origin. Устанавливает начальную позицию (точку отсчета) для следующего поля. x — смещение по горизонтали, y — смещение по вертикали, отсчет от левого верхнего угла этикетки. Координаты указываются в точках (dots).

  3. ^Aft,o,h,w: Font Field. Определяет шрифт для следующего текстового поля.

    • f: Идентификатор шрифта (например, A, B, N - для встроенных).
    • t: Ориентация (N-normal, R-rotated 90, I-inverted 180, B-bottom-up 270).
    • o: Высота шрифта в точках.
    • h: Ширина шрифта в точках.

    Пример: ^A0N,30,30 - шрифт A, нормальная ориентация, высота 30 точек, ширина 30 точек.

  4. ^FDdata: Field Data. Содержит данные, которые будут напечатаны. Это может быть текст, переменные.

  5. ^FS: Field Separator. Завершает определение текущего поля. После этой команды можно задавать новое поле.

  6. ^BYw,h,o: Barcode Field Defaults. Устанавливает параметры для следующих штрихкодов.

    • w: Ширина самого тонкого штриха (в точках).
    • h: Высота штрихкода (в точках).
    • o: Ориентация (как у шрифта).
  7. ^BCo,h,f,g,c: Barcode 128 (Code 128). Команда для печати штрихкода Code 128.

    • o: Ориентация.
    • h: Высота.
    • f: Печатать или нет интерпретацию (текст под штрихкодом).
    • g: Печатать или нет контрольную цифру.
    • c: Режим Code 128 (A, B, C, Auto).

    Пример: ^FO50,100^BCN,100,Y,N,A^FD1234567890^FS (штрихкод Code 128, нормальная ориентация, высота 100, текст под штрихкодом, данные "1234567890").

  8. ^BQo,c,e,h,s: QR Code. Команда для печати QR-кода. В современных реалиях это часто требуется для работы с маркировкой; для таких задач удобно использовать специальную обработку для печати кодов маркировки Честного знака с порядковыми номерами.

    • o: Ориентация.
    • c: Размер символа (1-10, чем больше, тем крупнее QR).
    • e: Уровень коррекции ошибок (H, Q, M, L).

    Пример: ^FO50,250^BQN,2,4,H^FDhttp://example.com^FS (QR-код, нормальная ориентация, размер 2, уровень коррекции H, данные "http://example.com").

  9. ^GFA,x,y,d,r,c: Graphic Field. Для печати графики, например, логотипов. Хотя прямая работа с графикой в ZPL сложна, существует решение для печати этикеток и ценников с основной картинкой номенклатуры, которое помогает автоматизировать этот процесс.

Пример сложного макета ZPL:


^XA
^PW800 // Ширина этикетки в точках (примерно 100 мм для 203dpi)
^LL600 // Длина этикетки в точках (примерно 75 мм для 203dpi)

// Заголовок
^FO50,30^A0N,40,40^FDНаименование товара^FS

// Артикул
^FO50,80^A0N,25,25^FDАртикул: АРТ-001^FS

// Цена
^FO350,80^A0N,30,30^FDЦена: 1234.50 руб.^FS

// Штрихкод Code 128
^FO50,150^BY2,3,100^BCN,100,Y,N,A^FD4601234567890^FS

// QR-код
^FO400,150^BQN,2,10,H^FDhttps://qr.example.com/item/12345^FS

// Произвольный текст
^FO50,300^A0N,20,20^FDДополнительная информация или описание.^FS
^FO50,330^A0N,20,20^FDДата производства: 01.01.2024^FS

^XZ

Важно: для создания сложных макетов мы настоятельно рекомендуем использовать официальную документацию Zebra, а также специальные программы-редакторы, такие как ZebraDesigner. В нем вы можете визуально создать макет, а интеграция шаблонов ZebraDesigner в 1С:Управление торговлей 11 позволит динамически подставлять данные из документов системы в полученный ZPL-код. Это значительно упрощает процесс и позволяет быстро отлаживать макеты.

Решение проблемы кодировки для русского текста

Одной из частых проблем при печати русского текста на термопринтерах является корректная передача кодировки. Принтеры Zebra по умолчанию часто настроены на работу с ASCII, CP866 (DOS) или CP1251 (Windows) для русского языка. Если отправить UTF-8 без дополнительных настроек, на этикетке появятся нечитаемые символы ("кракозябры").

Для устранения этой проблемы применяется решение проблем с русской кодировкой в ZPL: настройка ^CI и шрифтов. Мы можем использовать два основных подхода:

  1. Установка кодировки по умолчанию на принтере. В настройках самого принтера Zebra можно установить кодировку, которую он будет использовать по умолчанию. Часто это CP1251 для кириллицы. Если вы это сделаете, то при отправке ZPL-команд из 1С вам нужно будет убедиться, что ZPL-строка также формируется в CP1251.

  2. Указание кодировки в ZPL-команде. Мы можем явно указать кодировку для печатаемого текста в ZPL-последовательности, используя команду ^CI (Change International Font/Encoding).

    • ^CI28: Устанавливает кодировку CP1251 (Windows ANSI).
    • ^CI13: Устанавливает кодировку CP866 (DOS Cyrillic).

    Пример ZPL-кода с указанием кодировки CP1251 для русского текста:

    
    ^XA
    ^CI28 // Указываем кодировку CP1251 для русских символов
    ^FO50,50^A0N,30,30^FDПривет Мир^FS
    ^XZ
    

    После этого, при отправке ZPL-строки через TCPСоединение в 1С, мы должны использовать ту же кодировку, что указали в ^CI. Например, для CP1251 это будет КодировкиТекста.Windows:

    
    Сокет.Отправить(Новый ДвоичныеДанные(КодировкиТекста.Windows.ПолучитьБайты(СтрокаZPL))); // Вместо UTF8
    

Важно: Всегда проверяйте документацию к вашей конкретной модели принтера Zebra. Некоторые модели могут требовать загрузки специальных шрифтов с поддержкой русских символов для корректного отображения. Без таких шрифтов принтер может либо игнорировать русские буквы, либо заменять их на знаки вопроса. Мы рекомендуем провести тестовую печать, чтобы убедиться в правильности выбранной кодировки.

Печать произвольного текста и использование внешних компонентов

Задача печати произвольного текста, не связанного с номенклатурой, легко решается при помощи прямого формирования ZPL-команд. Мы можем создать специализированную внешнюю обработку или дополнительную форму в 1С. Для массовой работы с товарами очень эффективно применять решение, которое реализует печать этикеток и ценников с выбором из документов (ERP 2, КА 2, УТ 11), что избавляет от необходимости ручного ввода.

Пример алгоритма для такой обработки:

  1. Создаем форму, где есть поле ввода для произвольного текста (например, ПолеВводаТекста).
  2. Создаем кнопку "Печать этикетки".
  3. По нажатию на кнопку, получаем текст из ПолеВводаТекста.
  4. Формируем ZPL-строку, вставляя полученный текст в команду ^FD. Например:
    
    ПроизвольныйТекст = Элементы.ПолеВводаТекста.Значение;
    СтрокаZPL = "^XA^CI28^FO50,50^A0N,30,30^FD" + ПроизвольныйТекст + "^FS^XZ";
    
  5. Вызываем процедуру отправки ZPL на принтер, как было описано выше.

Что касается внешних компонентов, они могут упростить процесс для тех, кто не хочет углубляться в синтаксис ZPL — также поможет конструктор печатных форм для 1С. Однако, если вам нужна максимальная гибкость, полный контроль над каждым элементом этикетки и независимость от сторонних решений, написание своего функционала для формирования ZPL-команд будет предпочтительным. Это позволит вам адаптировать систему под самые специфические требования и не зависеть от обновлений внешних компонентов.

Заключение

Итак, we выяснили, что для решения проблем медленной и ограниченной печати наиболее эффективным подходом является прямая отправка ZPL-команд на принтер через TCP/IP соединение. Этот метод предоставляет нам ряд существенных преимуществ:

  1. Высокая скорость печати: Принтер самостоятельно интерпретирует текстовые команды, что значительно быстрее, чем обработка растровых изображений.
  2. Полная гибкость макетов: ZPL позволяет размещать текст, штрихкоды, QR-коды, графику в любом месте этикетки, создавая сложные и уникальные шаблоны.
  3. Печать произвольных данных: Мы можем легко адаптировать решение для печати информации, не привязанной к типовым справочникам 1С.
  4. Контроль кодировки: Возможность корректной работы с русским языком через явное указание кодировки в ZPL и при отправке данных.

Хотя реализация этого подхода требует определенных знаний ZPL и навыков программирования на 1С, результаты в виде улучшенной производительности и гибкости оправдывают затраченные усилия. Мы рассмотрели основные шаги: от установления TCP-соединения до решения вопросов с кодировкой. Используя представленные примеры и опираясь на официальную документацию принтера, вы сможете настроить эффективную систему печати этикеток, которая будет полностью соответствовать вашим бизнес-требованиям.

← На главную