Как устроен штрихкод DataMatrix для лекарств и почему «1С:Розница. Аптека» выдает ошибку при сканировании?

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

Внедрение обязательной маркировки лекарственных средств (ФГИС МДЛП) принесло немало технических сложностей как разработчикам, так и конечным пользователям аптечного ПО. На практике часто возникает ситуация, когда при сканировании штрихкода DataMatrix с упаковки препарата система «1С:Розница. Аптека» наотрез отказывается принимать его, выдавая ошибку вида: "Некорректный штрихкод... (21)Некорректный серийный номер упаковки".

В этой статье мы подробно разберем структуру правильного штрихкода DataMatrix для лекарств, выясним, какую роль играют скрытые управляющие спецсимволы, как правильно настроить торговое оборудование для работы в 1С и как решать проблемы с тестированием в песочнице «Честного ЗНАКа».

1. Какая структура штрихкода DataMatrix считается правильной по закону?

Давайте проанализируем нормативные требования. Характеристики средства идентификации лекарственных препаратов изложены в Постановлении Правительства РФ № 1556. Согласно этому документу, штрихкод формата GS1 DataMatrix должен содержать строго определенные группы данных (идентификаторы применения — AI), разделенные специальными управляющими символами.

Полная структура корректного кода маркировки выглядит следующим образом:

  1. Признак символики Data Matrix: специальный стартовый символ FNC1 (в таблице ASCII имеет код 232). Он сообщает сканеру и учетной системе, что перед ними именно стандартизированный штрихкод группы GS1, а не обычный DataMatrix общего назначения.
  2. Первая группа данных (идентификатор применения AI = 01): Глобальный идентификационный номер торговой единицы (GTIN), состоящий строго из 14 цифр. Например: 0104601764002598. Так как длина этого поля фиксирована (14 символов), разделитель после него не требуется.
  3. Вторая группа данных (идентификатор применения AI = 21): Индивидуальный серийный номер упаковки (S/N), состоящий из 13 символов (цифры и буквы латинского алфавита). После этой группы обязательно должен стоять непечатный символ-разделитель групп GS (в таблице ASCII имеет код 29). Он необходим, так как длина серийного номера теоретически может быть переменной (от 1 до 13 символов), и системе нужно знать, где заканчивается номер и начинается следующий блок.
  4. Третья группа данных (идентификатор применения AI = 91): Идентификатор ключа проверки, состоящий из 4 символов. Данное поле также завершается управляющим символом-разделителем GS (ASCII 29).
  5. Четвертая группа данных (идентификатор применения AI = 92): Код проверки (криптохвост). Ранее в экспериментах использовался длинный 88-символьный хвост, однако в финальной редакции закона для лекарств его размер сократили ровно в два раза — до 44 символов, чтобы код легче считывался с небольших упаковок (ампул, флаконов).

Таким образом, визуальное представление структуры данных штрихкода в текстовом виде выглядит так:

[FNC1] 01 [GTIN] 21 [СерийныйНомер] [GS] 91 [КлючПроверки] [GS] 92 [Криптоподпись]

Рассмотрим реальный пример отсканированной строки из логов драйвера:

010460176400259817211100103988541\x1d21DB050174767955...

Символы \x1d в этой строке — это и есть шестнадцатеричное представление управляющего символа GS (ASCII 29, Group Separator).

2. Почему «1С:Розница» выдает ошибку при сканировании?

Выясним причину, почему аптечная конфигурация считает такой код некорректным. Чаще всего проблема кроется не в самом штрихкоде на упаковке, а в настройке сканера штрихкодов.

По умолчанию большинство 2D-сканеров поставляются настроенными в режиме эмуляции клавиатуры (Keyboard Wedge). При сканировании в блокнот или обычное поле ввода сканер просто «выплевывает» считанные символы как последовательное нажатие клавиш. При этом непечатные символы, такие как GS (ASCII 29), сканер либо полностью игнорирует (вырезает), либо заменяет на другие (например, на управляющую комбинацию Ctrl+] или перевод каретки).

Если сканер вырезает символ GS, строка штрихкода сливается в одну монолитную последовательность:

010460176400259821110010398854191DB0592...

Поскольку длина серийного номера после идентификатора 21 может варьироваться, алгоритм библиотеки маркировки в 1С пытается прочитать ровно 13 символов. Без разделителя GS система забирает лишние символы из следующего идентификатора применения 91, из-за чего разбор кода ломается, и 1С выдает ошибку разбора серийного номера.

3. Как правильно настроить 2D-сканер для работы в 1С?

