Как программно реализовать подкачку файла ЖНВЛП с сайта Минздрава в 1С

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

Автоматизация загрузки реестра предельных отпускных цен на жизненно необходимые и важнейшие лекарственные препараты (ЖНВЛП) — критически важная задача для аптечных сетей и медицинских учреждений. Сайт Государственного реестра лекарственных средств (ГРЛС) предоставляет данные в виде файлов, однако прямая ссылка на них не является постоянной. В этой статье мы разберем, как программно обойти ограничения сайта и настроить автоматическое получение данных в вашу конфигурацию 1С.

Проблема динамических ссылок и почему простой метод не работает

При попытке использовать стандартную команду КопироватьФайл с фиксированным URL-адресом многие разработчики сталкиваются с тем, что файл не скачивается или сервер возвращает ошибку. Это происходит потому, что ссылки на портале ГРЛС генерируются динамически. В параметрах ссылки присутствуют такие переменные, как FileGUID и UserReq, которые привязаны к текущей сессии пользователя. Проанализируем ситуацию: сервер ожидает, что запрос придет от реального браузера, который сначала загрузил основную страницу реестра, а затем инициировал скачивание.

Алгоритм реализации программной загрузки

Для успешного решения задачи нам необходимо воспроизвести поведение пользователя по шагам. Рассмотрим подробнее этот процесс:

  1. Установка защищенного соединения с сервером Минздрава.
  2. Выполнение GET-запроса к странице поиска цен для получения HTML-кода.
  3. Парсинг (анализ) полученного HTML-кода для поиска актуальной ссылки на файл.
  4. Выполнение повторного GET-запроса по найденной ссылке для получения двоичных данных файла.
  5. Сохранение данных в локальный файл на диске или в хранилище значений.

Шаг 1. Настройка защищенного соединения

Сайт Минздрава работает по протоколу HTTPS. Для корректной работы 1С с защищенными ресурсами нам потребуется объект ЗащищенноеСоединениеOpenSSL. Без него попытка подключения может завершиться ошибкой сертификата. Разберем пример создания соединения:


Сервер = "grls.rosminzdrav.ru";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение(Сервер, , , , , 30, Защита);

Здесь мы указываем таймаут 30 секунд, что важно для государственных порталов, которые могут отвечать с задержкой при высокой нагрузке.

Шаг 2. Получение и парсинг страницы

Теперь нам нужно загрузить содержимое страницы, на которой расположена иконка скачивания. Мы будем искать в тексте страницы фрагмент ссылки, содержащий обработчик GetLimPrice.ashx или GetGRLS.ashx. Посмотрим на пример кода, который выполняет первичный запрос и извлекает ссылку:


Запрос = Новый HTTPЗапрос("/pricelims.aspx?s=&m=mnn");
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124 Safari/537.37");

