При автоматизации учета в фармацевтической отрасли одной из наиболее трудоемких задач является сопоставление внутренней номенклатуры 1С с данными Государственного реестра лекарственных средств (ГРЛС). Основная сложность заключается в том, что реестр цен на жизненно необходимые и важнейшие лекарственные препараты (ЖНВЛП) содержит штрих-коды, что позволяет легко связать данные, тогда как основной реестр лекарственных средств (ГРЛС), где находятся препараты, не входящие в список ЖНВЛП, зачастую лишен этой информации. В этой статье мы разберем, как обойти это ограничение и корректно загрузить номера и даты регистрационных удостоверений (РУ).
Рассмотрим ситуацию подробнее. На портале Минздрава существует два ключевых раздела: реестр предельных отпускных цен (ЖНВЛП) и общий реестр зарегистрированных лекарственных средств. В первом случае мы имеем привязку к штрих-коду производителя (GTIN), что делает загрузку тривиальной. Во втором случае — для «обычных» лекарств — штрих-коды в открытых таблицах на сайте отсутствуют. Выясним причину: ГРЛС исторически строился как реестр разрешительных документов, а не как товарный каталог, поэтому связь «РУ — Упаковка — Штрих-код» там реализована неявно.
Проанализируем предложение опытных разработчиков: вместо парсинга веб-страниц или поиска по штрих-коду следует скачивать полные справочники, которые Минздрав предоставляет в формате XML. Эти файлы содержат внутренние идентификаторы связей между регистрационным удостоверением и формами выпуска препарата.
Разберем алгоритм работы с такими данными:
ЧтениеXML для обхода структуры файла.Если прямой идентификатор отсутствует, нам придется использовать метод нечеткого сопоставления. Как отмечалось в обсуждении, данные в реестрах часто бывают «кривыми» (разные сокращения, лишние пробелы, кавычки), поэтому их необходимо предварительно нормализовать. Сформируем «композитный ключ», который позволит однозначно идентифицировать препарат.
В состав такого ключа должны входить следующие параметры:
Рассмотрим пример функции для нормализации строки в 1С, которая поможет нам при сопоставлении:
Функция НормализоватьНаименование(Знач ВходнаяСтрока) Экспорт
Результат = СокрЛП(Врег(ВходнаяСтрока));
// Удаляем лишние символы, которые могут мешать поиску
СимволыДляУдаления = ".,()""'№";
Для Индекс = 1 По СтрДлина(СимволыДляУдаления) Цикл
Символ = Сред(СимволыДляУдаления, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, "");
КонецЦикла;
// Заменяем распространенные сокращения
Результат = СтрЗаменить(Результат, " МГ", "МГ");
Результат = СтрЗаменить(Результат, " МЛ", "МЛ");
Возврат СокрЛП(Результат);
КонецФункции
Современный способ решения задачи, который не был доступен ранее, — это использование Единого структурированного справочника лекарственных препаратов (ЕСКЛП) и данных системы маркировки (МДЛП). На сегодняшний день маркировка обязательна для всех лекарств, включая не ЖНВЛП.
Посмотрим, как это упрощает нам жизнь:
Номенклатура или СерииНоменклатуры.Если у вас есть номер регистрационного удостоверения, но нет его даты или других подробностей, можно выполнить обратный поиск. В реестре ГРЛС поиск по номеру РУ работает достаточно стабильно. Проанализируем ситуацию: если мы загружаем накладную от поставщика (например, через ЭДО), там часто уже указан номер РУ. Мы можем использовать этот номер как зацепку для получения актуальной даты регистрации и срока действия из ГРЛС.
Для автоматизации этого процесса в 1С можно использовать HTTP-запросы к поисковой форме реестра, однако это требует написания парсера HTML-ответа, что менее надежно, чем работа с XML-дампами.
Рассмотрим пошагово, как реализовать механизм загрузки:
Шаг 1. Подготовка справочника. Добавьте в справочник Номенклатура дополнительные реквизиты: НомерРУ (Строка), ДатаРУ (Дата), ID_ГРЛС (Строка). Это позволит хранить связь с реестром.
Шаг 2. Загрузка первичных данных. Реализуйте обработку, которая скачивает XML с сайта Минздрава и загружает его во временную таблицу или в специально созданный вспомогательный справочник (кеш реестра).
Шаг 3. Сопоставление. Создайте рабочее место для оператора или автоматический алгоритм, который будет пытаться найти соответствие. Пример логики поиска:
// Пример логики сопоставления
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеестрГРЛС.НомерРУ,
| РеестрГРЛС.ДатаРегистрации
|ИЗ
| Справочник.ВспомогательныйРеестрГРЛС КАК РеестрГРЛС
|ГДЕ
| РеестрГРЛС.НаименованиеНормализованное = &Наименование1С";
Запрос.УстановитьПараметр("Наименование1С", НормализоватьНаименование(ТекНоменклатура.Наименование));
// ... выполнение запроса и запись результата в карточку товара
Несмотря на отсутствие прямой связи через штрих-код в некоторых разделах ГРЛС, задача получения регистрационных удостоверений решаема. Наиболее эффективным подходом является комбинация использования XML-дампов ГРЛС для получения структуры связей и использование API МДЛП («Честный ЗНАК») для получения данных по штрих-кодам. Помните, что данные в государственных реестрах требуют обязательной предварительной нормализации (очистки от лишних символов и приведения к единому стандарту сокращений).