При интеграции систем маркировки «Честный Знак» с решениями на платформе 1С разработчики нередко сталкиваются с ситуацией, когда DataMatrix печатается с ошибкой или вовсе признается системой поддельным. Проанализируем типичный сценарий: штрихкод содержит символ двойной кавычки ", однако в процессе передачи макета на печать через Библиотеку Подключаемого Оборудования (БПО) кавычка преобразуется в XML-сущность ", попадает прямо в тело штрихкода и искажает данные маркировки.
Выясним причину такого поведения, оценим риски временных исправлений и подробно разберем надежные альтернативные варианты решения задачи.
Рассмотрим механизм передачи данных в подсистеме БПО. При вызове процедуры МенеджерОборудованияКлиент.НачатьПечатьЭтикеток макет этикетки и передаваемые данные упаковываются в формат XML. В соответствии со стандартами XML, любые специальные символы внутри атрибутов обязаны экранироваться (символ двойной кавычки превращается в ").
Посмотрим на пример строки кода маркировки до и после передачи в драйвер:
Исходный код: 0104601071054136215"LpWtsTCsHXN\u001d93xxkz
Код в сформированном XML: 0104601071054136215"LpWtsTCsHXN\u001d93xxkz
Проблема кроется не в самой 1С и не в спецификации XML, а во внешней компоненте (драйвере принтера). Многие драйверы оборудования разбирают входной XML упрощенными алгоритмами или регулярными выражениями без выполнения обратного преобразования сущностей (unescape). В результате драйвер принтера воспринимает текст " буквально и кодирует именно эти символы внутрь DataMatrix. При считывании сканером «Честный Знак» определяет несовпадение криптохвоста и бракует код маркировки.
В общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент в методе ПечатьЭтикеток разработчики часто прибегают к прямой замене подстроки перед отправкой пакета в драйвер:
ДанныеДляВыгрузки = СтрЗаменить(ДанныеДляВыгрузки, """, """");
Ответ = ОбъектДрайвера.ПечатьЭтикеток(ПараметрыПодключения.ИДУстройства, ДанныеДляВыгрузки, СтатусПакета);
Разберем, почему данный подход крайне ненадежен и опасен в промышленной эксплуатации:
" внутрь значения XML-атрибута делает документ невалидным (not well-formed). Если драйвер оборудования обновится или будет заменен на модель со строгим XML-парсером, вызов метода завершится фатальной ошибкой разбора документа.По этой причине рассмотрим более стабильные и правильные способы реализации печати кодов маркировки.
Наиболее надежный способ избежать проблем со спецсимволами при использовании БПО — формировать DataMatrix на стороне 1С и передавать его в шаблон не как текстовый штрихкод, а как графический объект.
Разберем реализацию по шагам:
1С:Печать штрихкодов.Такой подход полностью снимает зависимость от встроенных шрифтов и парсеров принтера, а также гарантирует корректную передачу спецсимволов кавычек и служебного разделителя GS (ASCII 29).
Если нет жесткого требования использовать печать по шаблонам БПО, рассмотрим перевод печати этикеток на стандартный объект платформы ТабличныйДокумент.
Проанализируем преимущества этого подхода:
ТабДок = Новый ТабличныйДокумент;
// Заполнение областей макета данными
ТабДок.ИмяПринтера = "Zebra_ZD420";
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Способ исключает влияние XML-сериализации БПО и обеспечивает стопроцентную повторяемость печати на любых принтерах.
В актуальных требованиях к разработке драйверов подключаемого оборудования 1С предусмотрен специальный параметр для передачи значений штрихкодов в бинарно-безопасном виде. Проверим структуру XML-пакета, генерируемого вашей версией БПО. Если драйвер и конфигурация поддерживают свойство ValueBase64, значение кода маркировки предварительно кодируется алгоритмом Base64.
Это исключает появление запрещенных спецсимволов и кавычек в теле XML-атрибута, сохраняя при этом векторную печать силами самого принтера.
Для высоконагруженных складов и производств эффективным решением является прямая отправка команд на нативном языке принтера (например, ZPL для Zebra, TSPL для TSC или Godex).
Разберем логику работы:
_22 для кавычки в ZPL при включенном режиме ^FD).Этот способ обеспечивает максимальную скорость отправки заданий и полностью исключает посредников в виде XML-пакетов БПО.
Поскольку ошибка с чтением " возникает на стороне парсера драйвера, проверим наличие обновлений на сайте производителя принтера. Разработчики сертифицированных драйверов для 1С регулярно выпускают исправления, в которых добавляется корректный XML-декодинг для символов маркировки. Проверим версию установленной компоненты в меню подключения оборудования и обновим ее до актуальной версии.