При работе с системой «Меркурий» (ВетИС) перед разработчиками 1С 7.7 часто встает сложная задача: как быстро получить данные ветеринарного сопроводительного документа (ВСД), имея только его уникальный идентификатор (UUID). Использование официального API (VetIS.API) требует регистрации в качестве ИТ-партнера, получения доступа к шлюзу и реализации сложных SOAP-запросов. Однако существует альтернативный путь — использование публичного веб-интерфейса системы. Рассмотрим, как программно извлечь данные о продукции из HTML-страницы и сохранить печатную форму документа прямо на жесткий диск.
Суть метода заключается в выполнении HTTP-запроса к публичному адресу просмотра документа и последующем разборе полученного текстового ответа. Разберем по шагам реализацию функций на языке 1С 7.7.
Для начала нам понадобится вспомогательная функция Норм(с). Она решает важную задачу очистки текста от HTML-тегов, преобразования специальных символов (таких как ) и обработки юникод-последовательностей. Это критично, так как «Меркурий» возвращает данные в кодировке UTF-8 с использованием числовых кодов символов.
Функция Норм(с)
с1 = СтрЗаменить(с, """", """");
с1 = СтрЗаменить(с1, " ", " ");
с1 = СтрЗаменить(с1, "</br/>", РазделительСтрок);
с1 = СтрЗаменить(с1, "<br/>", РазделительСтрок);
с1 = СтрЗаменить(с1, "<br>", РазделительСтрок);
с1 = СтрЗаменить(с1, "<span class="""">", "");
с1 = СтрЗаменить(с1, "<span class=""label label-warning"">", "");
с1 = СтрЗаменить(с1, "</span>", "");
с1 = СтрЗаменить(с1, "<span>", "");
// Обработка юникода (примитивный декодер)
Пока Найти(с1, "&#") > 0 Цикл
п = Найти(с1, "&#");
п2 = Найти(Сред(с1, п), ";") + п - 1;
Если п2 < п Тогда Прервать; КонецЕсли;
с2 = Сред(с1, п + 2, п2 - п - 2);
ч2 = Число(с2);
Если ч2 = 0 Тогда
с1 = СтрЗаменить(с1, "&#" + с2 + ";", "");
Продолжить;
КонецЕсли;
// Замена специфических символов (например, знака №)
с3 = ?(ч2 = 8470, "№", "");
с3 = ?((ч2 > 31) и (ч2 < 127), Симв(ч2), с3);
с3 = ?((ч2 > 1039) и (ч2 < 1104), Симв(ч2 - 848), с3); // Кириллица А-я
с1 = СтрЗаменить(с1, "&#" + с2 + ";", с3);
КонецЦикла;
Возврат СокрЛП(с1);
КонецФункции
Теперь проанализируем основную функцию УИД2сз, которая отправляет запрос к серверу «Меркурия» и извлекает значения полей документа в список значений.
Функция УИД2сз(уид)
сз = СоздатьОбъект("СписокЗначений");
// Инициализируем объект для HTTP запроса
Попытка
хттп = СоздатьОбъект("MSXML2.XMLHTTP");
Исключение
Сообщить("Не удалось создать объект MSXML2.XMLHTTP! Проверьте наличие библиотек в системе.");
Возврат сз;
КонецПопытки;
Адрес = "http://mercury.vetrf.ru/pub/operatorui?_language=ru&_action=showVetDocumentFormByUuid&uuid=" + уид;
хттп.open("POST", Адрес, 0);
Попытка
хттп.send();
Исключение
Сообщить(ОписаниеОшибки(), "!!!");
Возврат сз;
КонецПопытки;
Если СокрЛП(хттп.status) <> "200" Тогда
Сообщить("Ошибка сервера: " + хттп.StatusText);
Возврат сз;
КонецЕсли;
ис = хттп.responseText;
// Алгоритм поиска данных в верстке страницы
Пока 1 = 1 Цикл
ш = "profile-info-name"; // Маркер названия поля
п = Найти(ис, ш);
Если п = 0 Тогда Прервать; КонецЕсли;
ис = Сред(ис, п + 19);
ш = "</div>";
п1 = Найти(ис, ш);
н = Лев(ис, п1 - 1); // Получаем название (например, Наименование продукции)
ш = "profile-info-value"; // Маркер значения поля
п1 = Найти(ис, ш);
ис = Сред(ис, п1 + 20);
ш = "</div>";
п1 = Найти(ис, ш);
з = Лев(ис, п1 - 1); // Получаем само значение
сз.ДобавитьЗначение(Норм(з), н);
КонецЦикла;
Возврат сз;
КонецФункции
Обратите внимание, что поиск основан на CSS-классах profile-info-name и profile-info-value. Это стандартная разметка публичного портала Россельхознадзора.
Иногда требуется не просто получить данные, а сохранить оригинальную печатную форму ВСД для последующей печати или отправки по почте. В 1С 7.7 стандартные средства не всегда корректно работают с защищенными соединениями и потоками данных. Рассмотрим надежный способ с использованием утилиты curl.exe.
Выясним причину, почему это удобно: curl поддерживает актуальные протоколы шифрования TLS 1.2/1.3, которые требуются серверами ВетИС, в то время как старые операционные системы, на которых часто работает 1С 7.7, могут их не поддерживать в системных библиотеках.
Код для вызова загрузки файла выглядит следующим образом:
УИД = "ваш-uuid-документа";
ПутьКФайлу = "C:\VSD_Docs\" + УИД + ".pdf";
URL_Печати = "http://mercury.vetrf.ru/pub/operatorui?_language=ru&_action=printVetDocumentByUuid&uuid=" + УИД;
Команда = "curl.exe -o " + ПутьКФайлу + " """ + URL_Печати + """";
КомандаСистемы(Команда);
Параметр -o в команде curl указывает путь сохранения выходного файла. Если в системе не прописаны пути к curl, следует указывать полный путь к исполняемому файлу (например, C:\Windows\System32\curl.exe).
При реализации вышеуказанных методов проанализируем ситуацию с кодировками и стабильностью:
Норм(с), для 1С 7.7 гораздо эффективнее использовать объект ADODB.Stream. Он позволяет корректно конвертировать бинарный ответ сервера из UTF-8 в Windows-1251. Это избавит вас от проблем с «кракозябрами» в названиях товаров.Найти и Сред, можно задействовать объект HTMLFile (через CreateObject("htmlfile")). Это позволит работать с документом как с деревом объектов, обращаясь к элементам через getElementsByClassName. Это сделает код более устойчивым к мелким изменениям в дизайне сайта.curl, как показано выше.Подведем итог: предложенные методы позволяют организовать базовое взаимодействие 1С 7.7 с системой «Меркурий» без регистрации в API. Это идеальное решение для небольших организаций, которым необходимо быстро выводить данные ВСД в свои накладные или сохранять копии электронных документов.