При интеграции 1С с внешними сайтами и сверке данных разработчики часто сталкиваются с ситуацией, когда необходимая информация формируется на веб-странице динамически с помощью JavaScript. В таком случае обычный GET-запрос через объект HTTPСоединение возвращает только базовый исходный HTML-код без вычисленных цифр и текстов. Разберем основные способы и технические подходы, позволяющие программно получить вычисленные данные и сохранить их в 1С.
Проанализируем причину проблемы. Объект платформы HTTPСоединение предназначен исключительно для сетевого обмена и получения «сырого» ответа сервера. В нем отсутствует движок выполнения клиентских скриптов (JavaScript). Если веб-страница построена на современных SPA-фреймворках или использует асинхронные AJAX/Fetch-запросы для рендеринга информации, браузер выполняет эти расчеты на стороне клиента. Чтобы получить итоговый текст, требуется среда, способная выполнить сценарии страницы, либо прямой доступ к источнику этих данных.
Прежде чем пытаться визуально рендерить страницу и разбирать ее верстку, выясним, откуда браузер берет исходные цифры для расчетов. Практически любой динамический веб-сайт запрашивает данные с бэкенда через фоновые HTTP-запросы в формате JSON или XML.
Разберем по шагам, как получить данные напрямую:
HTTPСоединение и HTTPЗапрос.Посмотрим на пример отправки запроса и разбора полученного JSON-ответа:
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/data/calculate");
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаОтвета);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Данные прочитаны в структуру/массив 1С без необходимости парсинга HTML
КонецЕсли;
Если доступ к прямому API закрыт или сложен из-за комплексной авторизации, можно использовать встроенный компонент платформы. Для этого на управляемую форму добавляется элемент с типом Поле HTML документа. Этот элемент запускает встроенный веб-движок, загружает страницу и исполняет ее скрипты.
Разберем нюансы работы с DOM-деревом:
innerText или textContent, а не к innerHTML.ДокументСформирован наступает в момент завершения загрузки исходного каркаса страницы (DOM), но до завершения асинхронных скриптов и расчетов.Посмотрим, как организовать обращение к тексту страницы в кодовой базе формы:
&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
// Получаем COM- или DOM-документ загруженной страницы
ДокументСтраницы = Элементы.ПолеHTML.Документ;
Если ДокументСтраницы <> Неопределено И ДокументСтраницы.body <> Неопределено Тогда
// Считываем отображаемый текстовый контент страницы
ТекстСтраницы = ДокументСтраницы.body.innerText;
// Сохраняем полученный текст в файл для последующей обработки
Запись = Новый ЗаписьТекста;
Запись.Открыть("C:\temp\site_data.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(ТекстСтраницы);
Запись.Закрыть();
КонецЕсли;
КонецПроцедуры
Начиная с версии платформы 8.3.14, у элемента формы ПолеHTMLДокумента доступен метод ВыполнитьСценарий() (или ExecuteScript). Он позволяет передать JavaScript-выражение прямо в контекст открытой страницы и мгновенно получить результат вычислений обратно в 1С.
Рассмотрим пример извлечения конкретного вычисленного блока данных по селектору:
&НаКлиенте
Процедура ПолучитьЗначениеЭлемента()
// JS-код для поиска элемента и возврата его текстового содержимого
Скрипт = "(() => {
| const el = document.querySelector('.calculated-result-value');
| return el ? el.innerText : '';
|})()";
Результат = Элементы.ПолеHTML.ВыполнитьСценарий(Скрипт);
Если ЗначениеЗаполнено(Результат) Тогда
Сообщить("Получены данные с сайта: " + Результат);
КонецЕсли;
КонецПроцедуры
Поскольку расчеты на странице могут занять некоторое время, попытка чтения DOM сразу в событии ДокументСформирован может вернуть пустые значения. В такой ситуации необходимо организовать периодический опрос страницы.
Разберем по шагам организацию ожидания:
ДокументСформирован запускаем фоновую проверку через процедуру ПодключитьОбработчикОжидания() с интервалом в 1–2 секунды.ВыполнитьСценарий().ОтключитьОбработчикОжидания() и передаем результат в алгоритм сверки.Если операцию необходимо выполнять в фоновом режиме (например, в регламентном задании на сервере 1С, где нет пользовательского интерфейса и интерактивных форм), встроенное поле HTML документа использовать нельзя. В этом случае применяют внешние консольные утилиты или сценарии автоматизации браузера (Puppeteer, Playwright, Selenium):
ЗапуститьПриложение() запускается внешний скрипт в headless-режиме (без графического окна).ЗапуститьПриложение()) и считывает готовый файл объектом ЧтениеТекста.