Как организовать прямую печать на принтере Zebra ZD410 из 1С при использовании команд EPL2

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

В процессе интеграции 1С с внешними информационными системами (например, медицинскими лабораториями или логистическими сервисами) разработчики часто сталкиваются с ситуацией, когда данные для этикеток приходят не в виде картинки или PDF, а в виде набора низкоуровневых команд для принтера. Рассмотрим ситуацию на примере принтера Zebra ZD410 и языка EPL2. Выясним, почему стандартные методы печати могут не срабатывать и как правильно передать данные на устройство.

Анализ входящих данных: что такое EPL2

Проанализируем структуру данных, которые приходят от внешней системы. Если в строке вы видите последовательности типа N, A116,27..., B260,175... и завершающую команду P1, значит, перед нами язык программирования EPL2 (Eltron Programming Language). Это текстовый протокол, где каждая буква отвечает за конкретное действие принтера.

Разберем пример кода из практики:


N
S2
D5
ZB
I8,10
q335
R48,0
Q200,20
A116,27,2,4,1,1,N,"ВИ-ЛАП"
B260,175,2,1,2,2,55,N,"942933852268"
P1

Разберем основные команды из этого листинга:

Почему не работает простая отправка через COPY

Многие пытаются сохранить этот текст в файл .txt и отправить его на порт принтера через команду системы copy file.txt COM5 или copy file.txt \\computer\printer. Посмотрим, почему это часто приводит к пустой очереди печати или отсутствию реакции принтера:

  1. Отсутствие управляющих символов: Каждая команда в языке EPL2 должна заканчиваться символом перевода строки (LF или CRLF). Если при сохранении в файл из 1С вы не добавили переносы строк после каждой команды (включая последнюю P1), принтер воспримет весь блок как одну некорректную команду.
  2. Интерпретация драйвером: Современные USB-драйверы Zebra работают в графическом режиме. Когда вы отправляете текстовый файл через Windows Spooler, драйвер пытается "нарисовать" этот текст как обычный документ, вместо того чтобы пропустить команды напрямую в процессор принтера.
  3. Кодировка файла: Если в тексте есть русские буквы, файл должен быть строго в кодировке ANSI (Windows-1251). Если 1С сохранит его в UTF-8 (с BOM или без), принтер напечатает "кракозябры" или проигнорирует текстовые блоки.

Способ 1: Использование Generic / Text Only драйвера

Самый простой способ заставить Windows пробрасывать текстовые команды без изменений — установить дополнительный принтер в системе, используя стандартный драйвер Windows Generic / Text Only.

Рассмотрим последовательность действий:


КомандаСистемы("copy /b D:\label.txt \\127.0.0.1\ZebraRaw");

Обратите внимание на ключ /b. Он указывает системе, что файл нужно копировать в бинарном режиме, не пытаясь интерпретировать символы конца файла.

Способ 2: Прямая печать через объект драйвера в 1С

Если принтер подключен через USB, а использование сетевых путей нежелательно, проанализируем возможность использования внешних компонент. В 1С наиболее надежным способом является использование драйверов, поддерживающих метод SendRawData или аналогичный.

Если вы используете БСП (Библиотеку стандартных подсистем), можно задействовать механизмы работы с торговым оборудованием. Для прямой печати на языке команд часто подходят драйверы типа "Гексагон" или специализированные компоненты для Zebra. В этом случае код в 1С будет выглядеть примерно так:


// Пример логики подготовки данных
ТекстКоманд = "N" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "A116,27,2,4,1,1,N,""ТЕСТ""" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "P1" + Символы.ПС;

// Преобразование в кодировку ANSI
ДанныеДляПечати = ПолучитьДвоичныеДанныеИзСтроки(ТекстКоманд, "windows-1251");
// Далее передача в метод драйвера, который умеет печатать Raw

Проблема переключения языков (ZPL vs EPL)

Выясним еще одну важную техническую деталь. Принтеры серии ZD (включая ZD410) поддерживают несколько языков управления. Иногда принтер находится в режиме ZPL-only. В этом случае, даже если вы передадите корректные EPL-команды, принтер их проигнорирует (хотя индикатор приема данных может мигать).

Проанализируем, как переключить режим:

  1. Используйте утилиту Zebra Setup Utilities.
  2. Зайдите в раздел "Open Communication with Printer".
  3. Отправьте команду ! U1 setvar "device.languages" "epl_zpl" (это включит автоопределение языка).
  4. Выполните команду ! U1 do "device.reset" "" для перезагрузки принтера.

Обработка данных из Base64

Как отметил автор темы, лаборатория часто присылает данные в формате Base64. В 1С важно правильно их декодировать перед записью в файл. Рассмотрим правильный алгоритм:


// СтрокаBase64 - то, что пришло от лаборатории
ДвоичныеДанные = Base64Значение(СтрокаBase64);

// Если мы хотим сохранить это в файл для последующей отправки через copy
ИмяФайла = "D:\label.txt";
ДвоичныеДанные.Записать(ИмяФайла);

// Теперь отправляем на принтер, который настроен как Generic/Text
КомандаСистемы("copy /b " + ИмяФайла + " \\localhost\Zebra");

Важное замечание: Если после декодирования Base64 вы получили "кашу" или принтер не печатает, проверьте, не содержит ли исходная строка управляющие символы в другой кодировке. Иногда требуется сначала перевести полученные байты в строку, заменить в ней I8,10 на I8,17 (для кириллицы) и снова записать в файл в кодировке windows-1251.

Резюме для реализации решения

Подведем итог. Чтобы успешно напечатать этикетку EPL2 из 1С на Zebra ZD410, выполните следующие шаги:

  1. Убедитесь в наличии переносов строк: Команды N, A, B, P должны быть разделены символами CRLF.
  2. Настройте кодировку: Используйте Windows-1251 (ANSI). Проверьте наличие команды I8,17 в заголовке данных.
  3. Настройте принтер: Либо используйте Generic / Text Only драйвер для "проброса" текста, либо переключите принтер в режим поддержки EPL через Zebra Setup Utilities.
  4. Тестируйте локально: Перед программной реализацией сохраните текст в файл и попробуйте отправить его через командную строку (cmd) с ключом /b. Если из консоли печать пошла — можно автоматизировать этот процесс в коде 1С.
← На главную