К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить HTML-страницу в 1С

Способы получить HTML-страницу в 1С: HTTPСоединение, HTTPЗапрос, WinHTTP и COM-объекты. Готовый код, обработка ошибок, кодировки, типичные ошибки и FAQ.

Получение HTML-страницы — типовая задача при интеграции 1С с сайтами: загрузка прайсов поставщиков, проверка цен конкурентов, чтение данных с веб-порталов, у которых нет API. В платформе 1С:Предприятие для этого есть встроенные объекты HTTPСоединение и HTTPЗапрос, а также альтернативные механизмы через COM-объекты Windows и внешние компоненты.

Выбор способа зависит от условий: требуется ли поддержка HTTPS и прокси, работает код на сервере или на клиенте, какая версия платформы используется и нужна ли авторизация на сайте. Ниже разобраны рабочие варианты с готовым кодом, обработкой ошибок и ограничениями каждого подхода.

Основной способ: HTTPСоединение и HTTPЗапрос

Объекты HTTPСоединение и HTTPЗапрос доступны во всех современных версиях платформы 1С и работают как на сервере, так и на толстом клиенте. Это штатный механизм, не требующий внешних компонентов и прав администратора на компьютере.

Минимальный пример получения страницы по HTTP:

Сервер = "example.com";

АдресРесурса = "/page.html";

Соединение = Новый HTTPСоединение(Сервер, 80);

Запрос = Новый HTTPЗапрос(АдресРесурса);

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

ТекстHTML = Ответ.ПолучитьТелоКакСтроку();

Иначе

ВызватьИсключение "Ошибка HTTP: " + Ответ.КодСостояния;

КонецЕсли;

Метод Получить() выполняет GET-запрос. Код состояния 200 означает успех; коды 301/302 — редирект, 404 — страница не найдена, 403 — доступ запрещён, 5xx — ошибка на стороне сервера. Проверка кода состояния обязательна: без неё в переменную может попасть HTML страницы ошибки, которая потом «отравит» дальнейший парсинг.

1c
Соединение = Новый HTTPСоединение("site.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);

Работа с HTTPS и защищённым соединением

Большинство сайтов сегодня работают только по HTTPS, поэтому без объекта ЗащищенноеСоединениеOpenSSL запрос завершится ошибкой или редиректом. Защищённое соединение передаётся последним параметром конструктора HTTPСоединение, порт указывается 443.

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(

Неопределено,

Новый СертификатыУдостоверяющихЦентровОС);

Соединение = Новый HTTPСоединение("site.ru", 443, , , , 30, ЗащищенноеСоединение);

Запрос = Новый HTTPЗапрос("/catalog");

Ответ = Соединение.Получить(Запрос);

Использование СертификатыУдостоверяющихЦентровОС заставляет 1С доверять системному хранилищу сертификатов Windows или Linux. Если сайт использует самоподписанный сертификат, соединение будет отклонено — это осознанная защита, а не сбой. Обходить проверку сертификата в продуктивном обмене данными небезопасно: правильное решение — установить корректный сертификат на стороне сайта.

Кодировка, заголовки и таймаут

Частая проблема — «кракозябры» вместо русского текста. Они возникают, когда страница отдана в кодировке, отличной от той, в которой 1С читает тело ответа. Кодировку можно указать явно при чтении тела:

ТекстHTML = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

// или для старых сайтов:

ТекстHTML = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);

Определить нужную кодировку помогает заголовок ответа Content-Type (например, «text/html; charset=windows-1251») или мета-тег в начале HTML. Если после чтения текст нечитаем — попробуйте другую кодировку до появления корректных символов.

Два параметра, которые стоит задавать всегда: таймаут и заголовок User-Agent. Таймаут (в секундах, шестой параметр HTTPСоединение) не даст фоновому заданию зависнуть навсегда при недоступном сайте. User-Agent нужен, потому что некоторые серверы блокируют запросы без него или отдают упрощённую версию страницы:

Запрос = Новый HTTPЗапрос("/page");

Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (compatible; 1C-Integration)");

Запрос.Заголовки.Вставить("Accept", "text/html");

Авторизация и работа с прокси

