Как программно получить и сохранить динамический текст с веб-страницы в 1С?

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

При интеграции 1С с внешними сайтами и сверке данных разработчики часто сталкиваются с ситуацией, когда необходимая информация формируется на веб-странице динамически с помощью JavaScript. В таком случае обычный GET-запрос через объект HTTPСоединение возвращает только базовый исходный HTML-код без вычисленных цифр и текстов. Разберем основные способы и технические подходы, позволяющие программно получить вычисленные данные и сохранить их в 1С.

Почему стандартный HTTP-запрос не возвращает динамические данные?

Проанализируем причину проблемы. Объект платформы HTTPСоединение предназначен исключительно для сетевого обмена и получения «сырого» ответа сервера. В нем отсутствует движок выполнения клиентских скриптов (JavaScript). Если веб-страница построена на современных SPA-фреймворках или использует асинхронные AJAX/Fetch-запросы для рендеринга информации, браузер выполняет эти расчеты на стороне клиента. Чтобы получить итоговый текст, требуется среда, способная выполнить сценарии страницы, либо прямой доступ к источнику этих данных.

Способ 1. Прямое обращение к API сайта (рекомендуемый подход)

Прежде чем пытаться визуально рендерить страницу и разбирать ее верстку, выясним, откуда браузер берет исходные цифры для расчетов. Практически любой динамический веб-сайт запрашивает данные с бэкенда через фоновые HTTP-запросы в формате JSON или XML.

Разберем по шагам, как получить данные напрямую:

  1. Откроем нужную веб-страницу в любом браузере и перейдем в инструменты разработчика (клавиша F12).
  2. Перейдем на вкладку Сеть (Network) и установим фильтр Fetch/XHR.
  3. Обновим страницу или выполним действие, инициирующее расчет, и зафиксируем URL-адрес, метод (GET/POST) и заголовки фонового запроса, возвращающего данные.
  4. Повторим этот запрос непосредственно из 1С с помощью объектов HTTPСоединение и HTTPЗапрос.

Посмотрим на пример отправки запроса и разбора полученного JSON-ответа:


Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/data/calculate");
Запрос.Заголовки.Вставить("Accept", "application/json");

Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаОтвета);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    // Данные прочитаны в структуру/массив 1С без необходимости парсинга HTML
КонецЕсли;

Способ 2. Получение данных через элемент формы «Поле HTML документа»

Если доступ к прямому API закрыт или сложен из-за комплексной авторизации, можно использовать встроенный компонент платформы. Для этого на управляемую форму добавляется элемент с типом Поле HTML документа. Этот элемент запускает встроенный веб-движок, загружает страницу и исполняет ее скрипты.

Разберем нюансы работы с DOM-деревом:

  1. Для получения чистого текста без HTML-разметки следует обращаться к свойству innerText или textContent, а не к innerHTML.
  2. Событие ДокументСформирован наступает в момент завершения загрузки исходного каркаса страницы (DOM), но до завершения асинхронных скриптов и расчетов.

Посмотрим, как организовать обращение к тексту страницы в кодовой базе формы:


&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
    // Получаем COM- или DOM-документ загруженной страницы
    ДокументСтраницы = Элементы.ПолеHTML.Документ;
    Если ДокументСтраницы <> Неопределено И ДокументСтраницы.body <> Неопределено Тогда
        // Считываем отображаемый текстовый контент страницы
        ТекстСтраницы = ДокументСтраницы.body.innerText;
        
        // Сохраняем полученный текст в файл для последующей обработки
        Запись = Новый ЗаписьТекста;
        Запись.Открыть("C:\temp\site_data.txt", КодировкаТекста.UTF8);
        Запись.ЗаписатьСтроку(ТекстСтраницы);
        Запись.Закрыть();
    КонецЕсли;
КонецПроцедуры

Способ 3. Выполнение скрипта через метод «ВыполнитьСценарий()»

Начиная с версии платформы 8.3.14, у элемента формы ПолеHTMLДокумента доступен метод ВыполнитьСценарий() (или ExecuteScript). Он позволяет передать JavaScript-выражение прямо в контекст открытой страницы и мгновенно получить результат вычислений обратно в 1С.

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


&НаКлиенте
Процедура ПолучитьЗначениеЭлемента()
    // JS-код для поиска элемента и возврата его текстового содержимого
    Скрипт = "(() => {
    |   const el = document.querySelector('.calculated-result-value');
    |   return el ? el.innerText : '';
    |})()";
    
    Результат = Элементы.ПолеHTML.ВыполнитьСценарий(Скрипт);
    Если ЗначениеЗаполнено(Результат) Тогда
        Сообщить("Получены данные с сайта: " + Результат);
    КонецЕсли;
КонецПроцедуры

Способ 4. Организация ожидания асинхронных расчетов

Поскольку расчеты на странице могут занять некоторое время, попытка чтения DOM сразу в событии ДокументСформирован может вернуть пустые значения. В такой ситуации необходимо организовать периодический опрос страницы.

Разберем по шагам организацию ожидания:

  1. В обработчике ДокументСформирован запускаем фоновую проверку через процедуру ПодключитьОбработчикОжидания() с интервалом в 1–2 секунды.
  2. В вызываемой процедуре проверяем наличие целевых данных в DOM или через ВыполнитьСценарий().
  3. Как только данные появились (или истек установленный тайм-аут), отключаем обработчик ожидания через ОтключитьОбработчикОжидания() и передаем результат в алгоритм сверки.

Способ 5. Использование внешних утилит и Headless-браузеров

Если операцию необходимо выполнять в фоновом режиме (например, в регламентном задании на сервере 1С, где нет пользовательского интерфейса и интерактивных форм), встроенное поле HTML документа использовать нельзя. В этом случае применяют внешние консольные утилиты или сценарии автоматизации браузера (Puppeteer, Playwright, Selenium):

  1. Из 1С через команду ЗапуститьПриложение() запускается внешний скрипт в headless-режиме (без графического окна).
  2. Скрипт эмулирует браузер, дожидается полной загрузки страницы и выполнения всех клиентских расчетов, после чего сохраняет итоговый DOM или текстовый файл (TXT/CSV/JSON) на диск.
  3. 1С ожидает завершения процесса (параметр ожидания в ЗапуститьПриложение()) и считывает готовый файл объектом ЧтениеТекста.
← На главную