При прямой печати на языке ZPL (Zebra Programming Language) разработчики часто сталкиваются с проблемой: вместо русских букв на этикетке выводятся знаки вопроса, пустые места или непонятные символы. Это происходит из-за того, что стандартные настройки принтера и его шрифты "из коробки" часто не поддерживают кириллицу. В этой статье мы подробно разберем, как настроить корректный вывод текста на русском языке, правильно передать команды из 1С и использовать переменные в шаблонах.
Проанализируем ситуацию: когда мы отправляем строку ^FDНаименование^FS, принтер пытается сопоставить символы с текущей выбранной кодовой таблицей и шрифтом. По умолчанию в принтерах Zebra используется кодировка ASCII, где нет кириллических символов. Чтобы "подружить" принтер с русским языком, необходимо решить две задачи: указать принтеру верную кодировку данных (UTF-8) и выбрать шрифт, содержащий начертания нужных нам букв.
Первым делом рассмотрим команду ^CI (Change International Font). Она отвечает за выбор кодовой таблицы. Для работы с Unicode (UTF-8) используется параметр 28. Без этой команды принтер будет игнорировать многобайтовые последовательности кириллицы.
Пример инициализации этикетки с поддержкой UTF-8:
// Устанавливаем кодировку UTF-8
ZPL = "^XA^CI28";
Даже если мы передали данные в UTF-8, стандартный шрифт (например, шрифт "A") может не иметь русских букв. Нам нужно обратиться к масштабируемому шрифту, который поддерживает Unicode. В современных моделях Zebra часто предустановлен шрифт под именем TT0003M_.FNT (обычно это Swiss 721). Если его нет, его необходимо загрузить в память принтера (диск E: или R:) через утилиту Zebra Setup Utilities.
Разберем рабочий пример формирования ZPL-строки в 1С, который успешно прошел тестирование:
ZPL = "^XA" // Начало этикетки
+ "^CI28" // Включаем UTF-8
+ "^A*,10,10,E:TT0003M_.FNT" // Выбираем шрифт с диска E
+ "^FO10,30^FD" + Наименование + "^FS" // Выводим текст
+ "^XZ"; // Конец этикетки
В данном коде команда ^A* позволяет выбрать шрифт по его полному имени в файловой системе принтера. Обратите внимание на префикс E: — он указывает, что файл шрифта хранится в энергонезависимой памяти принтера.
Выясним, как передать сформированную строку напрямую на устройство. Одним из самых простых и надежных способов является использование объекта ЗаписьТекста (также существует возможность печати на мобильных принтерах по bluetooth и сети). Рассмотрим пример отправки кода в сетевой порт принтера или на локальный порт (COM/LPT):
// ПортПринтера может быть путем вида "\\ИмяПК\ИмяПринтера" или "COM1"
Текст = Новый ЗаписьТекста(ПортПринтера, КодировкаТекста.UTF8, Символы.ВК + Символы.ПС, Ложь);
Текст.Записать(ZPL);
Текст.Закрыть();
Важный нюанс: при создании объекта ЗаписьТекста с кодировкой UTF-8, 1С может добавить в начало файла метку BOM (Byte Order Mark). Некоторые принтеры воспринимают BOM как мусорный символ и печатают его в начале первой этикетки. Чтобы этого избежать, иногда целесообразно формировать данные в виде ДвоичныеДанные и отправлять их без заголовков.
Если при передаче данных через драйвер или специфические порты символы все равно искажаются, проанализируем альтернативный метод — использование команды ^FH (Field Hex). Она позволяет передавать символы в шестнадцатеричном виде.
В этом случае вместо русских букв в команду ^FD вставляются их коды. Например, буква "а" в UTF-8 преобразуется в _D0_B0. Код будет выглядеть так:
// Пример использования Field Hex
ZPL = "^XA^CI28^FO10,10^FH^FD_D0_90_D0_B1_D0_B2^FS^XZ"; // Напечатает "Абв"
Этот метод исключает ошибки интерпретации символов на пути от 1С до печатающей головки принтера, что полезно, когда выполняется печать любой печатной формы, зарегистрированной с помощью БСП.
Рассмотрим вопрос автоматизации, который часто возникает при переходе с языка EPL на ZPL. В EPL использовались переменные типа V00 и команда AUTOFR. В ZPL логика немного иная, но более мощная.
^DF (Define Format).^FN1, ^FN2. Это прямые аналоги переменных из EPL.^XF и новые значения для полей ^FN.Пример создания шаблона в памяти:
^XA
^DFE:TEMPLATE.ZPL^FS
^CI28
^A0N,30,30^FO50,50^FN1^FS // Поле №1
^BY2,3,60^FO50,100^BC^FN2^FS // Поле №2 (Штрихкод)
^XZ
Теперь для печати этикетки с конкретными данными достаточно отправить короткий код:
^XA
^XFE:TEMPLATE.ZPL^FS
^FN1^FDТовар Кирилловский^FS
^FN2^FD12345678^FS
^XZ
Если стоит задача печатать этикетку автоматически при поступлении данных с весов по COM-порту (без участия компьютера), возможностей обычного ZPL может быть недостаточно. Для этих целей в принтерах Zebra существует опция ZBI (Zebra BASIC Interpreter).
ZBI позволяет написать небольшой скрипт на языке BASIC, который будет работать внутри принтера. Скрипт будет открывать порт COM1, "слушать" веса, парсить строку с весом и подставлять её в ^FN поля нашего шаблона. Это самый профессиональный способ реализации автономной печати, аналогичный тому, как работает внешняя компонента для весового терминала Т3 и Т9.
Если шрифт не печатает или вы видите пустые поля, выполните диагностику ресурсов принтера. Отправьте следующую команду, чтобы получить список всех доступных шрифтов в памяти устройства:
^XA^ID*.*^FS^XZ
Принтер распечатает список файлов. Убедитесь, что файл шрифта, к которому вы обращаетесь в коде (например, TT0003M_.FNT), действительно существует в списке и находится на соответствующем диске (E: или R:).
Подводя итог, можно сказать, что печать кириллицы в ZPL требует внимательного отношения к двум вещам: кодировке в заголовке этикетки (^CI28) и наличию Unicode-шрифта в памяти принтера. Следуя приведенным шагам, вы сможете настроить стабильную печать этикеток любой сложности напрямую из 1С, включая поддержку оборудования через драйвер для весов CAS-AD.