При доработке старых конфигураций 1С под требования обязательной маркировки товаров часто возникает задача (поможет поддержка маркировки Честный ЗНАК для УТ 10.3): как понять, что считанный сканером штрихкод действительно является кодом маркировки DataMatrix, и как извлечь из него полезные данные (GTIN, серийный номер)? Разберем этот процесс по шагам, опираясь на стандарты GS1.
Код маркировки — это не просто последовательность символов, а сложная структура, основанная на стандарте GS1. Он состоит из идентификаторов применения AI (Application Identifiers), которые указывают системе, какой тип данных следует далее. Основные компоненты, которые нам необходимо извлекать:
GTIN (14 цифр) — глобальный номер товара.Для разделения этих полей в коде часто используется непечатаемый управляющий символ FNC1 (в кодировке ASCII это десятичное значение 29).
Для того чтобы программно выделить данные из строки, необходимо прочитать массив байтов штрихкода и искать известные AI. Рассмотрим пример функции, которая выполняет такой разбор:
Функция ПолучитьДанныеШтрихкода(Штрихкод) Экспорт
Результат = Новый Структура;
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод);
М = Новый Массив;
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
Пока Истина Цикл
Байт = ЧтениеДанных.ПрочитатьБайт;
Если Байт = Неопределено Тогда Прервать;
Иначе М.Добавить(Байт);
КонецЕсли;
КонецЦикла;
Пока Истина Цикл
Если М.Количество() < 3 Тогда Прервать; КонецЕсли;
А1 = Символ(М[0]);
А2 = Символ(М[1]);
А3 = Символ(М[2]);
Если А1 + А2 = "01" Тогда
Результат.Вставить("GTIN", ПолучитьФиксированнуюСтроку(М, 3, 14));
Удалить(М, 16);
Продолжить;
КонецЕсли;
Если А1 + А2 = "21" Тогда
Результат.Вставить("СерийныйНомер", ПолучитьПеременнуюСтроку(М, 3, Длина));
Удалить(М, Длина + 3);
Продолжить;
КонецЕсли;
// Дополнительные AI можно обрабатывать аналогично
Прервать;
КонецЦикла;
Возврат Результат;
КонецФункции
Вспомогательные функции ПолучитьФиксированнуюСтроку и ПолучитьПеременнуюСтроку позволяют корректно извлекать данные из массива байтов, учитывая наличие разделителя FNC1. Это надежный способ отделить идентификаторы друг от друга — для этого есть печать и извлечение кодов Data Matrix.
Одной из частых проблем является случайное сканирование других штрихкодов (например, QR-кодов с чеков ККМ). Чтобы избежать ошибок, воспользуйтесь следующими рекомендациями (удобно через обработка распознавания DataMatrix из картинок в 1С):
DataMatrix имеют специфические заголовки, начинающиеся с 01 (GTIN). Если при парсинге вы не находите обязательных AI, значит, считанный код не относится к маркировке.DataMatrix. Если передан QR-код — игнорируйте данные (поможет проверка и фиксация кодов маркировки на ТСД).Если вы работаете в современных типовых конфигурациях (например, 1С:Розница, Управление торговлей), не обязательно писать парсер с нуля. Используйте подсистему ИнтеграцияИСМП. Для работы с иерархией упаковок и проверки кодов существуют готовые методы, например, ШтрихкодированиеИС.ПодготовитьДанныеКодовМаркировкиДляОбработки. Это позволит использовать обновляемые стандарты проверки напрямую из библиотеки 1С.
Помните, что окончательная проверка «валидности» (не был ли код продан, заблокирован или списан) возможна только через онлайн-запрос к системе «Честный ЗНАК». Локальный парсинг лишь подтверждает, что формат строки соответствует стандарту, но не гарантирует легальность конкретного экземпляра товара.
Для успешной реализации задачи мы рекомендуем придерживаться ступенчатого подхода: сначала фильтрация по типу сканируемого кода, затем разбор структуры через AI-идентификаторы. Это обеспечит высокую надежность работы программы при взаимодействии с маркируемой продукцией — поможет контроль и верификация кодов маркировки в документах.