Многие разработчики сталкиваются с трудностями при попытке распечатать изображение на промышленном принтере Zebra, используя язык ZPL (Zebra Programming Language). Чаще всего возникает проблема низкой скорости работы при попытке «бинаризировать» картинку средствами 1С, считывая каждый пиксель отдельно. Давайте разберем, как реализовать этот процесс правильно и эффективно.
Первое, что необходимо осознать: принтер не умеет «понимать» форматы типа .jpg или .png напрямую. Ему требуются команды ZPL, которые описывают изображение попиксельно. Попытки самостоятельно читать файл попиксельно через ПрочитатьВБуферДвоичныхДанных в 1С приводят к катастрофическому падению производительности. Нам нужно отойти от этого метода и воспользоваться встроенными командами принтера для работы с графикой.
Самый эффективный способ — загрузить изображение в память принтера один раз под уникальным именем, а затем вызывать его для печати при необходимости. Для этого используется команда ~DY.
Рассмотрим пошагово, как это реализовать:
~DY для сохранения данных в принтере.^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";
Если вам не требуется постоянное хранение картинки в памяти, можно передавать данные напрямую. Важно использовать правильное кодирование. Часто возникает путаница между ASCII-шестнадцатеричным представлением и «чистым» бинарным форматом. Если вы работаете с ZPL, убедитесь, что ваш код соответствует формату ASCII hexadecimal, где каждый байт данных представлен двумя символами (0-9, A-F).
При реализации обмена данными с оборудованием полезно опираться на опыт работы с торговым оборудованием (например, как это реализовано в драйверах ККТ):
БинарныеДанные = ПолучитьДвоичныеДанныеИзФайла(ПутьКФайлу);
мБинарныхДанных = РазделитьДвоичныеДанные(БинарныеДанные, 64);
Счетчик = 0;
Для Каждого ЧастьДанных из мБинарныхДанных Цикл
// Формируем блок данных для передачи в принтер
ДанныеВHex = ПолучитьHexСтрокуИзДвоичныхДанных(ЧастьДанных);
// Отправка данных на порт принтера...
Счетчик = Счетчик + 1;
КонецЦикла;
Чтобы ваша разработка не «жевала» картинку по несколько минут, примите к сведению следующие рекомендации:
ZPL. Это позволит увидеть результат вашей верстки в реальном времени..grf (Zebra Graphics). Если у вас есть возможность, конвертируйте исходные изображения в этот формат до отправки в 1С.^ID (Image Delete), чтобы не переполнить внутреннее хранилище устройства.Таким образом, ключ к успеху — правильная подготовка графических данных внешними инструментами и использование эффективных команд ZPL для отправки этих данных на печать. Вместо написания графического редактора на языке 1С, используйте платформу как надежный транспорт для передачи подготовленных байтовых последовательностей.