Ответ = HTTPСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
    
    // Ищем вхождение ссылки на скачивание
    ПоискСтроки = "GetLimPrice.ashx?FileGUID=";
    ПозицияНачала = СтрНайти(ТекстСтраницы, ПоискСтроки);
    
    Если ПозицияНачала > 0 Тогда
        // Вырезаем ссылку до кавычки или другого разделителя
        ОстатокТекста = Сред(ТекстСтраницы, ПозицияНачала);
        ПозицияКонца = СтрНайти(ОстатокТекста, "'"); 
        Если ПозицияКонца = 0 Тогда
            ПозицияКонца = СтрНайти(ОстатокТекста, """");
        КонецЕсли;
        
        ОтносительнаяСсылка = Лев(ОстатокТекста, ПозицияКонца - 1);
        Сообщить("Найдена актуальная ссылка: " + ОтносительнаяСсылка);
    Иначе
        Сообщить("Не удалось найти ссылку на файл на странице.");
    КонецЕсли;
КонецЕсли;

Важный момент: Обратите внимание на заголовок User-Agent. Серверы ГРЛС часто блокируют запросы от системных библиотек, поэтому мы имитируем работу браузера Chrome.

Шаг 3. Скачивание двоичных данных файла

Когда «свежая» ссылка получена, мы выполняем второй запрос. Результат этого запроса уже не текст, а двоичные данные (ZIP-архив или Excel-файл). Проанализируем пример завершения загрузки:


ЗапросНаФайл = Новый HTTPЗапрос("/" + ОтносительнаяСсылка);
ЗапросНаФайл.Заголовки.Вставить("User-Agent", "Mozilla/5.0");
ЗапросНаФайл.Заголовки.Вставить("Referer", "http://grls.rosminzdrav.ru/pricelims.aspx");

ОтветФайл = HTTPСоединение.Получить(ЗапросНаФайл);
Если ОтветФайл.КодСостояния = 200 Тогда
    ДвоичныеДанные = ОтветФайл.ПолучитьТелоКакДвоичныеДанные();
    ПутьКФайлу = "C:\Temp\grls_data.zip";
    ДвоичныеДанные.Записать(ПутьКФайлу);
    Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Иначе
    Сообщить("Ошибка при скачивании файла. Код: " + ОтветФайл.КодСостояния);
КонецЕсли;

Использование заголовка Referer крайне желательно, так как он указывает серверу, что мы перешли к скачиванию именно со страницы реестра, что подтверждает легитимность запроса в глазах систем защиты сайта.

Современные альтернативы: ЕСКЛП и 1С:Номенклатура

Разберем ситуацию, когда ручной парсинг сайта ГРЛС кажется слишком трудоемким или нестабильным. С 2024–2025 годов Минздрав переводит учет лекарственных препаратов на рельсы Единого структурированного справочника-каталога лекарственных препаратов (ЕСКЛП).

Существует несколько «более сладких» способов получения данных, о которых стоит знать программисту 1С:

  1. Сервис «1С:Номенклатура»: В современных редакциях конфигураций (например, «1С:Медицина. Больничная аптека») данные по предельным ценам и ЖНВЛП приходят автоматически через этот сервис. Это избавляет от необходимости писать свой парсер и следить за изменениями верстки сайта ГРЛС.
  2. Интеграция с ЕГИСЗ (ЕСКЛП): Доступ к данным можно получить через API портала ЕГИСЗ. Это требует регистрации информационной системы организации, но предоставляет данные в формате JSON/XML, что гораздо удобнее для программной обработки, чем парсинг Excel-файлов.
  3. ИТС Медицина: Как было отмечено в обсуждении, подписчики ИТС Медицина получают обновления классификаторов лекарственных средств в составе регулярных обновлений, что также может служить альтернативным источником данных.

Технические нюансы и рекомендации

Выясним причину возможных сбоев при работе с ГРЛС. Сайт может часто менять структуру HTML-кода (например, переименовывать ID контейнеров ctl00_plate_tdzip), что приведет к поломке парсера. Чтобы минимизировать риски, рекомендуется:

Во-первых, использовать регулярные выражения для поиска ссылки. В 1С это можно сделать через объект VBScript.RegExp. Регулярное выражение типа Get.*?\.ashx\?FileGUID=[a-z0-9\-]+ будет более устойчиво к изменениям верстки.

Во-вторых, всегда проверяйте расширение и содержимое скачанного файла. Иногда сервер вместо файла может отдать HTML-страницу с ошибкой или требованием пройти капчу. Проверка на тип контента в ОтветФайл.Заголовки.Получить("Content-Type") поможет вовремя среагировать на проблему.

В-третьих, учитывайте законодательные изменения. С сентября 2025 года формат регистрации цен может измениться, что повлечет за собой появление новых колонок в файлах Excel. При написании алгоритма чтения самого файла (после его загрузки) старайтесь обращаться к колонкам не по номеру, а по их заголовкам.

Подводя итог, можно сказать, что программная подкачка файла с ГРЛС в 1С — задача вполне реализуемая через HTTPСоединение, если правильно имитировать сессию пользователя и корректно обрабатывать динамические параметры URL. Однако для долгосрочных и стабильных решений стоит рассмотреть переход на использование структурированных данных через сервис 1С:Номенклатура или прямую интеграцию с ЕСКЛП.

← На главную