При интеграции систем учета 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
);
КонецФункции
HTTPСоединение с обязательным указанием параметра Новый ЗащищенноеСоединениеOpenSSL, так как веб-ресурс работает исключительно по защищенному протоколу HTTPS.ЧтениеHTML и ПостроительDOM избавляет нас от необходимости писать сложные и медленные регулярные выражения для поиска текста в строке. Платформа 1С самостоятельно преобразует сырой HTML-код в структурированное дерево объектов.profile-user-info profile-user-info-striped, внутри которых находятся блоки с классом profile-info-value. В этих блоках последовательно выводятся статус документа, его короткий номер, дата оформления и тип ВСД.Несмотря на то, что представленный код успешно решает задачу получения человекочитаемого номера ВСД, использовать его в продуктивных (рабочих) базах на постоянной основе крайне опасно. Проанализируем основные риски:
profile-user-info-striped или структуру вложенности тегов div), ваш парсер мгновенно перестанет работать и начнет возвращать пустые значения.Для того чтобы не подвергать систему риску блокировки, рекомендуется использовать альтернативные архитектурные решения:
UUID, что исключает необходимость знать короткий человекочитаемый номер на этапе логистики и приемки.