Как корректно обрабатывать символ-разделитель групп GS в кодах маркировки алкоголя в 1С?

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

При работе с маркировкой алкогольной продукции (пиво, слабоалкогольные напитки, игристые вина) программисты часто сталкиваются с проблемой: код маркировки в формате DataMatrix содержит непечатный символ-разделитель, который "теряется" при сканировании или при передаче данных внутри системы. Разберемся подробно, что это за символ, почему он важен и как настроить программную часть в 1С для корректной работы.

Что такое символ разделителя групп GS?

В соответствии со стандартом GS1, код маркировки DataMatrix состоит из нескольких групп данных (Application Identifiers, AI). Каждая группа начинается с идентификатора применения:

  1. 01 — GTIN товара (14 цифр).
  2. 21 — Серийный номер (переменная длина).
  3. 93 — Код проверки или "криптохвост".

Поскольку серийный номер может иметь переменную длину, системе нужно понимать, где он заканчивается и начинается следующая группа данных. Для этого используется управляющий символ GS (Group Separator), имеющий код ASCII 29 (в шестнадцатеричной системе — 1D). Если этот символ отсутствует, программное обеспечение не сможет правильно "распарсить" код, так как не определит границу между серийным номером и криптохвостом. В результате код маркировки не пройдет проверку в системе "Честный ЗНАК" или ЕГАИС.

Проблема 1: Сканер не видит символ GS

Проанализируем типичную ситуацию: сканер Proton, Zebra или Honeywell подключен в режиме эмуляции клавиатуры (HID). В этом режиме сканер имитирует нажатие клавиш. Поскольку символа с кодом 29 нет на стандартной клавиатуре, сканер либо просто игнорирует его, либо пытается интерпретировать как управляющую команду ОС. В итоге строка длиной 32 символа превращается в строку длиной 31 символ, и структура кода нарушается.

Решение: Перевод сканера в режим эмуляции COM-порта (Virtual COM Port).

Рассмотрим по шагам, как это сделать:

  1. Найдите инструкцию к вашему сканеру (Programming Manual).
  2. Считайте специальный настроечный штрихкод "USB Serial Emulation" или "Enable Uni-Directional USB Serial Emulation".
  3. В операционной системе сканер должен определиться в разделе "Порты (COM и LPT)".
  4. В 1С при настройке оборудования выберите тип соединения "COM-порт" и укажите соответствующий номер порта.

В режиме COM-порта данные передаются в виде "сырого" потока байтов. Это позволяет 1С получить символ Символ(29) в неизменном виде.

Проблема 2: Передача непечатных символов с клиента на сервер

Выясним причину, почему стандартная передача строки может давать сбой. В некоторых версиях платформы 1С при вызове серверной процедуры с передачей строки, содержащей непечатные символы (ASCII < 32), эти символы могут "обрезаться" или заменяться пробелами. Это связано с особенностями сериализации XML/JSON при обмене между клиентом и сервером.

Решение: Использование кодирования в Base64 или URL-кодирования.

Посмотрим на пример кода, как безопасно передать считанную марку на сервер для обработки:


// На клиенте (в модуле формы при получении данных от сканера)
ДанныеШтрихкода = "0104607026342792213+M*aoX" + Символ(29) + "93/Iga"; // Пример кода
СтрокаBase64 = Base64Строка(ДанныеШтрихкода);
ОбработатьМаркуНаСервере(СтрокаBase64);

// На сервере
&НаСервере
Процедура ОбработатьМаркуНаСервере(СтрокаBase64)
    Марка = Base64Значение(СтрокаBase64);
    // Теперь переменная 'Марка' содержит исходную строку со всеми спецсимволами
    // Можно приступать к разбору
КонецПроцедуры

Проблема 3: Разбор (парсинг) кода маркировки

Когда мы получили "чистую" строку со сканера, нам нужно выделить из нее функциональные части. Хранить код в базе рекомендуется целиком, но для поиска по 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.

← На главную