Для сайтов с базовой HTTP-аутентификацией логин и пароль передаются третьим и четвёртым параметрами конструктора HTTPСоединение. Для форм-авторизации механика сложнее: сначала выполняется POST-запрос с учётными данными, затем из ответа извлекаются cookies, которые подставляются в заголовки последующих запросов.

Если сервер 1С выходит в интернет через прокси, используется объект ИнтернетПрокси:

Прокси = Новый ИнтернетПрокси(Истина); // использовать системные настройки

// или явно:

Прокси = Новый ИнтернетПрокси;

Прокси.Установить("http", "proxy.company.local", 3128, "user", "pass");

Соединение = Новый HTTPСоединение("site.ru", 443, , , Прокси, 30, ЗащищенноеСоединение);

Учтите, что при серверном выполнении кода сетевые запросы идут с сервера 1С, а не с компьютера пользователя. Если страница открывается в браузере пользователя, но не получается из 1С, проверьте, есть ли у сервера 1С доступ в интернет и не блокирует ли его файрвол.

Маршрут решения

Как выбрать подход

Нужен простой GET-запрос к сайту по HTTP/HTTPSИспользуйте HTTPСоединение + HTTPЗапрос — штатный кроссплатформенный вариант
Код должен работать на старой платформе или нужна тонкая настройка SSLРассмотрите COM-объект WinHttp.WinHttpRequest.5.1 (только Windows)
Данные подгружаются JavaScript и в HTML отсутствуютИщите прямой JSON/API-адрес данных; HTTPСоединение скрипты не выполняет
Нужно просто показать страницу пользователюИспользуйте ПолеHTMLДокумента вместо программной загрузки

Альтернативные способы

COM-объект WinHttp

На Windows доступен COM-объект WinHttp.WinHttpRequest.5.1. Он иногда помогает, когда штатный механизм не справляется с нестандартными сертификатами или требуется иначе настроить поведение запроса:

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

WinHttp.Open("GET", "https://site.ru/page", Ложь);

WinHttp.Send();

ТекстHTML = WinHttp.ResponseText();

Ограничение очевидно: решение привязано к Windows и к машине, где выполняется код. На Linux-сервере или в веб-клиенте этот вариант не сработает.

ПолеHTMLДокумента для отображения

Если задача — не разобрать данные, а показать страницу пользователю в форме 1С, используйте реквизит формы типа ПолеHTMLДокумента. Достаточно присвоить ему URL или готовый HTML-текст — платформа отрисует страницу встроенным браузерным движком. Получить оттуда обратно DOM программно возможно через объект Документ поля, но для массового парсинга этот путь медленнее и менее надёжен, чем HTTP-запрос.

Сравнение вариантов

HTTPСоединение

Штатно, кроссплатформенно, работает на сервере и в фоновых заданиях. Не выполняет JavaScript.

WinHttp (COM)

Гибче настройка, но только Windows и только там, где выполняется код. Зависит от прав на создание COM.

ПолеHTMLДокумента

Подходит для отображения страницы пользователю, выполняет скрипты. Не предназначено для пакетной загрузки данных.

Обработка ошибок и проверка результата

Сетевые запросы нестабильны по своей природе, поэтому код должен быть обёрнут в попытку/исключение, а результат — проверен перед использованием. Минимальный набор проверок: код состояния 200, непустое тело ответа, наличие в тексте ожидаемых маркеров (например, характерного тега или заголовка страницы).

Попытка

Ответ = Соединение.Получить(Запрос);

Исключение

ЗаписьЖурналаРегистрации("ЗагрузкаHTML", УровеньЖурналаРегистрации.Ошибка,,,

ОписаниеОшибки());

Возврат "";

КонецПопытки;

Если Ответ.КодСостояния <> 200 Тогда

Возврат "";

КонецЕсли;

ТекстHTML = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

Если СтрНайти(НРег(ТекстHTML), "<html") = 0 Тогда

// пришёл не HTML — возможно, редирект или ошибка сервера

КонецЕсли;

