Как получить полный текст веб-страницы при HTTP-запросе из 1С:Предприятия?

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

Часто при попытке получить содержимое сайта через стандартные механизмы 1С мы сталкиваемся с тем, что вместо ожидаемого текста страницы получаем лишь технический HTML-код, «скелет» страницы или служебные данные. Давайте разберемся, почему так происходит и как добиться корректного получения данных.

Анализ причин проблемы

Прежде чем приступать к исправлению кода, важно понять, с чем именно мы работаем. Когда мы используем HTTPСоединение и HTTPЗапрос, мы отправляем обычный GET-запрос к серверу. Однако современные веб-ресурсы устроены иначе:

  1. Динамический рендеринг: Многие сайты строят свой интерфейс на JavaScript. В момент ответа сервера страница еще пуста, а весь полезный текст «подтягивается» браузером уже после выполнения скриптов. Поскольку 1С не выполняет JavaScript, она получает только исходный «пустой» код.
  2. Идентификация запроса: Серверы могут блокировать запросы, которые выглядят как автоматизированные боты. Если не передать корректный User-Agent, сервер может вернуть заглушку или отказать в обслуживании.
  3. Отсутствие сессии: Если сайт требует авторизации или установки кук (например, для выбора региона), первый запрос без учета сессионных данных всегда будет выдавать неверный результат.

Шаг 1: Добавление HTTP-заголовков для имитации браузера

Первое, что нужно сделать — это сделать наш запрос максимально похожим на запрос от реального пользователя. Для этого мы должны правильно сформировать заголовки в объекте HTTPЗапрос. Рассмотрим пример того, как это реализовать:

Для начала создадим соответствие заголовков. Важно передать такие параметры, как Host, Content-Type и, что критически важно, User-Agent.


// Подготавливаем заголовки для имитации запроса из браузера
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Host", "moscow.magazin.ru");
ЗаголовкиHTTP.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
ЗаголовкиHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");

// Создаем защищенное соединение
SSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение("moscow.magazin.ru", 443, , , , , SSL);

// Формируем запрос с учетом заголовков
HTTPЗапрос = Новый HTTPЗапрос("/product/100000/", ЗаголовкиHTTP);

// Выполняем запрос
ОтветHTTP = HTTPСоединение.Получить(HTTPЗапрос);
ТелоОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();

Шаг 2: Анализ сетевого трафика

Если добавление заголовков не помогло, необходимо проанализировать, что именно происходит при открытии страницы в обычном браузере. Для этого:

  1. Откройте страницу в браузере (Chrome, Firefox или Edge).
  2. Нажмите клавишу F12 для вызова инструментов разработчика.
  3. Перейдите на вкладку Network (Сеть).
  4. Обновите страницу.
  5. Внимательно изучите список запросов. Ищите те из них, которые содержат нужные вам данные (часто они имеют тип XHR или Fetch).

Часто выясняется, что нужная информация подгружается отдельным запросом в формате JSON. Вместо того чтобы пытаться парсить сложный HTML, вы можете отправить запрос напрямую к этому внутреннему API и получить «чистые» данные, с которыми в 1С работать гораздо проще через ЧтениеJSON.

Шаг 3: Работа с HTML-контентом

Если вы всё же получили нужный HTML-код, но не знаете, как извлечь из него текст, воспользуйтесь возможностями объекта htmlfile (для Windows-систем). Этот объект позволяет работать с DOM-моделью страницы так же, как это делает браузер:


// Пример использования COM-объекта для парсинга
Документ = Новый COMОбъект("htmlfile");
Документ.write(ТелоОтвета);
// Теперь через методы Документ.getElementsByTagName или Документ.getElementById 
// можно извлечь конкретные значения из тегов страницы.

Подведем итог: если 1С получает не тот текст, что вы видите в браузере, скорее всего, данные формируются динамически. Начните с добавления заголовков User-Agent, затем проверьте сетевую активность через инструменты разработчика, чтобы найти прямой API-запрос к данным. Если же парсинг неизбежен, используйте htmlfile для удобной навигации по структуре полученного ответа.

← На главную