При работе с маркировкой лекарственных препаратов (МДЛП) разработчики часто сталкиваются с ситуацией, когда типовые механизмы БПО (Библиотеки подключаемого оборудования) выдают ошибку при попытке разобрать штрихкод. Самая распространенная проблема — некорректное определение длины серийного номера. В этой статье мы подробно разберем, почему возникает ошибка «Длина значения переменной части больше требуемой», и как правильно настроить программный код и оборудование для корректного считывания DataMatrix.
Для начала проанализируем, из чего состоит код маркировки лекарственного средства. В отличие от обычных QR-кодов, здесь используется стандарт DataMatrix ECC200, соответствующий спецификации GS1. Код состоит из нескольких групп данных, называемых идентификаторами применения (AI — Application Identifiers):
Ключевая особенность здесь заключается в том, что серийный номер (AI 21) имеет переменную длину. Чтобы алгоритм разбора 1С понял, где заканчивается серийный номер и начинается следующий блок (AI 91), в коде должен присутствовать специальный непечатный символ-разделитель — FNC1 (в кодировке ASCII это символ с кодом 29, известный как GS — Group Separator).
Рассмотрим ситуацию: при сканировании штрихкода 010358291003957021A2WWTWR09A256/91EE06... система выдает ошибку, что длина секции 21 составляет 65 символов вместо положенных 20. Проанализируем этот момент: если в строке отсутствует символ разделителя GS, процедура РазобратьШтриховойКодТовара не видит границы между серийным номером и криптохвостом. В результате она пытается включить всю оставшуюся часть строки в серийный номер, что и приводит к превышению лимита.
Часто проблема кроется в настройках сканера. Если сканер работает в режиме Keyboard Wedge (разрыв клавиатуры), он может просто игнорировать непечатный символ ASCII 29 или заменять его на другой знак, например, на косую черту /, как это часто делают бюджетные китайские сканеры.
Для корректной работы на мобильных устройствах и ТСД под управлением Android мы рекомендуем использовать следующие подходы:
ASCII 29, можно настроить его так, чтобы он заменял GS на печатный символ, который редко встречается в маркировке (например, # или |).Если мы получаем штрихкод с «неправильным» разделителем, нам необходимо выполнить его нормализацию перед вызовом типовых функций разбора. Рассмотрим пример кода, который подготавливает строку к разбору, если сканер заменяет разделитель на символ косой черты /.
// Пример нормализации штрихкода перед разбором
Функция ПодготовитьШтрихкодКРазбору(ИсходныйШтрихкод) Экспорт
// Символ ASCII 29, который ожидает типовая библиотека
РазделительGS1 = Символ(29);
// Если сканер присылает '/' вместо разделителя, делаем замену
// Важно: убедитесь, что '/' не является частью данных в вашем случае
ОбработанныйШтрихкод = СтрЗаменить(ИсходныйШтрихкод, "/", РазделительGS1);
Возврат ОбработанныйШтрихкод;
КонецФункции
После того как мы восстановили символ GS, можно обращаться к типовым процедурам БПО. Посмотрим на пример вызова функции разбора:
Процедура ОбработатьСканирование(ДанныеСканирования)
Штрихкод = ПодготовитьШтрихкодКРазбору(ДанныеСканирования);
ПараметрыРазбора = МенеджерОборудованияМаркировкаКлиентСервер.ПараметрыРазбораШтрихкода();
РезультатРазбора = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Штрихкод, ПараметрыРазбора);
Если РезультатРазбора.Результат Тогда
// Извлекаем нужные данные
ДанныеМДЛП = РезультатРазбора.ДанныеМДЛП;
GTIN = ДанныеМДЛП.GTIN;
СерийныйНомер = ДанныеМДЛП.СерийныйНомер;
// Продолжаем логику обработки
Иначе
Сообщить("Ошибка разбора: " + РезультатРазбора.Ошибка);
КонецЕсли;
КонецПроцедуры
Для работы именно с лекарственными препаратами мы советуем обратить внимание на специализированную библиотеку БИМ. В ней реализованы более глубокие алгоритмы проверки и нормализации, учитывающие специфику отрасли. Проанализируем возможности модуля МаркировкаМДЛПКлиентСервер. В отраслевых решениях, таких как «1С:Аптека», часто используются расширенные функции разбора, которые умеют определять тип кода даже при частичном нарушении структуры.
Важный совет: При тестировании сканера на ТСД всегда проверяйте, что именно приходит в 1С. Для этого можно временно выводить считанную строку в текстовое сообщение с заменой всех символов на их коды. Это поможет быстро понять, какой символ-разделитель присылает оборудование.
// Код для диагностики символов в штрихкоде
Для НомерСимвола = 1 По СтрДлина(Штрихкод) Цикл
ТекСимвол = Сред(Штрихкод, НомерСимвола, 1);
Сообщить("Символ: " + ТекСимвол + " Код: " + КодСимвола(ТекСимвол));
КонецЦикла;
Таким образом, правильный разбор DataMatrix кода лекарственной продукции сводится к трем этапам: диагностика реального символа-разделителя, передаваемого сканером; программная замена этого символа на стандартный Символ(29); и последующий вызов типовых функций разбора из состава БПО или БИМ.