При работе с маркировкой алкогольной продукции (пиво, слабоалкогольные напитки, игристые вина) программисты часто сталкиваются с проблемой: код маркировки в формате DataMatrix содержит непечатный символ-разделитель, который "теряется" при сканировании или при передаче данных внутри системы. Разберемся подробно, что это за символ, почему он важен и как настроить программную часть в 1С для корректной работы.
В соответствии со стандартом GS1, код маркировки DataMatrix состоит из нескольких групп данных (Application Identifiers, AI). Каждая группа начинается с идентификатора применения:
01 — GTIN товара (14 цифр).21 — Серийный номер (переменная длина).93 — Код проверки или "криптохвост".Поскольку серийный номер может иметь переменную длину, системе нужно понимать, где он заканчивается и начинается следующая группа данных. Для этого используется управляющий символ GS (Group Separator), имеющий код ASCII 29 (в шестнадцатеричной системе — 1D). Если этот символ отсутствует, программное обеспечение не сможет правильно "распарсить" код, так как не определит границу между серийным номером и криптохвостом. В результате код маркировки не пройдет проверку в системе "Честный ЗНАК" или ЕГАИС.
Проанализируем типичную ситуацию: сканер Proton, Zebra или Honeywell подключен в режиме эмуляции клавиатуры (HID). В этом режиме сканер имитирует нажатие клавиш. Поскольку символа с кодом 29 нет на стандартной клавиатуре, сканер либо просто игнорирует его, либо пытается интерпретировать как управляющую команду ОС. В итоге строка длиной 32 символа превращается в строку длиной 31 символ, и структура кода нарушается.
Решение: Перевод сканера в режим эмуляции COM-порта (Virtual COM Port).
Рассмотрим по шагам, как это сделать:
В режиме COM-порта данные передаются в виде "сырого" потока байтов. Это позволяет 1С получить символ Символ(29) в неизменном виде.
Выясним причину, почему стандартная передача строки может давать сбой. В некоторых версиях платформы 1С при вызове серверной процедуры с передачей строки, содержащей непечатные символы (ASCII < 32), эти символы могут "обрезаться" или заменяться пробелами. Это связано с особенностями сериализации XML/JSON при обмене между клиентом и сервером.
Решение: Использование кодирования в Base64 или URL-кодирования.
Посмотрим на пример кода, как безопасно передать считанную марку на сервер для обработки:
// На клиенте (в модуле формы при получении данных от сканера)
ДанныеШтрихкода = "0104607026342792213+M*aoX" + Символ(29) + "93/Iga"; // Пример кода
СтрокаBase64 = Base64Строка(ДанныеШтрихкода);
ОбработатьМаркуНаСервере(СтрокаBase64);
// На сервере
&НаСервере
Процедура ОбработатьМаркуНаСервере(СтрокаBase64)
Марка = Base64Значение(СтрокаBase64);
// Теперь переменная 'Марка' содержит исходную строку со всеми спецсимволами
// Можно приступать к разбору
КонецПроцедуры
Когда мы получили "чистую" строку со сканера, нам нужно выделить из нее функциональные части. Хранить код в базе рекомендуется целиком, но для поиска по GTIN и серийному номеру код нужно разобрать. Рассмотрим, как это реализовать программно, учитывая символ GS.
Проанализируем алгоритм разбора:
Функция РазобратьКодМаркировки(ПолныйКод) Экспорт
Результат = Новый Структура("GTIN, СерийныйНомер, Криптохвост", "", "", "");
// Ищем символ разделителя GS
СимволРазделителя = Символ(29);
ПозицияРазделителя = Найти(ПолныйКод, СимволРазделителя);
Если ПозицияРазделителя > 0 Тогда
// Если разделитель найден, отсекаем криптохвост по нему
ЧастьДоКриптохвоста = Лев(ПолныйКод, ПозицияРазделителя - 1);
Результат.Криптохвост = Сред(ПолныйКод, ПозицияРазделителя + 1);
// Извлекаем GTIN (первые 14 цифр после идентификатора 01)
Если Лев(ЧастьДоКриптохвоста, 2) = "01" Тогда
Результат.GTIN = Сред(ЧастьДоКриптохвоста, 3, 14);
// Извлекаем серийный номер (после идентификатора 21)
Если Сред(ЧастьДоКриптохвоста, 17, 2) = "21" Тогда
Результат.СерийныйНомер = Сред(ЧастьДоКриптохвоста, 19);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Для стабильной работы с маркировкой алкоголя (где DataMatrix часто бывает мелким или нанесен на изогнутую поверхность бутылки) рекомендуется использовать проверенные модели сканеров, которые гарантированно поддерживают режим NativeApi и эмуляцию COM-порта:
Важный совет: При использовании драйвера "1С:Сканер штрихкода (NativeApi)" система сама умеет обрабатывать префиксы и спецсимволы, если сканер переведен в режим COM. Всегда старайтесь использовать актуальные версии драйверов из состава БСП (Библиотеки стандартных подсистем).
Мы выяснили, что символ GS является ключом к правильному чтению маркировки. Чтобы ваша самописная или типовая конфигурация работала без сбоев, придерживайтесь трех правил: всегда используйте режим COM-порта для сканера, кодируйте строку в Base64 при передаче между контекстами 1С и всегда сохраняйте полный код, включая криптохвост, так как он может потребоваться для формирования чека по требованиям ФФД 1.2.