Чтобы решить проблему с потерей спецсимволов раз и навсегда, выполним следующие шаги по настройке оборудования:

  1. Перевод сканера в режим эмуляции COM-порта (USB-VCOM): Это самый надежный режим работы торгового оборудования. Сканер передает данные в порт в двоичном виде, без эмуляции нажатия клавиш клавиатуры, что гарантирует точную передачу всех непечатных символов в 1С. Найдите в инструкции к вашему сканеру настроечный штрихкод с названием "USB COM Port Emulation" или "Enable Uni-Directional USB Serial Emulation" и отсканируйте его.
  2. Активация режима обработки GS1: Убедитесь, что в сканере включена обработка кодов GS1 и передача символов разделителей. В инструкциях к сканерам Honeywell, Datalogic или Zebra ищите разделы: "GS1 DataMatrix", "Enable GS1-124", "FNC1 Handling" и установите их значения в положение "Enable".
  3. Установка драйверов в ОС: При переключении сканера в режим эмуляции COM-порта в диспетчере устройств Windows появится новое устройство в разделе "Порты (COM и LPT)". Установите виртуальный драйвер производителя сканера (например, Honeywell Virtual COM Port Driver), если операционная система не определила его автоматически.
  4. Настройка подключения в 1С: Перейдем в 1С в меню Администрирование — Подключаемое оборудование. Откроем карточку вашего сканера и выберем порт подключения (например, COM3). Протестируем устройство: при сканировании штрихкода в форме теста в поле данных должны корректно отображаться спецсимволы разделителей групп (обычно в виде символа GS или <GS>).

4. Как программно генерировать и печатать правильный GS1 DataMatrix из 1С?

Если перед вами стоит задача самостоятельно сформировать и распечатать тестовые коды маркировки для проверки бизнес-процессов, рассмотрим, как это сделать программно в среде 1С.

Для генерации правильного штрихкода воспользуемся встроенной компонентой «1С:Печать штрихкодов» (Native). Чтобы компонента автоматически подставила обязательный стартовый символ FNC1, ей необходимо явно указать правильный тип кода.

Проанализируем пример кода для программного формирования структуры DataMatrix:


// Функция формирует строку для передачи в генератор штрихкодов
Функция СформироватьСтрокуGS1DataMatrix(GTIN, СерийныйНомер, КлючПроверки, Криптоподпись) Экспорт

    // Символ GS (Group Separator) с кодом ASCII 29
    СимволGS = Символ(29); 
    
    // Собираем строку в соответствии с требованиями стандартов GS1
    // Идентификаторы применения: 01 (GTIN), 21 (S/N), 91 (Ключ), 92 (Подпись)
    СтрокаКода = "01" + GTIN 
               + "21" + СерийныйНомер + СимволGS 
               + "91" + КлючПроверки + СимволGS 
               + "92" + Криптоподпись;
               
    Возврат СтрокаКода;

КонецФункции

При передаче полученной строки в макет печати или на форму, где располагается графический объект компоненты генерации штрихкода, обязательно установите свойство ТипКода = 24. Именно этот тип отвечает за стандарт GS1 DataMatrix. Если вы по ошибке выберете типы 18 (обычный DataMatrix ASCII) или 19 (DataMatrix Base256), система не добавит стартовый спецсимвол FNC1, и такой штрихкод будет признан невалидным при проверке в кассовом ПО.

5. Проблема тестовых GTIN в песочнице «Честного ЗНАКа»

Рассмотрим еще одну распространенную проблему, с которой сталкиваются разработчики при отладке приемки товаров в тестовом контуре (песочнице). Очень часто при попытке проверить уведомление о приемке в панели МДЛП программа выдает ошибку валидации штрихкода.

Выясним причину: в тестовой среде «Честного ЗНАКа» многие демонстрационные товары зарегистрированы с заведомо невалидным контрольным разрядом GTIN. Например, у тестового GTIN 50754041398765 на конце стоит цифра 5, хотя при расчете по стандартному алгоритму GS1 (Modulo 10) контрольное число должно быть равно 7.

Поскольку официальная техподдержка ЦРПТ допускает использование таких кодов в песочнице для отладки передачи документов, их система пропускает эти GTIN. Однако типовой код 1С (модули проверки штрихкодов в Библиотеке подключаемого оборудования) жестко контролирует правильность вычисления контрольного разряда. В результате легальный для песочницы код отбраковывается самой конфигурацией 1С.

У программиста есть два пути решения этой проблемы на время тестирования:

Вариант А: Самостоятельный расчет правильного GTIN. При генерации собственных тестовых данных в песочнице всегда самостоятельно рассчитывайте последнюю цифру GTIN с помощью стандартного алгоритма GS1. Это позволит избежать конфликтов с БПО 1С.

Вариант Б: Временное отключение проверки в коде 1С. С помощью механизма расширений конфигурации можно временно отключить проверку контрольного разряда в общем модуле, отвечающем за валидацию штрихкодов маркировки. Например, переопределив функцию возврата валидности на безусловное значение Истина при работе в тестовой базе:


&Вместо("ПроверитьКонтрольныйСимволGTIN")
Функция Тест_ПроверитьКонтрольныйСимволGTIN(GTIN)
    // На время тестирования в песочнице возвращаем Истина
    Возврат Истина;
КонецФункции

После завершения этапа отладки и перед переходом в промышленный контур данное расширение необходимо обязательно отключить, чтобы система корректно отсекала реальные ошибки ввода со стороны пользователей.

← На главную