Передача кодов маркировки (DataMatrix) между различными информационными системами, такими как 1С:УПП и Штрих-М: Кассир, является одной из наиболее ответственных задач при внедрении системы «Честный ЗНАК». На первый взгляд может показаться, что код маркировки — это обычная текстовая строка, которую легко передать через стандартный файл обмена (TXT или XML). Однако на практике разработчики сталкиваются с рядом технических сложностей, связанных со спецсимволами, кодировками и требованиями законодательства к составу данных. В этой статье мы подробно разберем, как обеспечить 100% сохранность данных при обмене.
Разберем ситуацию: код маркировки формата GS1 DataMatrix содержит внутри себя не только цифры и буквы, но и служебные символы. Самым важным из них является разделитель групп GS (Group Separator), который соответствует коду ASCII 29 (или 0x1D в шестнадцатеричной системе). Этот символ необходим для того, чтобы сканер и кассовое ПО могли отличить, где заканчивается один идентификатор применения (AI), например серийный номер, и начинается другой, например дата истечения срока годности.
Проанализируем основные риски при передаче этого символа:
ASCII 29 как пустоту или конец строки.Windows-1251 символ может быть интерпретирован некорректно, поэтому рекомендуется использовать UTF-8.Если обмен настроен через текстовый файл, как в случае с системой Штрих-М, нам важно сохранить структуру кода в первозданном виде. Рассмотрим, как это сделать программно в среде 1С. Вместо использования объекта ТекстовыйДокумент, который может неявно преобразовывать спецсимволы, лучше работать с потоками или объектом ЗаписьТекста с явным указанием кодировки.
Посмотрим на пример записи строки кода с сохранением спецсимволов:
// Пример записи кода маркировки в файл
ПутьКФайлу = "C:\Exchange\marks.txt";
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
// Код маркировки, полученный из базы или со сканера
// Предположим, ПеременнаяКод содержит символ Символ(29)
СтрокаДляЗаписи = "010460123456789021" + Символ(29) + "ABC12345";
Запись.ЗаписатьСтроку(СтрокаДляЗаписи);
Запись.Закрыть();
Важный совет: Чтобы проверить, корректно ли записан символ GS, откройте полученный файл в Hex-редакторе (например, в Notepad++ с плагином HEX-Editor). Вы должны увидеть байт 1D в том месте, где находится разделитель. Если там стоит 20 (пробел) или символ отсутствует — код испорчен и не будет принят кассовым аппаратом для реализации по ФФД 1.2.
Работа с XML накладывает дополнительные ограничения. Согласно стандарту XML 1.0, символы с кодами ниже ASCII 32 (за исключением табуляции, переноса строки и возврата каретки) являются недопустимыми. Это означает, что вы не можете просто вставить код маркировки с символом ASCII 29 внутрь XML-тега — это приведет к ошибке при парсинге файла приемником.
Выясним, какие существуют способы решения этой проблемы:
. Однако не все парсеры поддерживают этот символ даже в таком виде.Разберем пример кодирования в Base64 на стороне 1С:
// Кодирование строки маркировки для передачи в XML
КодМаркировки = "010460123456789021ABC123"; // В реальности здесь есть спецсимволы
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(КодМаркировки, КодировкаТекста.UTF8);
Base64Код = Base64Строка(ДвоичныеДанныеКода);
// Теперь Base64Код можно смело помещать в XML-узел
// На стороне приемника (Штрих-М) нужно выполнить обратное преобразование
В ходе обсуждения часто возникает вопрос: какую часть кода передавать? Для товаров легкой промышленности (одежда) часто говорят, что достаточно первых 31 символа. Проанализируем, так ли это на самом деле.
Код маркировки состоит из:
Важное уточнение: Если ваша задача — просто переместить товар между складами внутри компании, то «короткого» кода (GTIN + серийник) может быть достаточно. Но если вы передаете данные в Штрих-М: Кассир для дальнейшей розничной продажи, вы обязаны передавать полный код с криптохвостом. Согласно формату фискальных данных (ФФД) 1.2, касса должна проверить код и отправить его в ОФД целиком. Без крипточасти проверка не пройдет, и продажа маркированного товара будет невозможна.
После того как файл загружен в приемник, крайне важно выполнить валидацию. Не стоит слепо доверять входящим данным. Рассмотрим алгоритм проверки:
01 (GTIN) и содержит разделители в правильных местах.При интеграции с Штрих-М: Кассир через текстовые файлы (формат обмена транзакциями или товарами), обратите внимание на настройки драйвера. В некоторых конфигурациях требуется, чтобы перед строкой маркировки стоял специальный префикс, указывающий системе, что это именно DataMatrix, а не обычный штрихкод EAN-13. Обычно это настраивается в параметрах загрузки в самом «Штрих-М», где указывается номер поля в файле, соответствующий коду маркировки.
Если вы столкнулись с тем, что кассовая программа «не видит» марку в файле, попробуйте следующее:
Таким образом, мы выяснили, что успешная передача маркировки зависит от внимания к деталям: сохранению спецсимволов GS, выбору правильной кодировки UTF-8 и передаче полной строки кода вместе с криптографической частью. Следуя этим рекомендациям, вы обеспечите корректную работу кассового узла и отсутствие проблем с контролирующими органами.