Автоматизация загрузки реестра предельных отпускных цен на жизненно необходимые и важнейшие лекарственные препараты (ЖНВЛП) — критически важная задача для аптечных сетей и медицинских учреждений. Сайт Государственного реестра лекарственных средств (ГРЛС) предоставляет данные в виде файлов, однако прямая ссылка на них не является постоянной. В этой статье мы разберем, как программно обойти ограничения сайта и настроить автоматическое получение данных в вашу конфигурацию 1С.
При попытке использовать стандартную команду КопироватьФайл с фиксированным URL-адресом многие разработчики сталкиваются с тем, что файл не скачивается или сервер возвращает ошибку. Это происходит потому, что ссылки на портале ГРЛС генерируются динамически. В параметрах ссылки присутствуют такие переменные, как FileGUID и UserReq, которые привязаны к текущей сессии пользователя. Проанализируем ситуацию: сервер ожидает, что запрос придет от реального браузера, который сначала загрузил основную страницу реестра, а затем инициировал скачивание.
Для успешного решения задачи нам необходимо воспроизвести поведение пользователя по шагам. Рассмотрим подробнее этот процесс:
Сайт Минздрава работает по протоколу HTTPS. Для корректной работы 1С с защищенными ресурсами нам потребуется объект ЗащищенноеСоединениеOpenSSL. Без него попытка подключения может завершиться ошибкой сертификата. Разберем пример создания соединения:
Сервер = "grls.rosminzdrav.ru";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение(Сервер, , , , , 30, Защита);
Здесь мы указываем таймаут 30 секунд, что важно для государственных порталов, которые могут отвечать с задержкой при высокой нагрузке.
Теперь нам нужно загрузить содержимое страницы, на которой расположена иконка скачивания. Мы будем искать в тексте страницы фрагмент ссылки, содержащий обработчик 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.
Когда «свежая» ссылка получена, мы выполняем второй запрос. Результат этого запроса уже не текст, а двоичные данные (ZIP-архив или Excel-файл). Проанализируем пример завершения загрузки:
ЗапросНаФайл = Новый HTTPЗапрос("/" + ОтносительнаяСсылка);
ЗапросНаФайл.Заголовки.Вставить("User-Agent", "Mozilla/5.0");
ЗапросНаФайл.Заголовки.Вставить("Referer", "http://grls.rosminzdrav.ru/pricelims.aspx");
ОтветФайл = HTTPСоединение.Получить(ЗапросНаФайл);
Если ОтветФайл.КодСостояния = 200 Тогда
ДвоичныеДанные = ОтветФайл.ПолучитьТелоКакДвоичныеДанные();
ПутьКФайлу = "C:\Temp\grls_data.zip";
ДвоичныеДанные.Записать(ПутьКФайлу);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Иначе
Сообщить("Ошибка при скачивании файла. Код: " + ОтветФайл.КодСостояния);
КонецЕсли;
Использование заголовка Referer крайне желательно, так как он указывает серверу, что мы перешли к скачиванию именно со страницы реестра, что подтверждает легитимность запроса в глазах систем защиты сайта.
Разберем ситуацию, когда ручной парсинг сайта ГРЛС кажется слишком трудоемким или нестабильным. С 2024–2025 годов Минздрав переводит учет лекарственных препаратов на рельсы Единого структурированного справочника-каталога лекарственных препаратов (ЕСКЛП).
Существует несколько «более сладких» способов получения данных, о которых стоит знать программисту 1С:
Выясним причину возможных сбоев при работе с ГРЛС. Сайт может часто менять структуру HTML-кода (например, переименовывать ID контейнеров ctl00_plate_tdzip), что приведет к поломке парсера. Чтобы минимизировать риски, рекомендуется:
Во-первых, использовать регулярные выражения для поиска ссылки. В 1С это можно сделать через объект VBScript.RegExp. Регулярное выражение типа Get.*?\.ashx\?FileGUID=[a-z0-9\-]+ будет более устойчиво к изменениям верстки.
Во-вторых, всегда проверяйте расширение и содержимое скачанного файла. Иногда сервер вместо файла может отдать HTML-страницу с ошибкой или требованием пройти капчу. Проверка на тип контента в ОтветФайл.Заголовки.Получить("Content-Type") поможет вовремя среагировать на проблему.
В-третьих, учитывайте законодательные изменения. С сентября 2025 года формат регистрации цен может измениться, что повлечет за собой появление новых колонок в файлах Excel. При написании алгоритма чтения самого файла (после его загрузки) старайтесь обращаться к колонкам не по номеру, а по их заголовкам.
Подводя итог, можно сказать, что программная подкачка файла с ГРЛС в 1С — задача вполне реализуемая через HTTPСоединение, если правильно имитировать сессию пользователя и корректно обрабатывать динамические параметры URL. Однако для долгосрочных и стабильных решений стоит рассмотреть переход на использование структурированных данных через сервис 1С:Номенклатура или прямую интеграцию с ЕСКЛП.