Как получить человекочитаемый номер ВСД Меркурий в 1С, если его нет в API?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При интеграции систем учета 1С с государственной информационной системой «Меркурий» (ВетИС) разработчики часто сталкиваются с неприятной особенностью официального API. Дело в том, что ВетИС.API принципиально не возвращает короткий, привычный человеку 7–9-значный номер ветеринарно-сопроводительного документа (ВСД). Согласно регламенту Россельхознадзора, единственным юридически значимым и уникальным идентификатором документа является 36-значный UUID (GUID). Однако на практике контрагенты, логисты и бухгалтеры требуют указывать в печатных формах именно короткие «человекочитаемые» номера, так как сверять длинные GUID вручную невозможно.

В этой статье мы подробно разберем, как решить эту проблему с помощью программного обращения к публичному веб-интерфейсу системы «Меркурий», проанализируем готовый код парсинга HTML-страницы и детально обсудим серьезные риски блокировок, которые могут возникнуть при использовании этого метода.

Решение проблемы: Парсинг веб-интерфейса «Меркурия»

Для получения человекочитаемого номера мы можем использовать веб-интерфейс «Меркурия», предназначенный для публичного просмотра информации о ВСД по его уникальному идентификатору (GUID). По адресу mercury.vetrf.ru/pub/operatorui доступна форма поиска, которая по параметру uuid отдает HTML-страницу с подробными сведениями о документе, включая его короткий номер, дату оформления, статус и вид.

Давайте разберем по шагам, как программно отправить запрос к этой веб-странице из 1С, получить ее содержимое и извлечь нужные данные при помощи объектной модели DOM (Document Object Model).

Пошаговый разбор программного кода

Рассмотрим детальный пример функции на языке 1С, которая принимает на вход GUID документа, выполняет безопасное HTTP-соединение, загружает HTML-страницу и парсит ее структуру:


Функция ПолучитьДанныеВСДПоГуид(ГуидВСД) Экспорт

    // Шаг 1. Формируем HTTP-запрос к публичному веб-интерфейсу
    АдресРесурса = "/pub/operatorui?_action=findVetDocumentFormByUuid&uuid=" + ГуидВСД;
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    
    // Шаг 2. Создаем защищенное SSL-соединение с сервером Меркурия
    HTTPСоединение = Новый HTTPСоединение("mercury.vetrf.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
    Исключение
        ЗаписьЖурналаРегистрации("Интеграция.Меркурий", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка при выполнении HTTP-запроса к Меркурию: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
    // Шаг 3. Загружаем полученный HTML-код в объект ЧтениеHTML
    ЧтениеHTML = Новый ЧтениеHTML;
    ЧтениеHTML.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
    
    // Шаг 4. Строим DOM-модель документа для удобного обхода элементов
    ПостроительDOM = Новый ПостроительDOM;
    ШаблонDOM = ПостроительDOM.Прочитать(ЧтениеHTML);
    
    // Получаем все элементы с тегом "div"
    ВсеДИВЫ = ШаблонDOM.ПолучитьЭлементыПоИмени("div");
    
    // Подготовим структуру для хранения найденных текстовых блоков
    СтруктураДанных = Новый Структура;
    Для Индекс = 0 По 3 Цикл
        СтруктураДанных.Вставить("div" + Индекс, "");
    КонецЦикла;
    
    Сч = 0;
    
    // Шаг 5. Обходим дерево элементов DOM и ищем нужные классы стилей
    Для Каждого ДИВ из ВсеДИВЫ Цикл 
        // Нас интересует контейнер со специфическим классом оформления верстки
        Если ДИВ.ИмяКласса = "profile-user-info profile-user-info-striped" Тогда
            СубДИВЫ = ДИВ.ПолучитьЭлементыПоИмени("div");
            Для Каждого СубДИВ ИЗ СубДИВЫ Цикл
                // Ищем ячейки со значениями параметров ВСД
                Если СубДИВ.ИмяКласса = "profile-info-value" Тогда
                    Если Сч <= 3 Тогда
                        СтруктураДанных.Вставить("div" + Сч, СокрЛП(СубДИВ.ТекстовоеСодержимое)); 
                        Сч = Сч + 1;
                    КонецЕсли;
                КонецЕсли;            
            КонецЦикла;    
        КонецЕсли;
    КонецЦикла;
    
    // Обязательно закрываем объект чтения
    ЧтениеHTML.Закрыть();
    
    // Шаг 6. Возвращаем структурированный результат
    Возврат Новый Структура("Статус, Номер, Дата, Вид", 
        СтруктураДанных.div0, 
        СтруктураДанных.div1, 
        СтруктураДанных.div2, 
        СтруктураДанных.div3
    );

КонецФункции

Как это работает изнутри?

  1. Безопасное соединение: Для выполнения запроса к сайту Россельхознадзора используется объект HTTPСоединение с обязательным указанием параметра Новый ЗащищенноеСоединениеOpenSSL, так как веб-ресурс работает исключительно по защищенному протоколу HTTPS.
  2. Объектный разбор HTML: Использование связки объектов ЧтениеHTML и ПостроительDOM избавляет нас от необходимости писать сложные и медленные регулярные выражения для поиска текста в строке. Платформа 1С самостоятельно преобразует сырой HTML-код в структурированное дерево объектов.
  3. Фильтрация по CSS-классам: Мы обходим элементы веб-страницы и ищем контейнеры с классом profile-user-info profile-user-info-striped, внутри которых находятся блоки с классом profile-info-value. В этих блоках последовательно выводятся статус документа, его короткий номер, дата оформления и тип ВСД.

Критически важные риски и ограничения метода

Несмотря на то, что представленный код успешно решает задачу получения человекочитаемого номера ВСД, использовать его в продуктивных (рабочих) базах на постоянной основе крайне опасно. Проанализируем основные риски:

  1. Угроза блокировки (бан по IP-адресу): Официальная позиция Россельхознадзора в отношении автоматического парсинга веб-интерфейса крайне жесткая. Системные администраторы ведомства расценивают регулярные автоматические HTTP-запросы к публичной части сайта как DDOS-атаку или нецелевое использование ресурсов. Адреса серверов, с которых отправляются подобные запросы, оперативно заносятся в черный список. Это может парализовать работу всей компании с веб-интерфейсом «Меркурия».
  2. Нестабильность верстки: Веб-интерфейс государственной системы постоянно обновляется и совершенствуется. Как только разработчики ведомства изменят имена CSS-классов (например, переименуют класс profile-user-info-striped или структуру вложенности тегов div), ваш парсер мгновенно перестанет работать и начнет возвращать пустые значения.
  3. Низкая скорость работы: Каждый такой запрос совершается непосредственно к веб-серверу ГИС «Меркурий» в режиме реального времени. При пакетной обработке сотен накладных данный метод вызовет колоссальные задержки в работе вашей базы данных 1С.

Альтернативные и безопасные пути решения

Для того чтобы не подвергать систему риску блокировки, рекомендуется использовать альтернативные архитектурные решения:

← На главную