В работе с 1С:Управление торговлей 11 (УТ 11) многие пользователи сталкиваются с задачей печати этикеток на термопринтерах, таких как Zebra ZT230. Стандартный функционал программы, к сожалению, часто оказывается недостаточным. Он не позволяет создавать сложные макеты с множеством элементов (например, несколько штрихкодов, логотипы, QR-коды) и не обеспечивает необходимую скорость при печати больших объемов. Кроме того, возникают сложности с печатью произвольного текста, не привязанного к справочникам номенклатуры.
Мы рассмотрим эти ограничения и предложим проверенное решение, которое позволяет значительно повысить гибкость и скорость печати этикеток. Вместе мы разберем, как отправлять команды напрямую на принтер, используя язык ZPL (Zebra Programming Language), и как реализовать это средствами 1С.
Прежде всего, давайте выясним, почему стандартные подходы к печати в 1С оказываются неэффективными для термопринтеров — для решения проблем есть расширение возможностей печати этикеток в 1С:УТ 11. Обычно 1С формирует изображение этикетки в виде растровой графики и отправляет ее на печать через стандартные драйверы Windows. Этот процесс имеет несколько недостатков:
Альтернативный и гораздо более эффективный подход — это прямая печать этикеток на Zebra (ZPL) из 1С через TCP/IP сокеты без драйверов. Суть этого метода заключается в том, что мы не отправляем графическое изображение. Вместо этого, мы формируем текстовый файл, содержащий команды ZPL, которые описывают, что и где должно быть напечатано на этикетке. Принтер получает эти команды и сам "рисует" этикетку, используя свои встроенные возможности и шрифты. Это значительно быстрее, так как объем передаваемых данных минимален, а обработка происходит на стороне принтера.
Таким образом, мы получим полный контроль над макетом этикетки, сможем размещать элементы с точностью до пикселя и добьемся существенного прироста скорости печати.
Для реализации прямой отправки ZPL-команд из 1С нам потребуется установить сетевое соединение с принтером. Большинство современных термопринтеров поддерживают подключение по TCP/IP. Мы будем использовать объект TCPСоединение в 1С, что является основой руководства по организации высокоскоростной печати.
Процесс выглядит следующим образом:
Определяем IP-адрес и порт принтера. Принтер должен быть подключен к локальной сети и иметь статический IP-адрес. Стандартный порт для прямой печати ZPL-команд по TCP/IP обычно 9100. Вы можете найти эту информацию в настройках принтера или в его документации.
Формируем строку с ZPL-командами. Это самая важная часть, которую мы подробно разберем далее. Перед печатью важно убедиться, что данные в системе актуальны.
Создаем объект TCPСоединение. В 1С мы инициализируем этот объект, передавая ему IP-адрес и порт принтера, а также таймаут для соединения.
Сокет = Новый TCPСоединение("IP_Адрес_Принтера", 9100, , 1000); // IP принтера, порт, таймаут
Здесь "IP_Адрес_Принтера" должен быть заменен на реальный IP-адрес вашего термопринтера. Таймаут в 1000 миллисекунд (1 секунда) обычно достаточен, но его можно увеличить при необходимости.
Устанавливаем таймауты для приема и отправки данных. Это поможет избежать зависаний, если принтер по какой-то причине не отвечает.
Сокет.УстановитьТаймаут(Прием=1000, Отправка=1000);
Отправляем ZPL-строку на принтер. Мы преобразуем нашу ZPL-строку в двоичные данные, используя соответствующую кодировку (об этом подробнее поговорим позже) и отправляем их через созданное соединение.
// Кодировку КодировкиТекста.UTF8 необходимо заменить на актуальную для принтера,
// чаще всего КодировкиТекста.Windows или КодировкиТекста.DOS.
Сокет.Отправить(Новый ДвоичныеДанные(КодировкиТекста.UTF8.ПолучитьБайты(СтрокаZPL)));
Важно: убедитесь, что ваш принтер доступен по сети (пингуется), иначе попытка соединения завершится ошибкой.
Закрываем соединение. После отправки данных всегда закрывайте сокет, чтобы освободить ресурсы.
Сокет.Закрыть();
Объединив все эти шаги, мы получаем следующий пример программного кода для отправки 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 для формирования сложных этикеток в 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
Давайте разберем основные команды, которые помогут нам создавать сложные макеты:
^XA...^XZ: Start Format / End Format. Открывают и закрывают блок команд ZPL.
^FOx,y: Field Origin. Устанавливает начальную позицию (точку отсчета) для следующего поля. x — смещение по горизонтали, y — смещение по вертикали, отсчет от левого верхнего угла этикетки. Координаты указываются в точках (dots).
^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 точек.
^FDdata: Field Data. Содержит данные, которые будут напечатаны. Это может быть текст, переменные.
^FS: Field Separator. Завершает определение текущего поля. После этой команды можно задавать новое поле.
^BYw,h,o: Barcode Field Defaults. Устанавливает параметры для следующих штрихкодов.
w: Ширина самого тонкого штриха (в точках).h: Высота штрихкода (в точках).o: Ориентация (как у шрифта).^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").
^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").
^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 и шрифтов. Мы можем использовать два основных подхода:
Установка кодировки по умолчанию на принтере. В настройках самого принтера Zebra можно установить кодировку, которую он будет использовать по умолчанию. Часто это CP1251 для кириллицы. Если вы это сделаете, то при отправке ZPL-команд из 1С вам нужно будет убедиться, что ZPL-строка также формируется в CP1251.
Указание кодировки в 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), что избавляет от необходимости ручного ввода.
Пример алгоритма для такой обработки:
ПолеВводаТекста).ПолеВводаТекста.^FD. Например:
ПроизвольныйТекст = Элементы.ПолеВводаТекста.Значение;
СтрокаZPL = "^XA^CI28^FO50,50^A0N,30,30^FD" + ПроизвольныйТекст + "^FS^XZ";
Что касается внешних компонентов, они могут упростить процесс для тех, кто не хочет углубляться в синтаксис ZPL — также поможет конструктор печатных форм для 1С. Однако, если вам нужна максимальная гибкость, полный контроль над каждым элементом этикетки и независимость от сторонних решений, написание своего функционала для формирования ZPL-команд будет предпочтительным. Это позволит вам адаптировать систему под самые специфические требования и не зависеть от обновлений внешних компонентов.
Итак, we выяснили, что для решения проблем медленной и ограниченной печати наиболее эффективным подходом является прямая отправка ZPL-команд на принтер через TCP/IP соединение. Этот метод предоставляет нам ряд существенных преимуществ:
Хотя реализация этого подхода требует определенных знаний ZPL и навыков программирования на 1С, результаты в виде улучшенной производительности и гибкости оправдывают затраченные усилия. Мы рассмотрели основные шаги: от установления TCP-соединения до решения вопросов с кодировкой. Используя представленные примеры и опираясь на официальную документацию принтера, вы сможете настроить эффективную систему печати этикеток, которая будет полностью соответствовать вашим бизнес-требованиям.