В практике интеграции 1С с веб-ресурсами мы часто сталкиваемся с задачей парсинга данных. Классический подход подразумевает получение HTML-кода страницы и поиск в нем нужных значений внутри тегов (например, <div>, <span> или <table>). Однако современные веб-технологии (React, Vue, Angular) изменили структуру страниц. Теперь при выполнении GET-запроса мы часто получаем полупустой HTML, в котором нет таблиц с ценами или списками товаров, но есть массивные блоки кода внутри тега <script>.
В этой статье мы подробно разберем, как извлечь полезную информацию из таких контейнеров, проанализируем, почему не стоит использовать методы "в лоб" (например, распознавание с экрана), и рассмотрим современные способы получения данных непосредственно из кода страницы средствами 1С.
Когда мы пытаемся получить содержимое страницы через HTTPСоединение, мы видим исходный код, который отдал сервер. В современных Single Page Applications (SPA) данные часто "гидратируются" (Hydration) на клиенте. Это значит, что сервер отдает JSON-объект, присвоенный какой-то переменной JavaScript прямо внутри HTML, а браузер уже потом строит из этого красивую верстку.
Типичный пример того, что мы видим в коде:
<script>
window.__INITIAL_STATE__ = { "products": [ { "id": 1, "name": "Товар", "price": 100 } ... ] };
</script>
Проблема, озвученная автором, заключается в том, как прочитать эти данные, если стандартный парсер XML/HTML их игнорирует или воспринимает как простой текст. Рассмотрим несколько стратегий решения.
Это самый быстрый и легковесный способ, не требующий запуска браузера. Поскольку 1С отлично умеет работать с JSON, наша задача сводится к тому, чтобы "вырезать" нужный кусок текста из HTML и скормить его объекту ЧтениеJSON.
Шаг 1. Получение HTML
Выполняем стандартный запрос:
Соединение = Новый HTTPСоединение("example.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/catalog");
Ответ = Соединение.Получить(Запрос);
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
Шаг 2. Поиск данных регулярным выражением
Данные внутри <script> обычно начинаются с уникального идентификатора переменной. Например, window.__INITIAL_STATE__ =. Мы можем использовать COM-объект VBScript.RegExp для точного поиска.
Регулярка = Новый COMОбъект("VBScript.RegExp");
Регулярка.Global = Истина;
Регулярка.IgnoreCase = Истина;
// Ищем текст, начинающийся с переменной и заканчивающийся закрывающей скобкой или точкой с запятой
Регулярка.Pattern = "window\.__INITIAL_STATE__\s*=\s*(\{.*?\});";
Matches = Регулярка.Execute(ТекстHTML);
Если Matches.Count > 0 Тогда
СтрокаJSON = Matches.Item(0).SubMatches.Item(0);
КонецЕсли;
Шаг 3. Чтение JSON
Полученную строку теперь можно легко преобразовать в Структуру или Соответствие 1С:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Теперь мы можем обращаться к данным напрямую
Цена = Данные.products[0].price;
Этот метод работает быстро, но требует, чтобы мы точно знали имя переменной, в которой лежат данные.
В обсуждении справедливо заметили, что многие сайты подгружают данные отдельными запросами. Вместо того чтобы мучиться с парсингом HTML и скриптов, мы можем притвориться браузером и запросить "чистые" данные у сервера.
Чтобы найти источник данных, выполним следующие действия в браузере:
Часто оказывается, что данные можно получить простым GET-запросом к адресу вида api.example.com/v1/products. В 1С это реализуется так же просто, как и получение HTML, но в ответе мы сразу получаем готовый JSON.
Важно: Для успешного запроса к скрытому API часто требуется передавать правильные заголовки (User-Agent, Referer, Cookie), которые можно подсмотреть там же, во вкладке Network.
Если данные в скрипте зашифрованы или формируются сложной логикой JS, которую невозможно воспроизвести в 1С, нам поможет подход, упомянутый в теме — использование инструментов тестирования, таких как Selenium.
Selenium позволяет запустить настоящий браузер (Chrome, Firefox) под управлением программы. Схема работы будет следующей:
Пример логики (псевдокод):
// Команда драйверу выполнить JS на странице и вернуть результат
Результат = Драйвер.ExecuteScript("return window.__INITIAL_STATE__;");
Этот метод гарантированно вернет данные, так как скрипты сайта уже отработали. Однако он имеет существенные недостатки: это медленно (нужно ждать загрузку графики) и ресурсоемко.
В теме обсуждался вариант использования AutoIt для скроллинга страницы и распознавания текста с экрана (OCR) или копирования текста через буфер обмена. Давайте разберем, почему этот метод считается "тупиковым" для промышленной эксплуатации:
При парсинге данных из скриптов или API сайты могут пытаться блокировать автоматические запросы. Основываясь на обсуждении, выделим ключевые моменты для обхода простых защит:
User-Agent в HTTPЗапрос, имитирующий реальный браузер. Стандартный агент 1С легко вычисляется.HTTPСоединение или вручную обрабатывать заголовок Set-Cookie).Если вы видите данные на экране, но не находите их в HTML-тегах, в 99% случаев они лежат внутри блока <script> в формате JSON или подгружаются отдельным запросом. Наиболее эффективный путь решения для 1С-программиста — это: