При реализации задач по парсингу веб-ресурсов разработчики 1С нередко сталкиваются с ситуацией: при открытии адреса в браузере страница отображается корректно, однако при попытке прочитать ее программно объект возвращает пустое содержимое. Особенно часто такая проблема возникает при переносе кода с локального рабочего места разработчика на серверный контур. Разберем по шагам, почему так происходит, какие ограничения существуют у стандартных методов и как правильно организовать загрузку и разбор HTML-кода.
Рассмотрим типовой исходный код, который часто используют для чтения веб-страниц:
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(АдресДокумента, Кодировка);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЧтениеHTML.Закрыть();
Метод ОткрытьФайл объекта ЧтениеHTML изначально спроектирован для работы с локальными файлами на диске. При передаче в него веб-адреса (URL) платформа выполняет базовый системный вызов, имеющий ряд критических недостатков:
User-Agent, Accept и Accept-Language. Большинство современных веб-серверов, систем защиты от ботов (WAF) и Cloudflare блокируют подобные обращения или возвращают ошибку 403 Forbidden.ЧтениеHTML не вызывает исключение, а просто формирует пустое дерево DOM, создавая иллюзию отсутствия данных на странице.301, 302, 307, 308), в результате чего ответ остается пустым.Для надежного получения данных необходимо разделить процесс на два этапа: сетевое взаимодействие с помощью объекта HTTPСоединение и непосредственный парсинг полученного текста через ЧтениеHTML и ПостроительDOM.
Посмотрим на пример универсальной функции загрузки и разбора веб-страницы:
Функция ПолучитьДокументHTML(Сервер, ПутьНаСервере, ЭтоHTTPS = Истина) Экспорт
// 1. Настройка защищенного соединения для HTTPS
SSL = Неопределено;
Если ЭтоHTTPS Тогда
SSL = Новый ЗащищенноеСоединениеOpenSSL();
КонецЕсли;
// 2. Инициализация HTTP-соединения
Соединение = Новый HTTPСоединение(
Сервер,
?(ЭтоHTTPS, 443, 80),
,
,
,
30,
SSL
);
// 3. Формирование запроса с эмуляцией браузера
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
Запрос.Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
Запрос.Заголовки.Вставить("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
// 4. Отправка запроса и проверка ответа
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение СтрШаблон("Ошибка получения страницы. Код состояния: %1", Ответ.КодСостояния);
КонецЕсли;
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
// 5. Разбор HTML-строки в DOM-документ
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстHTML);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЧтениеHTML.Закрыть();
Возврат ДокументHTML;
КонецФункции
В этом примере метод ЧтениеHTML.УстановитьСтроку выполняет разбор разметки прямо из оперативной памяти без необходимости создавать временные файлы на жестком диске.
Если код выполняется на сервере (в контексте фонового задания, регламентного задания или серверного вызова), необходимо учитывать специфику серверного окружения:
ragent.exe или rphost.exe) запускается под специальным системным пользователем (например, USR1CV8). Если на сервере доступ в интернет ограничен или настроен через доменные политики, учетной записи службы 1С необходимо явно предоставить сетевые права для исходящих подключений по портам 80 и 443.Network) и выполнять запросы напрямую к API-эндпоинтам, откуда сайт получает данные в формате JSON или XML.ЗащищенноеСоединениеOpenSSL позволяет платформе 1С использовать встроенные механизмы работы с современными протоколами TLS 1.2 и TLS 1.3 независимо от системных настроек реестра Windows.