Как исправить экранирование кавычек в кодах маркировки Честный Знак при печати через БПО?

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

При интеграции систем маркировки «Честный Знак» с решениями на платформе 1С разработчики нередко сталкиваются с ситуацией, когда DataMatrix печатается с ошибкой или вовсе признается системой поддельным. Проанализируем типичный сценарий: штрихкод содержит символ двойной кавычки ", однако в процессе передачи макета на печать через Библиотеку Подключаемого Оборудования (БПО) кавычка преобразуется в XML-сущность ", попадает прямо в тело штрихкода и искажает данные маркировки.

Выясним причину такого поведения, оценим риски временных исправлений и подробно разберем надежные альтернативные варианты решения задачи.

Причина возникновения проблемы

Рассмотрим механизм передачи данных в подсистеме БПО. При вызове процедуры МенеджерОборудованияКлиент.НачатьПечатьЭтикеток макет этикетки и передаваемые данные упаковываются в формат XML. В соответствии со стандартами XML, любые специальные символы внутри атрибутов обязаны экранироваться (символ двойной кавычки превращается в ").

Посмотрим на пример строки кода маркировки до и после передачи в драйвер:

Исходный код: 0104601071054136215"LpWtsTCsHXN\u001d93xxkz

Код в сформированном XML: 0104601071054136215"LpWtsTCsHXN\u001d93xxkz

Проблема кроется не в самой 1С и не в спецификации XML, а во внешней компоненте (драйвере принтера). Многие драйверы оборудования разбирают входной XML упрощенными алгоритмами или регулярными выражениями без выполнения обратного преобразования сущностей (unescape). В результате драйвер принтера воспринимает текст " буквально и кодирует именно эти символы внутрь DataMatrix. При считывании сканером «Честный Знак» определяет несовпадение криптохвоста и бракует код маркировки.

Анализ временного решения («костыля») и его риски

В общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент в методе ПечатьЭтикеток разработчики часто прибегают к прямой замене подстроки перед отправкой пакета в драйвер:


ДанныеДляВыгрузки = СтрЗаменить(ДанныеДляВыгрузки, """, """");            
Ответ = ОбъектДрайвера.ПечатьЭтикеток(ПараметрыПодключения.ИДУстройства, ДанныеДляВыгрузки, СтатусПакета);

Разберем, почему данный подход крайне ненадежен и опасен в промышленной эксплуатации:

  1. Нарушение формата XML: Вставка символа " внутрь значения XML-атрибута делает документ невалидным (not well-formed). Если драйвер оборудования обновится или будет заменен на модель со строгим XML-парсером, вызов метода завершится фатальной ошибкой разбора документа.
  2. Обрезка строк: При наличии нескольких кавычек в тексте или сопутствующих атрибутах парсер драйвера закроет атрибут по первой встреченной кавычке, из-за чего хвост кода маркировки будет утерян.

По этой причине рассмотрим более стабильные и правильные способы реализации печати кодов маркировки.

Способ 1. Печать штрихкода в виде картинки в шаблоне БПО

Наиболее надежный способ избежать проблем со спецсимволами при использовании БПО — формировать DataMatrix на стороне 1С и передавать его в шаблон не как текстовый штрихкод, а как графический объект.

Разберем реализацию по шагам:

  1. Откроем редактор шаблона этикетки БПО.
  2. Удалим поле типа «Штрихкод» и вместо него разместим элемент типа «Картинка» (Image).
  3. В коде формирования данных для печати сгенерируем изображение DataMatrix с помощью внешней компоненты 1С:Печать штрихкодов.
  4. Сформированное изображение передадим в пакет печати в виде двоичных данных или строки Base64.

Такой подход полностью снимает зависимость от встроенных шрифтов и парсеров принтера, а также гарантирует корректную передачу спецсимволов кавычек и служебного разделителя GS (ASCII 29).

Способ 2. Печать через стандартный табличный документ 1С

Если нет жесткого требования использовать печать по шаблонам БПО, рассмотрим перевод печати этикеток на стандартный объект платформы ТабличныйДокумент.

Проанализируем преимущества этого подхода:

  1. Устанавливаем штатный Windows-драйвер принтера этикеток в операционную систему.
  2. Создаем макет с точными физическими габаритами этикетки в миллиметрах, устанавливаем нулевые поля страницы.
  3. Выводим код маркировки как сгенерированное изображение в ячейку макета.
  4. Отправляем сформированный документ на принтер стандартным методом платформы:
    
    ТабДок = Новый ТабличныйДокумент;
    // Заполнение областей макета данными
    ТабДок.ИмяПринтера = "Zebra_ZD420";
    ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
    

Способ исключает влияние XML-сериализации БПО и обеспечивает стопроцентную повторяемость печати на любых принтерах.

Способ 3. Передача данных штрихкода через Base64

В актуальных требованиях к разработке драйверов подключаемого оборудования 1С предусмотрен специальный параметр для передачи значений штрихкодов в бинарно-безопасном виде. Проверим структуру XML-пакета, генерируемого вашей версией БПО. Если драйвер и конфигурация поддерживают свойство ValueBase64, значение кода маркировки предварительно кодируется алгоритмом Base64.

Это исключает появление запрещенных спецсимволов и кавычек в теле XML-атрибута, сохраняя при этом векторную печать силами самого принтера.

Способ 4. Прямая печать на языке управления принтером (ZPL, TSPL, ESC/Label)

Для высоконагруженных складов и производств эффективным решением является прямая отправка команд на нативном языке принтера (например, ZPL для Zebra, TSPL для TSC или Godex).

Разберем логику работы:

  1. Формируем текстовую команду управления принтером с указанием координат и типа штрихкода DataMatrix.
  2. В командах языков управления используются собственные механизмы экранирования спецсимволов (например, через шестнадцатеричные коды _22 для кавычки в ZPL при включенном режиме ^FD).
  3. Отправляем сформированную строку напрямую в порт принтера (через сетевой сокет TCP/IP, COM-порт или спулер печати Windows в режиме RAW).

Этот способ обеспечивает максимальную скорость отправки заданий и полностью исключает посредников в виде XML-пакетов БПО.

Способ 5. Обновление драйвера оборудования

Поскольку ошибка с чтением " возникает на стороне парсера драйвера, проверим наличие обновлений на сайте производителя принтера. Разработчики сертифицированных драйверов для 1С регулярно выпускают исправления, в которых добавляется корректный XML-декодинг для символов маркировки. Проверим версию установленной компоненты в меню подключения оборудования и обновим ее до актуальной версии.

← На главную