При разработке и отладке систем интеграции с ГИС МТ (Честный Знак) программисты часто сталкиваются с проблемой отсутствия физического сканера штрихкодов. Основная сложность заключается в том, что для корректного формирования чека или передачи данных в систему требуется полный код маркировки, включающий так называемый «криптохвост» (коды проверки). Обычные средства просмотра, такие как приложение «Честный Знак» для потребителей или данные из УПД в ЭДО, часто скрывают эту техническую информацию. В данной статье мы разберем, как получить полноценный код для тестирования и как правильно работать с ним в коде 1С.
Для начала проанализируем, из чего состоит строка, которую мы называем кодом маркировки. Согласно стандарту GS1 DataMatrix, код представляет собой последовательность идентификаторов применения (AI):
Критически важным моментом является наличие непечатного символа-разделителя групп — GS (Group Separator), имеющего ASCII-код 29. Этот символ служит маркером окончания поля переменной длины для драйвера кассового аппарата и программного обеспечения. Без этого символа код считается невалидным, и проверка в системе ОФД выдаст ошибку или пометку [M-] в чеке.
Разберем ситуацию, когда у нас есть товар с маркой, но нет специализированного сканера. Стандартное мобильное приложение «Честный Знак» не подходит для наших целей, так как оно отображает только информацию о товаре и его легальности, отсекая технические данные. Однако мы можем воспользоваться альтернативными инструментами.
Рассмотрим порядок действий:
Проанализируем ситуацию: если мы просто скопируем эту строку в текстовое поле 1С, символ GS может потеряться или превратиться в пробел. Это приведет к тому, что при формировании XML-файла для ККТ код будет искажен. Для решения этой проблемы можно использовать обработку для добавления невидимых символов GS к коду маркировки.
Если нам нужно программно сформировать код для тестирования формирования XML без участия внешних устройств, мы должны явно вставить символ с кодом 29. Рассмотрим пример функции, которая собирает полный код из составляющих:
Функция СформироватьПолныйКодМаркировки(GTIN, Серия, Ключ, Криптохвост)
// Символ(29) — это и есть разделитель GS
Разделитель = Символ(29);
// Формируем строку в формате GS1
// Обратите внимание: перед 91 и 92 должен стоять разделитель,
// если предыдущее поле имеет переменную длину
ПолныйКод = "01" + GTIN + "21" + Серия + Разделитель + "91" + Ключ + Разделитель + "92" + Криптохвост;
Возврат ПолныйКод;
КонецФункции
При отладке парсинга входящей строки со сканера (если сканер работает в режиме эмуляции клавиатуры), полезно знать, как программно отделить КИЗ от криптохвоста. Посмотрим на пример реализации такой задачи:
Функция ПолучитьКИЗ(СтрМарка)
// Ищем позицию первого разделителя групп
ПозРазд = Найти(СтрМарка, Символ(29));
Если ПозРазд > 0 Тогда
// Извлекаем часть до разделителя
КИЗ = Лев(СтрМарка, ПозРазд - 1);
Иначе
// Если разделитель не найден, возможно, это упрощенный код или ошибка
КИЗ = СтрМарка;
КонецЕсли;
Возврат КИЗ;
КонецФункции
Для полноценной разработки рекомендуется зарегистрироваться в «Песочнице» (тестовом контуре) ГИС МТ. Это позволяет абсолютно легально и бесплатно получить тестовые коды маркировки в электронном виде.
Выясним преимущества этого метода:
ОбменСГИСМТ.Проанализируем требования формата фискальных данных 1.2. При передаче маркированного товара в ККТ система выполняет проверку кода. Если вы передадите строку без криптохвоста (только GTIN и серию), касса не сможет выполнить запрос к серверам ГИС МТ для проверки статуса кода. В результате в чеке будет напечатан признак [M-], что для реальной продажи является нарушением.
При формировании XML-структуры чека в 1С (объект ТаблицаТоваров), убедитесь, что в поле, отвечающее за код маркировки, попадает полная строка, включая Символ(29). Использование специализированных библиотек интеграции от 1С (БПО — Библиотека подключаемого оборудования) обычно автоматизирует этот процесс, но при прямой интеграции через драйвер ККТ контроль спецсимволов ложится на плечи программиста.
Важный момент: некоторые сканеры при настройке «из коробки» могут отсекать символ GS или заменять его на другой символ. При отладке всегда проверяйте, что именно «прилетает» в обработчик ВнешнееСобытие. Если вы видите, что код «слипся» (например, 21 переходит в 91 без разделителя), необходимо настроить драйвер сканера или программно восстанавливать структуру строки перед отправкой в ККТ.