Как правильно передавать коды маркировки между 1С:УПП и Штрих-М: Кассир через файлы?

Программист Управленческий учет Торговля и дистрибуция
← На главную

Передача кодов маркировки (DataMatrix) между различными информационными системами, такими как 1С:УПП и Штрих-М: Кассир, является одной из наиболее ответственных задач при внедрении системы «Честный ЗНАК». На первый взгляд может показаться, что код маркировки — это обычная текстовая строка, которую легко передать через стандартный файл обмена (TXT или XML). Однако на практике разработчики сталкиваются с рядом технических сложностей, связанных со спецсимволами, кодировками и требованиями законодательства к составу данных. В этой статье мы подробно разберем, как обеспечить 100% сохранность данных при обмене.

Проблема невидимого разделителя GS (ASCII 29)

Разберем ситуацию: код маркировки формата GS1 DataMatrix содержит внутри себя не только цифры и буквы, но и служебные символы. Самым важным из них является разделитель групп GS (Group Separator), который соответствует коду ASCII 29 (или 0x1D в шестнадцатеричной системе). Этот символ необходим для того, чтобы сканер и кассовое ПО могли отличить, где заканчивается один идентификатор применения (AI), например серийный номер, и начинается другой, например дата истечения срока годности.

Проанализируем основные риски при передаче этого символа:

  1. Потеря символа при чтении: Многие текстовые редакторы и стандартные функции чтения строк могут воспринимать ASCII 29 как пустоту или конец строки.
  2. Эмуляция клавиатуры: Если код считывается сканером в режиме эмуляции клавиатуры, символ GS часто заменяется на функциональную клавишу или вовсе игнорируется драйвером.
  3. Искажение в кодировке: При записи файла в кодировке Windows-1251 символ может быть интерпретирован некорректно, поэтому рекомендуется использовать UTF-8.

Передача кода маркировки через текстовые файлы (TXT/CSV)

Если обмен настроен через текстовый файл, как в случае с системой Штрих-М, нам важно сохранить структуру кода в первозданном виде. Рассмотрим, как это сделать программно в среде 1С. Вместо использования объекта ТекстовыйДокумент, который может неявно преобразовывать спецсимволы, лучше работать с потоками или объектом ЗаписьТекста с явным указанием кодировки.

Посмотрим на пример записи строки кода с сохранением спецсимволов:


// Пример записи кода маркировки в файл
ПутьКФайлу = "C:\Exchange\marks.txt";
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

// Код маркировки, полученный из базы или со сканера
// Предположим, ПеременнаяКод содержит символ Символ(29)
СтрокаДляЗаписи = "010460123456789021" + Символ(29) + "ABC12345"; 

Запись.ЗаписатьСтроку(СтрокаДляЗаписи);
Запись.Закрыть();

Важный совет: Чтобы проверить, корректно ли записан символ GS, откройте полученный файл в Hex-редакторе (например, в Notepad++ с плагином HEX-Editor). Вы должны увидеть байт 1D в том месте, где находится разделитель. Если там стоит 20 (пробел) или символ отсутствует — код испорчен и не будет принят кассовым аппаратом для реализации по ФФД 1.2.

Особенности передачи через XML-файлы

Работа с XML накладывает дополнительные ограничения. Согласно стандарту XML 1.0, символы с кодами ниже ASCII 32 (за исключением табуляции, переноса строки и возврата каретки) являются недопустимыми. Это означает, что вы не можете просто вставить код маркировки с символом ASCII 29 внутрь XML-тега — это приведет к ошибке при парсинге файла приемником.

Выясним, какие существуют способы решения этой проблемы:

  1. Экранирование (Entity): Замена символа на его числовое представление, например . Однако не все парсеры поддерживают этот символ даже в таком виде.
  2. Использование Base64: Это самый надежный метод. Мы преобразуем всю строку кода маркировки в Base64. В таком виде она состоит только из безопасных латинских букв и цифр.

Разберем пример кодирования в Base64 на стороне 1С:


// Кодирование строки маркировки для передачи в XML
КодМаркировки = "010460123456789021ABC123"; // В реальности здесь есть спецсимволы
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(КодМаркировки, КодировкаТекста.UTF8);
Base64Код = Base64Строка(ДвоичныеДанныеКода);

// Теперь Base64Код можно смело помещать в XML-узел
// На стороне приемника (Штрих-М) нужно выполнить обратное преобразование

Состав кода: длина и «криптохвост»

В ходе обсуждения часто возникает вопрос: какую часть кода передавать? Для товаров легкой промышленности (одежда) часто говорят, что достаточно первых 31 символа. Проанализируем, так ли это на самом деле.

Код маркировки состоит из:

Важное уточнение: Если ваша задача — просто переместить товар между складами внутри компании, то «короткого» кода (GTIN + серийник) может быть достаточно. Но если вы передаете данные в Штрих-М: Кассир для дальнейшей розничной продажи, вы обязаны передавать полный код с криптохвостом. Согласно формату фискальных данных (ФФД) 1.2, касса должна проверить код и отправить его в ОФД целиком. Без крипточасти проверка не пройдет, и продажа маркированного товара будет невозможна.

Валидация данных в базе-приемнике

После того как файл загружен в приемник, крайне важно выполнить валидацию. Не стоит слепо доверять входящим данным. Рассмотрим алгоритм проверки:

  1. Проверка структуры: Убедитесь, что строка начинается с идентификатора 01 (GTIN) и содержит разделители в правильных местах.
  2. Контроль дублей: Проверьте, не загружался ли этот код ранее. Продажа одного и того же кода дважды («двойные продажи») — это прямое нарушение, которое быстро отслеживается регулятором.
  3. Запрос в ГИС МТ (Честный ЗНАК): Если есть техническая возможность, рекомендуется через API проверить статус кода. Он должен иметь статус «В обороте» и принадлежать вашей организации.

Специфика ПО «Штрих-М»

При интеграции с Штрих-М: Кассир через текстовые файлы (формат обмена транзакциями или товарами), обратите внимание на настройки драйвера. В некоторых конфигурациях требуется, чтобы перед строкой маркировки стоял специальный префикс, указывающий системе, что это именно DataMatrix, а не обычный штрихкод EAN-13. Обычно это настраивается в параметрах загрузки в самом «Штрих-М», где указывается номер поля в файле, соответствующий коду маркировки.

Если вы столкнулись с тем, что кассовая программа «не видит» марку в файле, попробуйте следующее:

Таким образом, мы выяснили, что успешная передача маркировки зависит от внимания к деталям: сохранению спецсимволов GS, выбору правильной кодировки UTF-8 и передаче полной строки кода вместе с криптографической частью. Следуя этим рекомендациям, вы обеспечите корректную работу кассового узла и отсутствие проблем с контролирующими органами.

← На главную