При внедрении радиочастотной идентификации (RFID) на складе или производстве часто возникает необходимость печатать визуальную информацию на самоклеящихся этикетках и одновременно с этим записывать данные в чип (инлей) метки. Популярные принтеры, такие как Zebra ZD500R или ZT410, аппаратно поддерживают эту возможность, однако при попытке интеграции с 1С разработчики сталкиваются с рядом ограничений стандартных механизмов.
Разберем подробно, почему типовая Библиотека подключаемого оборудования (БПО) не позволяет решить эту задачу «из коробки», как правильно управлять RFID-модулем принтера из 1С и как избежать типовых аппаратных проблем при записи меток.
Проанализируем архитектуру БПО перед началом разработки. В стандарте подключаемого оборудования 1С функционал RFID выделен только для категории Считыватели RFID (устройства ввода данных, работающие аналогично сканерам штрихкодов или терминалам сбора данных). Категория устройств Принтеры этикеток с RFID-кодировщиком в стандарте БПО отсутствует.
Если подключить такой принтер через стандартный драйвер Windows как обычный принтер этикеток, печать макетов из 1С будет выполняться через графическую подсистему операционной системы (GDI / Spooler). Графический поток транслирует картинку и не содержит управляющих команд для радиомодуля принтера. В результате принтер печатает изображение, но чип метки остается незаписанным.
Для одновременной печати и кодирования инлея необходимо передавать данные во внутренний интерпретатор принтера напрямую на нативном языке управления — для оборудования Zebra это язык ZPL (Zebra Programming Language).
Рассмотрим структуру специализированных команд ZPL, отвечающих за позиционирование антенны, регулировку мощности и запись данных в память чипа.
^RS): команда задает тип используемой метки (по умолчанию EPC Class 1 Gen 2), смещение положения антенны относительно инлея (в миллиметрах), количество попыток повторной записи при ошибке и поведение принтера при браке (например, вывод метки с надписью VOID).^RF): ключевая команда, выполняющая запись данных в чип. Параметры команды определяют режим работы (W — запись, R — чтение), формат данных (H — Hexadecimal, A — ASCII, E — EPC), номер начального блока, длину данных и банк памяти.^RW): позволяет задать уровень мощности антенны на чтение и запись, чтобы принтер не перезаписывал соседние этикетки в ленте.Посмотрим на структуру банков памяти пассивной UHF-метки:
Разберем пример шаблона ZPL-этикетки, который выполняет визуальную печать текста и штрихкода с параллельной записью 96-битного EPC-кода в шестнадцатеричном формате (Hex):
^XA
^RS8,,,1,N
^RW15,15
^FO50,50^A0N,40,40^FDТовар: Номенклатура 1^FS
^FO50,100^BCN,60,Y,N,N^FD123456789012^FS
^RFW,H,1,2,6^FD3034257BF400B7800004CB2F^FS
^XZ
В приведенном фрагменте команда ^RFW,H,1,2,6 указывает принтеру: выполнить запись (W) в шестнадцатеричном виде (H) в банк EPC (1), начиная со 2-го слова, объемом 6 слов (96 бит).
Выясним, какими способами можно доставить сформированную текстовую строку ZPL из 1С непосредственно в интерпретатор принтера минуя графический драйвер.
Сетевые принтеры принимают сырые данные на порт 9100 (JetDirect). Это наиболее надежный способ для серверного или клиентского кода 1С, так как исключает влияние драйверов ОС. Передачу текстового потока можно выполнить с помощью скриптов PowerShell, системных сокетов или внешних Native API компонент.
Если принтер подключен локально по USB или расшарен в локальной сети, 1С может записать сформированный ZPL-текст во временный текстовый файл и отправить его в устройство системной командой копирования в двоичном режиме.
Посмотрим на пример вызова через командную строку:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("zpl");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.ANSI);
ЗаписьТекста.Записать(ТекстZPL);
ЗаписьТекста.Закрыть();
СетевоеИмяПринтера = "\\127.0.0.1\ZebraZD500R";
КомандаWindows = "cmd /c copy /b """ + ИмяВременногоФайла + """ """ + СетевоеИмяПринтера + """";
ЗапуститьПриложение(КомандаWindows, , Истина);
УдалитьФайлы(ИмяВременногоФайла);
В операционной системе настраивается стандартный принтер «Только текст», привязанный к порту устройства. При отправке текстового документа через этот драйвер Windows передает байты напрямую без преобразования в растр.
При внедрении RFID-печати разработчики часто сталкиваются с аппаратными ошибками. Разберем основные причины и методы их устранения:
Чип и антенна (инлей) внутри этикетки имеют физический размер и конкретное положение. Если положение антенны считывателя внутри принтера не совпадает с положением чипа в момент подачи ленты, запись не происходит, и принтер маркирует этикетку как бракованную. Перед началом работы с новым рулоном этикеток необходимо запустить процедуру RFID Calibration через меню принтера или отправить калибровочную команду для автоматического расчета смещения.
Если радиосигнал принтера настроен на слишком высокую мощность, команда записи может затронуть чип следующей или предыдущей этикетки на ленте. Проблема решается уменьшением мощности передачи через параметр команды ^RW или настройку в меню принтера (RFID Power Level).
Распространенное заблуждение — использовать заводской идентификатор метки без перезаписи. С завода чипы часто поставляются с пустыми или повторяющимися данными в банке EPC. Для стабильного учета в 1С необходимо самостоятельно формировать уникальный код (например, по стандарту GS1 / SGTIN-96 или внутреннему формату предприятия) и явно записывать его в банк EPC при печати.