Какой наиболее простой способ прочитать данные с HTML страницы в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разберем классическую задачу интеграции, с которой часто сталкиваются разработчики. Имеется сторонний веб-сайт (например, портал госзакупок), у которого нет открытого API. Нам необходимо отчасти автоматизировать процесс создания счетов: прочитать основные данные со страницы закупки (номер, УНП, наименование клиента, адрес, email) и загрузить их в 1С 7.7. Посмотрим, какие инструменты и методы для этого существуют, и проанализируем их плюсы и минусы.

Использование COM-объекта InternetExplorer.Application

Рассмотрим первый, наиболее интуитивно понятный способ получения данных с веб-страницы. Мы можем запустить экземпляр браузера Internet Explorer прямо из кода 1С, дождаться загрузки страницы и получить ее текст. Разберем рабочий пример кода:


IE = СоздатьОбъект("InternetExplorer.Application");
IE.Navigate(Путь);

Пока ie.readystate < 4 Цикл
    Состояние("Загрузка...");
КонецЦикла;

Стр = ie.document.body.innertext;

Для й = 1 По СтрКоличествоСтрок(Стр) Цикл
    Стр1 = СтрПолучитьСтроку(Стр, й);
    // Здесь размещаем логику поиска нужных данных в строке
КонецЦикла;

Этот метод хорошо работает для единичных запросов. Однако при потоковой обработке данных выявляется серьезный недостаток. Если в цикле парсить много разных страниц, то после 20-40 итераций 1С может аварийно завершить работу ("крашнуться") или выдаст модальное окно: "Сервер занят, действие не может быть завершено". В логах можно будет увидеть ошибку: Неудачная попытка создания объекта (InternetExplorer.Application).

Выясним причину такого поведения. Зависания происходят из-за утечек памяти и накопления фоновых процессов самого браузера. Чтобы этого избежать, критически важно правильно освобождать ресурсы ОС. Рассмотрим, как это сделать: после обработки каждой страницы вызывайте специальный метод закрытия браузера IE.Quit(), а затем принудительно очищайте переменную в 1С: IE = 0. При очень больших объемах может потребоваться программно перезапускать саму процедуру парсинга.

Легковесная альтернатива: объект htmlfile

Посмотрим на более изящное решение для работы с DOM-моделью (деревом тегов) HTML-документа. Запуск полноценного браузера требует много ресурсов. Если нам не нужен графический интерфейс, рассмотрим использование встроенного в Windows COM-объекта htmlfile.

Этот объект позволяет создать виртуальный HTML-документ прямо в оперативной памяти. Он работает в разы быстрее, не выдает никаких модальных окон и потребляет минимум ресурсов. Мы загружаем в него текстовый код страницы, после чего можем обращаться к элементам с помощью стандартных методов, например getElementById, вытягивая данные напрямую из нужных блоков.

Прямые HTTP-запросы через WinHttp

Проанализируем другой подход — получение исходного кода страницы без её рендеринга (отрисовки). На старых проектах для этого часто использовали внешнюю компоненту v7plus.dll. Однако от неё стоит отказаться: она устарела, вызывает сбои в 1С и не поддерживает современные веб-стандарты.

Рассмотрим надежные встроенные решения: объекты WinHttp.WinHttpRequest.5.1 или Msxml2.ServerXMLHTTP. С их помощью мы можем отправлять HTTP-запросы из 1С так же, как это делает сам браузер, но значительно быстрее.

Разберем преимущества объектов WinHttp:

  1. Возможность выполнять GET и POST запросы.
  2. Полный контроль над HTTP-заголовками.
  3. Возможность передачи файлов cookie (полезно для сайтов с авторизацией).
  4. Корректная обработка современных сертификатов SSL/TLS (HTTPS).

В результате запроса мы мгновенно получаем текстовый HTML-код страницы, с которым можно работать дальше.

Парсинг текста регулярными выражениями

Получив HTML-код страницы в текстовую переменную, нам нужно извлечь из мешанины тегов конкретный УНП или номер закупки. Использовать встроенные строковые функции 1С (Найти, Лев, Прав, Сред) для сложной верстки крайне тяжело и ненадежно.

Рассмотрим использование регулярных выражений с помощью COM-объекта VBScript.RegExp. Регулярные выражения позволяют задать точный текстовый шаблон. Например, шаблон "найти 9 цифр подряд, перед которыми стоит слово УНП". Этот инструмент позволяет в пару строк кода вытащить телефоны, email-адреса и суммы, игнорируя структуру самого HTML-кода.

Анализ скрытых API и JSON-данных

В завершение проанализируем особенности современных веб-приложений (написанных на React, Vue и т.д.). Часто визуальные таблицы на таких сайтах собираются динамически, а сами данные лежат в исходном коде в очень удобном виде.

Посмотрим исходный код целевой страницы. Часто вся нужная информация о контрагенте и закупке находится внутри тега script в виде структурированного объекта JSON. Найти и распарсить один такой текстовый блок гораздо проще и надежнее, чем пытаться искать данные среди сотен тегов div, структура которых может измениться при редизайне сайта.

Также всегда детально проанализируем сетевую активность страницы (вкладка Network в панели разработчика любого браузера). Очень часто сайты имеют внутреннее, недокументированное API для подгрузки таблиц. Отследив такой запрос, мы можем выявить прямой URL-адрес. Отправив GET-запрос по этому адресу через WinHttp.WinHttpRequest, мы получим ответ в чистом виде (JSON или XML), полностью избавив себя от необходимости парсить громоздкий HTML-код.

← На главную