В процессе интеграции 1С с внешними информационными системами (например, медицинскими лабораториями или логистическими сервисами) разработчики часто сталкиваются с ситуацией, когда данные для этикеток приходят не в виде картинки или PDF, а в виде набора низкоуровневых команд для принтера. Рассмотрим ситуацию на примере принтера Zebra ZD410 и языка 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
Разберем основные команды из этого листинга:
I8 означает 8-битную кодировку, а 10 — номер таблицы. Важный момент: для корректной печати кириллицы часто требуется кодовая страница I8,17.Многие пытаются сохранить этот текст в файл .txt и отправить его на порт принтера через команду системы copy file.txt COM5 или copy file.txt \\computer\printer. Посмотрим, почему это часто приводит к пустой очереди печати или отсутствию реакции принтера:
LF или CRLF). Если при сохранении в файл из 1С вы не добавили переносы строк после каждой команды (включая последнюю P1), принтер воспримет весь блок как одну некорректную команду.Самый простой способ заставить Windows пробрасывать текстовые команды без изменений — установить дополнительный принтер в системе, используя стандартный драйвер Windows Generic / Text Only.
Рассмотрим последовательность действий:
ZebraRaw.
КомандаСистемы("copy /b D:\label.txt \\127.0.0.1\ZebraRaw");
Обратите внимание на ключ /b. Он указывает системе, что файл нужно копировать в бинарном режиме, не пытаясь интерпретировать символы конца файла.
Если принтер подключен через USB, а использование сетевых путей нежелательно, проанализируем возможность использования внешних компонент. В 1С наиболее надежным способом является использование драйверов, поддерживающих метод SendRawData или аналогичный.
Если вы используете БСП (Библиотеку стандартных подсистем), можно задействовать механизмы работы с торговым оборудованием. Для прямой печати на языке команд часто подходят драйверы типа "Гексагон" или специализированные компоненты для Zebra. В этом случае код в 1С будет выглядеть примерно так:
// Пример логики подготовки данных
ТекстКоманд = "N" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "A116,27,2,4,1,1,N,""ТЕСТ""" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "P1" + Символы.ПС;
// Преобразование в кодировку ANSI
ДанныеДляПечати = ПолучитьДвоичныеДанныеИзСтроки(ТекстКоманд, "windows-1251");
// Далее передача в метод драйвера, который умеет печатать Raw
Выясним еще одну важную техническую деталь. Принтеры серии ZD (включая ZD410) поддерживают несколько языков управления. Иногда принтер находится в режиме ZPL-only. В этом случае, даже если вы передадите корректные EPL-команды, принтер их проигнорирует (хотя индикатор приема данных может мигать).
Проанализируем, как переключить режим:
! U1 setvar "device.languages" "epl_zpl" (это включит автоопределение языка).! U1 do "device.reset" "" для перезагрузки принтера.Как отметил автор темы, лаборатория часто присылает данные в формате 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, выполните следующие шаги:
N, A, B, P должны быть разделены символами CRLF.Windows-1251 (ANSI). Проверьте наличие команды I8,17 в заголовке данных.cmd) с ключом /b. Если из консоли печать пошла — можно автоматизировать этот процесс в коде 1С.