Для регулярных загрузок полезно логировать код состояния и размер ответа в журнал регистрации: по этим записям легко понять, когда сайт начал отказывать или изменил структуру ответа. При массовых обращениях к чужому сайту добавляйте паузы между запросами — агрессивный обход страниц приводит к блокировке IP-адреса сервера 1С.

Контрольные точки

Как проверить результат

Код состояния ответа
Норма

200 — страница получена

Тревожный признак

301/302 — редирект; 403/404/5xx — страница недоступна или запрещена

Содержимое тела ответа
Норма

Читаемый HTML с ожидаемыми тегами и текстом

Тревожный признак

Кракозябры (неверная кодировка), пустая строка или текст ошибки сервера

Наличие нужных данных
Норма

Искомые блоки и значения присутствуют в HTML

Тревожный признак

Данных нет — вероятно, они подгружаются JavaScript

Типичные ошибки при получении HTML в 1С

Первая ошибка — игнорирование кода состояния. В переменную попадает страница ошибки, парсер не находит нужных данных, и диагностика превращается в поиск несуществующей проблемы в регулярных выражениях. Всегда проверяйте КодСостояния первым делом.

Вторая — отсутствие таймаута. По умолчанию ожидание ответа может быть очень долгим, и регламентное задание зависает, блокируя очередь. Третья — попытка найти в HTML данные, которые сайт подгружает скриптами: их нет в ответе по определению, и никакая настройка HTTPСоединение это не изменит.

Четвёртая — выполнение кода на клиенте в тонком или веб-клиенте, где HTTPСоединение может быть недоступно или ограничено. Для интеграций размещайте код на сервере (&НаСервере) или в серверном общем модуле.

Типичные ошибки
01
Не проверяется КодСостояния — вместо данных обрабатывается страница ошибки сайта
02
Не задан таймаут — фоновое задание зависает при недоступном сайте
03
Чтение тела без указания кодировки — русский текст превращается в нечитаемые символы
04
Ожидание данных, подгружаемых JavaScript — их нет в исходном HTML, нужен прямой адрес данных
05
Выполнение запроса на клиенте вместо сервера — код падает или работает нестабильно

FAQ

Как получить страницу, если сайт требует входа по форме?

Сначала отправьте POST-запрос на адрес обработчика формы с логином и паролем в теле. Из ответа возьмите cookies (заголовок Set-Cookie) и передавайте их в заголовке Cookie всех последующих запросов. Точные имена полей формы смотрите в инструментах разработчика браузера на вкладке «Сеть».

Почему в ответе нечитаемые символы вместо русского текста?

Кодировка страницы не совпадает с кодировкой чтения. Укажите её явно: ПолучитьТелоКакСтроку(КодировкаТекста.UTF8) или КодировкаТекста.ANSI для windows-1251. Подсказку ищите в заголовке Content-Type ответа или в мета-теге charset в начале HTML.

Можно ли получить данные со страницы, где они подгружаются скриптами?

Через HTTPСоединение — нет, скрипты не выполняются. Откройте страницу в браузере, во вкладке «Сеть» инструментов разработчика найдите запрос, которым страница получает данные (обычно это JSON), и обращайтесь по этому адресу напрямую из 1С.

Работает ли HTTPСоединение в фоновых заданиях?

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

Чем отличается ПолучитьТелоКакСтроку от ПолучитьТелоКакПоток?

Первый метод возвращает всё тело ответа строкой — удобно для HTML-страниц. Второй отдаёт поток, который можно записать в файл без загрузки содержимого в память целиком; он предпочтителен для больших файлов, а не для разбора HTML.

Сайт отвечает редиректом 301 — что делать?

Прочитайте заголовок Location из ответа и выполните новый запрос по указанному адресу. Часто редирект ведёт с HTTP на HTTPS или с адреса без www на адрес с www — достаточно сразу использовать конечный адрес.

Итог

Что важно запомнить

Базовая связка для получения HTML в 1С — HTTPСоединение, HTTPЗапрос и метод Получить; для HTTPS добавьте ЗащищенноеСоединениеOpenSSL. Всегда проверяйте код состояния, задавайте таймаут и кодировку, выполняйте запросы на сервере. Данные, подгружаемые JavaScript, в исходном HTML отсутствуют — ищите их прямой адрес.