Применяется ли контрольный разряд GTIN для лекарственных препаратов в 1С и как исправить ошибку «Некорректный GTIN»?

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

При интеграции решений на платформе 1С (например, 1С:Розница. Аптека или 1С:Управление нашей фирмой) с государственной информационной системой мониторинга движения лекарственных препаратов (ИС МДЛП) технические специалисты часто сталкиваются с непредвиденным поведением системы на этапе тестирования. Одним из наиболее частых препятствий становится системное сообщение «Некорректный GTIN» при попытке считать штрихкод или принять документ в тестовом контуре (так называемой «песочнице»).

В этой статье мы подробно разберем, применяется ли контрольный разряд для маркировки лекарственных средств, проанализируем математическую логику проверки штрихкодов стандарта GS1, выясним причины расхождения данных в тестовых базах данных Честного Знака и предложим готовые варианты решения этой проблемы на уровне программного кода 1С.

---

Суть проблемы: почему 1С ругается на GTIN из песочницы

Рассмотрим стандартную рабочую ситуацию. При попытке выполнить приемку упаковок лекарственных препаратов или обработать входящее уведомление от ИС МДЛП в конфигурации, содержащей стандартную библиотеку интеграции с маркировкой, система выдает ошибку валидации штрихкода. Например, при сканировании тестового GTIN лекарственного средства 50754041398745 программа прерывает выполнение операции, сообщая, что контрольный разряд не соответствует ожидаемому (вместо фактически переданной цифры 5 на конце должна быть цифра 3).

Возникает закономерный вопрос: это ошибка в логике конфигурации 1С, которая слишком жестко валидирует входящие данные, или же это некорректно заведенные карточки номенклатуры в тестовом контуре самого Честного Знака?

---

Применяется ли контрольный разряд для лекарственных средств?

Ответ однозначный: да, применяется в обязательном порядке. Согласно правилам международной ассоциации GS1 и требованиям Постановления Правительства РФ от 14.12.2018 №1556 (регулирующего маркировку лекарственных препаратов), для идентификации упаковок лекарственных средств используется строго 14-значный код формата GTIN-14.

Структура кода формата GTIN-14 выглядит следующим образом:

  1. Индикатор упаковки (1-й разряд): цифра от 0 до 9, обозначающая уровень упаковки (групповая, индивидуальная и т.д.).
  2. Префикс предприятия GS1 и код товара (со 2-го по 13-й разряд): уникальный идентификатор держателя регистрационного удостоверения и конкретной торговой единицы.
  3. Контрольный разряд (14-й разряд): рассчитывается на основе первых 13 цифр по стандартизированному алгоритму Modulo-10 (Модуль 10). Этот разряд необходим для предотвращения случайных ошибок считывания сканером штрихкода или ручного ввода данных.

---

Математический разбор алгоритма расчета контрольного разряда

Чтобы убедиться в правоте логики платформы 1С, проанализируем ситуацию математически. Проверим контрольные цифры для двух проблемных кодов, часто встречающихся в демонстрационных базах песочницы ИС МДЛП.

Алгоритм расчета контрольной цифры Modulo-10 для 14-значного штрихкода выполняется по следующим шагам:

  1. Выписываем первые 13 цифр кода.
  2. Начиная справа налево (с 13-й цифры к 1-й), присваиваем каждой позиции множители: для нечетных позиций (справа налево) множитель равен 3, для четных — 1. Для 14-значного кода это означает, что все цифры на нечетных позициях (1-я, 3-я, 5-я и т.д.) умножаются на 3, а на четных — на 1.
  3. Складываем все полученные произведения.
  4. Определяем, какое минимальное число, кратное 10, больше или равно полученной сумме.
  5. Вычитаем из этого числа полученную сумму. Разность и есть искомый контрольный разряд.

Пример 1. Анализ кода 50754041398745

Выделим первые 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 на конце является грубой ошибкой формирования штрихкода.

Пример 2. Анализ кода 50754041398765

Выделим первые 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.

Однако в тестовом контуре (песочнице) данные зачастую генерируются упрощенными скриптами-заполнителями или вносятся вручную операторами для проведения быстрых синтетических тестов. В результате этого контролирующие алгоритмы на стороне песочницы могут быть частично отключены, что и приводит к попаданию «битых» данных в базу, которые затем вызывают сбои в учетных системах интеграторов.

---

Как решить проблему в 1С:Розница и других конфигурациях

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

Вариант 1. Использование математически корректных GTIN

Самый правильный и безопасный путь — отказаться от использования ошибочных кодов, предоставленных по умолчанию в тестовых примерах. Вы можете самостоятельно сгенерировать корректную последовательность цифр, рассчитав контрольный символ. Используйте в тестовых XML-файлах и на этикетках исправленные штрихкоды: например, замените некорректный 50754041398745 на правильный 50754041398743. Система 1С примет такой штрихкод без возражений.

Вариант 2. Программное отключение проверки в коде 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С, должны использоваться исключительно локально на этапе разработки или в тестовой базе. При переносе доработок в продуктивный контур (в рабочую базу аптеки) данную заглушку необходимо полностью удалить. В противном случае система начнет пропускать действительно поврежденные штрихкоды, что приведет к пересортице и серьезным штрафным санкциям со стороны регулирующих органов.

← На главную