Как правильно печатать картинки на принтерах Zebra из 1С с использованием ZPL?

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

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

Понимание процесса передачи данных

Первое, что необходимо осознать: принтер не умеет «понимать» форматы типа .jpg или .png напрямую. Ему требуются команды ZPL, которые описывают изображение попиксельно. Попытки самостоятельно читать файл попиксельно через ПрочитатьВБуферДвоичныхДанных в 1С приводят к катастрофическому падению производительности. Нам нужно отойти от этого метода и воспользоваться встроенными командами принтера для работы с графикой.

Решение 1: Загрузка изображения во внутреннюю память принтера

Самый эффективный способ — загрузить изображение в память принтера один раз под уникальным именем, а затем вызывать его для печати при необходимости. Для этого используется команда ~DY.

Рассмотрим пошагово, как это реализовать:

  1. Подготовьте монохромное изображение.
  2. Используйте команду ~DY для сохранения данных в принтере.
  3. Используйте команду ^IM для вывода сохраненного объекта на этикетку.

Для передачи данных в принтер нам потребуется преобразовать двоичные данные картинки в Hex-строку. В 1С для этих целей идеально подходит метод ПолучитьHexСтрокуИзДвоичныхДанных().


// Пример формирования команды для загрузки картинки в память принтера
// ~DY - команда загрузки, R:TEST1.PNG - имя файла в памяти
СтрокаZPL = "^XA" + 
            "~DYR:TEST1.PNG,P,P,614,20," + ПолучитьHexСтрокуИзДвоичныхДанных(ДанныеКартинки) + 
            "^FO50,250^IMR:TEST1.PNG^FS" + 
            "^XZ";

Решение 2: Передача данных через команды управления

Если вам не требуется постоянное хранение картинки в памяти, можно передавать данные напрямую. Важно использовать правильное кодирование. Часто возникает путаница между ASCII-шестнадцатеричным представлением и «чистым» бинарным форматом. Если вы работаете с ZPL, убедитесь, что ваш код соответствует формату ASCII hexadecimal, где каждый байт данных представлен двумя символами (0-9, A-F).

При реализации обмена данными с оборудованием полезно опираться на опыт работы с торговым оборудованием (например, как это реализовано в драйверах ККТ):


БинарныеДанные = ПолучитьДвоичныеДанныеИзФайла(ПутьКФайлу);
мБинарныхДанных = РазделитьДвоичныеДанные(БинарныеДанные, 64);
Счетчик = 0;
Для Каждого ЧастьДанных из мБинарныхДанных Цикл
    // Формируем блок данных для передачи в принтер
    ДанныеВHex = ПолучитьHexСтрокуИзДвоичныхДанных(ЧастьДанных);
    // Отправка данных на порт принтера...
    Счетчик = Счетчик + 1;
КонецЦикла;

Практические советы по оптимизации

Чтобы ваша разработка не «жевала» картинку по несколько минут, примите к сведению следующие рекомендации:

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

← На главную