Внедрение обязательной маркировки лекарственных средств (ФГИС МДЛП) принесло немало технических сложностей как разработчикам, так и конечным пользователям аптечного ПО. На практике часто возникает ситуация, когда при сканировании штрихкода DataMatrix с упаковки препарата система «1С:Розница. Аптека» наотрез отказывается принимать его, выдавая ошибку вида: "Некорректный штрихкод... (21)Некорректный серийный номер упаковки".
В этой статье мы подробно разберем структуру правильного штрихкода DataMatrix для лекарств, выясним, какую роль играют скрытые управляющие спецсимволы, как правильно настроить торговое оборудование для работы в 1С и как решать проблемы с тестированием в песочнице «Честного ЗНАКа».
Давайте проанализируем нормативные требования. Характеристики средства идентификации лекарственных препаратов изложены в Постановлении Правительства РФ № 1556. Согласно этому документу, штрихкод формата GS1 DataMatrix должен содержать строго определенные группы данных (идентификаторы применения — AI), разделенные специальными управляющими символами.
Полная структура корректного кода маркировки выглядит следующим образом:
FNC1 (в таблице ASCII имеет код 232). Он сообщает сканеру и учетной системе, что перед ними именно стандартизированный штрихкод группы GS1, а не обычный DataMatrix общего назначения.0104601764002598. Так как длина этого поля фиксирована (14 символов), разделитель после него не требуется.GS (в таблице ASCII имеет код 29). Он необходим, так как длина серийного номера теоретически может быть переменной (от 1 до 13 символов), и системе нужно знать, где заканчивается номер и начинается следующий блок.GS (ASCII 29).Таким образом, визуальное представление структуры данных штрихкода в текстовом виде выглядит так:
[FNC1] 01 [GTIN] 21 [СерийныйНомер] [GS] 91 [КлючПроверки] [GS] 92 [Криптоподпись]
Рассмотрим реальный пример отсканированной строки из логов драйвера:
010460176400259817211100103988541\x1d21DB050174767955...
Символы \x1d в этой строке — это и есть шестнадцатеричное представление управляющего символа GS (ASCII 29, Group Separator).
Выясним причину, почему аптечная конфигурация считает такой код некорректным. Чаще всего проблема кроется не в самом штрихкоде на упаковке, а в настройке сканера штрихкодов.
По умолчанию большинство 2D-сканеров поставляются настроенными в режиме эмуляции клавиатуры (Keyboard Wedge). При сканировании в блокнот или обычное поле ввода сканер просто «выплевывает» считанные символы как последовательное нажатие клавиш. При этом непечатные символы, такие как GS (ASCII 29), сканер либо полностью игнорирует (вырезает), либо заменяет на другие (например, на управляющую комбинацию Ctrl+] или перевод каретки).
Если сканер вырезает символ GS, строка штрихкода сливается в одну монолитную последовательность:
010460176400259821110010398854191DB0592...
Поскольку длина серийного номера после идентификатора 21 может варьироваться, алгоритм библиотеки маркировки в 1С пытается прочитать ровно 13 символов. Без разделителя GS система забирает лишние символы из следующего идентификатора применения 91, из-за чего разбор кода ломается, и 1С выдает ошибку разбора серийного номера.
Чтобы решить проблему с потерей спецсимволов раз и навсегда, выполним следующие шаги по настройке оборудования:
"USB COM Port Emulation" или "Enable Uni-Directional USB Serial Emulation" и отсканируйте его."GS1 DataMatrix", "Enable GS1-124", "FNC1 Handling" и установите их значения в положение "Enable".COM3). Протестируем устройство: при сканировании штрихкода в форме теста в поле данных должны корректно отображаться спецсимволы разделителей групп (обычно в виде символа GS или <GS>).Если перед вами стоит задача самостоятельно сформировать и распечатать тестовые коды маркировки для проверки бизнес-процессов, рассмотрим, как это сделать программно в среде 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, и такой штрихкод будет признан невалидным при проверке в кассовом ПО.
Рассмотрим еще одну распространенную проблему, с которой сталкиваются разработчики при отладке приемки товаров в тестовом контуре (песочнице). Очень часто при попытке проверить уведомление о приемке в панели МДЛП программа выдает ошибку валидации штрихкода.
Выясним причину: в тестовой среде «Честного ЗНАКа» многие демонстрационные товары зарегистрированы с заведомо невалидным контрольным разрядом GTIN. Например, у тестового GTIN 50754041398765 на конце стоит цифра 5, хотя при расчете по стандартному алгоритму GS1 (Modulo 10) контрольное число должно быть равно 7.
Поскольку официальная техподдержка ЦРПТ допускает использование таких кодов в песочнице для отладки передачи документов, их система пропускает эти GTIN. Однако типовой код 1С (модули проверки штрихкодов в Библиотеке подключаемого оборудования) жестко контролирует правильность вычисления контрольного разряда. В результате легальный для песочницы код отбраковывается самой конфигурацией 1С.
У программиста есть два пути решения этой проблемы на время тестирования:
Вариант А: Самостоятельный расчет правильного GTIN. При генерации собственных тестовых данных в песочнице всегда самостоятельно рассчитывайте последнюю цифру GTIN с помощью стандартного алгоритма GS1. Это позволит избежать конфликтов с БПО 1С.
Вариант Б: Временное отключение проверки в коде 1С. С помощью механизма расширений конфигурации можно временно отключить проверку контрольного разряда в общем модуле, отвечающем за валидацию штрихкодов маркировки. Например, переопределив функцию возврата валидности на безусловное значение Истина при работе в тестовой базе:
&Вместо("ПроверитьКонтрольныйСимволGTIN")
Функция Тест_ПроверитьКонтрольныйСимволGTIN(GTIN)
// На время тестирования в песочнице возвращаем Истина
Возврат Истина;
КонецФункции
После завершения этапа отладки и перед переходом в промышленный контур данное расширение необходимо обязательно отключить, чтобы система корректно отсекала реальные ошибки ввода со стороны пользователей.