Как получить данные и печатные формы ВСД из системы «Меркурий» в 1С 7.7 через веб-интерфейс

Программист 1С v7.7 Промышленность, строительство и АПК
← На главную

При работе с системой «Меркурий» (ВетИС) перед разработчиками 1С 7.7 часто встает сложная задача: как быстро получить данные ветеринарного сопроводительного документа (ВСД), имея только его уникальный идентификатор (UUID). Использование официального API (VetIS.API) требует регистрации в качестве ИТ-партнера, получения доступа к шлюзу и реализации сложных SOAP-запросов. Однако существует альтернативный путь — использование публичного веб-интерфейса системы. Рассмотрим, как программно извлечь данные о продукции из HTML-страницы и сохранить печатную форму документа прямо на жесткий диск.

Метод 1: Получение текстовых данных ВСД через парсинг 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. Это стандартная разметка публичного портала Россельхознадзора.

Метод 2: Получение печатной формы (PDF) с помощью curl

Иногда требуется не просто получить данные, а сохранить оригинальную печатную форму ВСД для последующей печати или отправки по почте. В 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. Работа с кодировкой UTF-8: Вместо сложной ручной функции Норм(с), для 1С 7.7 гораздо эффективнее использовать объект ADODB.Stream. Он позволяет корректно конвертировать бинарный ответ сервера из UTF-8 в Windows-1251. Это избавит вас от проблем с «кракозябрами» в названиях товаров.
  2. Использование DOM для парсинга: Вместо поиска строк через Найти и Сред, можно задействовать объект HTMLFile (через CreateObject("htmlfile")). Это позволит работать с документом как с деревом объектов, обращаясь к элементам через getElementsByClassName. Это сделает код более устойчивым к мелким изменениям в дизайне сайта.
  3. Проблемы TLS: Если вы получаете ошибку «Не удается установить соединение», проверьте версию протокола TLS. Для сайтов Россельхознадзора требуется TLS 1.2. В Windows 7 это решается установкой соответствующих обновлений системы или использованием внешнего curl, как показано выше.
  4. Лимиты запросов: Помните, что публичный интерфейс предназначен для «ручного» использования. При массовых запросах (тысячи документов в час) ваш IP-адрес может быть временно заблокирован защитными системами «Меркурия». Для больших объемов данных все же рекомендуется переход на API.

Подведем итог: предложенные методы позволяют организовать базовое взаимодействие 1С 7.7 с системой «Меркурий» без регистрации в API. Это идеальное решение для небольших организаций, которым необходимо быстро выводить данные ВСД в свои накладные или сохранять копии электронных документов.

← На главную