Разработка и Конфигурация · 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 страницы ошибки, которая потом «отравит» дальнейший парсинг.
Соединение = Новый 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С доступ в интернет и не блокирует ли его файрвол.
Как выбрать подход
Альтернативные способы
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-запрос.
Сравнение вариантов
Штатно, кроссплатформенно, работает на сервере и в фоновых заданиях. Не выполняет JavaScript.
Гибче настройка, но только Windows и только там, где выполняется код. Зависит от прав на создание COM.
Подходит для отображения страницы пользователю, выполняет скрипты. Не предназначено для пакетной загрузки данных.
Обработка ошибок и проверка результата
Сетевые запросы нестабильны по своей природе, поэтому код должен быть обёрнут в попытку/исключение, а результат — проверен перед использованием. Минимальный набор проверок: код состояния 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Соединение может быть недоступно или ограничено. Для интеграций размещайте код на сервере (&НаСервере) или в серверном общем модуле.
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 отсутствуют — ищите их прямой адрес.