При интеграции решений на платформе 1С (например, 1С:Розница. Аптека или 1С:Управление нашей фирмой) с государственной информационной системой мониторинга движения лекарственных препаратов (ИС МДЛП) технические специалисты часто сталкиваются с непредвиденным поведением системы на этапе тестирования. Одним из наиболее частых препятствий становится системное сообщение «Некорректный GTIN» при попытке считать штрихкод или принять документ в тестовом контуре (так называемой «песочнице»).
В этой статье мы подробно разберем, применяется ли контрольный разряд для маркировки лекарственных средств, проанализируем математическую логику проверки штрихкодов стандарта GS1, выясним причины расхождения данных в тестовых базах данных Честного Знака и предложим готовые варианты решения этой проблемы на уровне программного кода 1С.
---
Рассмотрим стандартную рабочую ситуацию. При попытке выполнить приемку упаковок лекарственных препаратов или обработать входящее уведомление от ИС МДЛП в конфигурации, содержащей стандартную библиотеку интеграции с маркировкой, система выдает ошибку валидации штрихкода. Например, при сканировании тестового GTIN лекарственного средства 50754041398745 программа прерывает выполнение операции, сообщая, что контрольный разряд не соответствует ожидаемому (вместо фактически переданной цифры 5 на конце должна быть цифра 3).
Возникает закономерный вопрос: это ошибка в логике конфигурации 1С, которая слишком жестко валидирует входящие данные, или же это некорректно заведенные карточки номенклатуры в тестовом контуре самого Честного Знака?
---
Ответ однозначный: да, применяется в обязательном порядке. Согласно правилам международной ассоциации GS1 и требованиям Постановления Правительства РФ от 14.12.2018 №1556 (регулирующего маркировку лекарственных препаратов), для идентификации упаковок лекарственных средств используется строго 14-значный код формата GTIN-14.
Структура кода формата GTIN-14 выглядит следующим образом:
---
Чтобы убедиться в правоте логики платформы 1С, проанализируем ситуацию математически. Проверим контрольные цифры для двух проблемных кодов, часто встречающихся в демонстрационных базах песочницы ИС МДЛП.
Алгоритм расчета контрольной цифры Modulo-10 для 14-значного штрихкода выполняется по следующим шагам:
Выделим первые 13 цифр: 5 0 7 5 4 0 4 1 3 9 8 7 4.
Выполним расчет суммы с учетом весовых коэффициентов:
Сложим полученные результаты: 15 + 0 + 21 + 5 + 12 + 0 + 12 + 1 + 9 + 9 + 24 + 7 + 12 = 127.
Ближайшее большее число, кратное 10 — это 130.
Вычисляем контрольное число: 130 - 127 = 3.
Таким образом, математически верный код должен оканчиваться на тройку: 50754041398743. Значение 5 на конце является грубой ошибкой формирования штрихкода.
Выделим первые 13 цифр: 5 0 7 5 4 0 4 1 3 9 8 7 6.
Суммируем произведения:
(5*3)+(0*1)+(7*3)+(5*1)+(4*3)+(0*1)+(4*3)+(1*1)+(3*3)+(9*1)+(8*3)+(7*1)+(6*3) = 15+0+21+5+12+0+12+1+9+9+24+7+18 = 133.
Ближайшее число, кратное 10 — это 140.
Вычисляем контрольное число: 140 - 133 = 7.
Правильный GTIN должен иметь вид: 50754041398767. И здесь тестовый стенд предлагает некорректный символ 5.
---
В промышленном («боевом») контуре ИС МДЛП появление ошибочных карточек товаров технически исключено. При первичной регистрации лекарственного препарата в Национальном каталоге система автоматически вычисляет контрольную сумму и блокирует создание записей с невалидным кодом GTIN.
Однако в тестовом контуре (песочнице) данные зачастую генерируются упрощенными скриптами-заполнителями или вносятся вручную операторами для проведения быстрых синтетических тестов. В результате этого контролирующие алгоритмы на стороне песочницы могут быть частично отключены, что и приводит к попаданию «битых» данных в базу, которые затем вызывают сбои в учетных системах интеграторов.
---
Проанализируем методы обхода данной ошибки для успешного завершения этапа тестирования вашего программного обеспечения.
Самый правильный и безопасный путь — отказаться от использования ошибочных кодов, предоставленных по умолчанию в тестовых примерах. Вы можете самостоятельно сгенерировать корректную последовательность цифр, рассчитав контрольный символ. Используйте в тестовых XML-файлах и на этикетках исправленные штрихкоды: например, замените некорректный 50754041398745 на правильный 50754041398743. Система 1С примет такой штрихкод без возражений.
Если специфика вашего тестирования требует работы именно с теми идентификаторами, которые жестко прописаны на стороне песочницы, вы можете временно деактивировать проверку контрольного разряда в общем модуле интеграции с МДЛП.
Рассмотрим, как устроена типичная функция валидации в модулях интеграции. Логика проверки базируется на вычислении остатка от деления. Давайте изучим пример кода, реализующий алгоритм расчета контрольной цифры:
Функция РассчитатьКонтрольныйСимволGTIN(Знач СтрокаGTIN) Экспорт
// Удаляем лишние пробелы и проверяем длину входной строки
СтрокаGTIN = СокрЛП(СтрокаGTIN);
ДлинаКода = СтрДлина(СтрокаGTIN);
Если ДлинаКода <> 14 Тогда
// Возвращаем пустую строку, если это не GTIN-14
Возврат "";
КонецЕсли;
Сумма = 0;
// Нам нужны первые 13 цифр для расчета
Для Индекс = 1 По 13 Цикл
Цифра = Число(Сред(СтрокаGTIN, Индекс, 1));
// Четные позиции (начиная слева) умножаются на 1, нечетные на 3
Если Индекс % 2 = 0 Тогда
Сумма = Сумма + Цифра * 1;
Иначе
Сумма = Сумма + Цифра * 3;
КонецЕсли;
КонецЦикла;
Остаток = Сумма % 10;
Если Остаток = 0 Тогда
ВычисленныйРазряд = 0;
Иначе
ВычисленныйРазряд = 10 - Остаток;
КонецЕсли;
Возврат Формат(ВычисленныйРазряд, "ЧЦ=1; ЧГ=0");
КонецФункции
Для того чтобы обойти проверку в процессе отладки, найдите место вызова этой функции в общем модуле (например, в модуле ИнтеграцияМДЛПКлиентСервер или аналогичном в вашей версии библиотеки интеграции). Обычно вызов выглядит следующим образом:
ВычисленныйСимвол = РассчитатьКонтрольныйСимволGTIN(ТекущийGTIN);
ФактическийСимвол = Прав(ТекущийGTIN, 1);
Если ВычисленныйСимвол <> ФактическийСимвол Тогда
// Вызывается исключение, блокирующее работу пользователя
ВызватьИсключение "Некорректный GTIN!";
КонецЕсли;
Проанализируем, как можно безопасно модифицировать этот участок кода для тестовой базы. Мы можем добавить проверку режима отладки или временно закомментировать вызов исключения:
ВычисленныйСимвол = РассчитатьКонтрольныйСимволGTIN(ТекущийGTIN);
ФактическийСимвол = Прав(ТекущийGTIN, 1);
Если ВычисленныйСимвол <> ФактическийСимвол Тогда
// Добавляем предупреждение в журнал регистрации вместо жесткого падения системы
ЗаписьЖурналаРегистрации("ИнтеграцияМДЛП",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Внимание: Некорректный контрольный разряд для GTIN: " + ТекущийGTIN);
// Для рабочей базы данную проверку ОБЯЗАТЕЛЬНО нужно вернуть обратно!
// ВызватьИсключение "Некорректный GTIN!";
КонецЕсли;
Важное предупреждение: Любые изменения, отключающие проверку контрольной суммы в кодовой базе 1С, должны использоваться исключительно локально на этапе разработки или в тестовой базе. При переносе доработок в продуктивный контур (в рабочую базу аптеки) данную заглушку необходимо полностью удалить. В противном случае система начнет пропускать действительно поврежденные штрихкоды, что приведет к пересортице и серьезным штрафным санкциям со стороны регулирующих органов.