Как программно определить и проверить формат кода маркировки в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При доработке старых конфигураций 1С под требования обязательной маркировки товаров часто возникает задача (поможет поддержка маркировки Честный ЗНАК для УТ 10.3): как понять, что считанный сканером штрихкод действительно является кодом маркировки DataMatrix, и как извлечь из него полезные данные (GTIN, серийный номер)? Разберем этот процесс по шагам, опираясь на стандарты GS1.

Понимание структуры кода маркировки

Код маркировки — это не просто последовательность символов, а сложная структура, основанная на стандарте GS1. Он состоит из идентификаторов применения AI (Application Identifiers), которые указывают системе, какой тип данных следует далее. Основные компоненты, которые нам необходимо извлекать:

Для разделения этих полей в коде часто используется непечатаемый управляющий символ 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С):

  1. Проверка префиксов: Коды маркировки DataMatrix имеют специфические заголовки, начинающиеся с 01 (GTIN). Если при парсинге вы не находите обязательных AI, значит, считанный код не относится к маркировке.
  2. Тип штрихкода: Если ваш сканер настроен правильно, он передает тип штрихкода (символику). Проверяйте, что тип равен DataMatrix. Если передан QR-код — игнорируйте данные (поможет проверка и фиксация кодов маркировки на ТСД).
  3. Длина строки: Код маркировки для легкой промышленности достаточно длинный (обычно от 30 символов). Проверка длины — это самый простой «фильтр» на начальном этапе.

Использование встроенных механизмов 1С

Если вы работаете в современных типовых конфигурациях (например, 1С:Розница, Управление торговлей), не обязательно писать парсер с нуля. Используйте подсистему ИнтеграцияИСМП. Для работы с иерархией упаковок и проверки кодов существуют готовые методы, например, ШтрихкодированиеИС.ПодготовитьДанныеКодовМаркировкиДляОбработки. Это позволит использовать обновляемые стандарты проверки напрямую из библиотеки 1С.

Помните, что окончательная проверка «валидности» (не был ли код продан, заблокирован или списан) возможна только через онлайн-запрос к системе «Честный ЗНАК». Локальный парсинг лишь подтверждает, что формат строки соответствует стандарту, но не гарантирует легальность конкретного экземпляра товара.

Заключение

Для успешной реализации задачи мы рекомендуем придерживаться ступенчатого подхода: сначала фильтрация по типу сканируемого кода, затем разбор структуры через AI-идентификаторы. Это обеспечит высокую надежность работы программы при взаимодействии с маркируемой продукцией — поможет контроль и верификация кодов маркировки в документах.

← На главную