Почему при чтении HTML страницы в 1С возвращается пустой документ и как это исправить?

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

При реализации задач по парсингу веб-ресурсов разработчики 1С нередко сталкиваются с ситуацией: при открытии адреса в браузере страница отображается корректно, однако при попытке прочитать ее программно объект возвращает пустое содержимое. Особенно часто такая проблема возникает при переносе кода с локального рабочего места разработчика на серверный контур. Разберем по шагам, почему так происходит, какие ограничения существуют у стандартных методов и как правильно организовать загрузку и разбор HTML-кода.

Анализ проблемы: почему метод ОткрытьФайл возвращает пустоту

Рассмотрим типовой исходный код, который часто используют для чтения веб-страниц:


ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(АдресДокумента, Кодировка);

ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);

ЧтениеHTML.Закрыть();

Метод ОткрытьФайл объекта ЧтениеHTML изначально спроектирован для работы с локальными файлами на диске. При передаче в него веб-адреса (URL) платформа выполняет базовый системный вызов, имеющий ряд критических недостатков:

  1. Отсутствие заголовков браузера: Запрос отправляется без базовых HTTP-заголовков, таких как User-Agent, Accept и Accept-Language. Большинство современных веб-серверов, систем защиты от ботов (WAF) и Cloudflare блокируют подобные обращения или возвращают ошибку 403 Forbidden.
  2. Скрытые сетевые ошибки: При возникновении ошибок протокола HTTP (коды 4xx и 5xx) объект ЧтениеHTML не вызывает исключение, а просто формирует пустое дерево DOM, создавая иллюзию отсутствия данных на странице.
  3. Проблемы с перенаправлениями: Системный вызов не всегда корректно обрабатывает HTTP-редиректы (коды 301, 302, 307, 308), в результате чего ответ остается пустым.
  4. Кроссплатформенные ограничения: Если сервер 1С работает под управлением Linux, прямое открытие сетевых адресов через файловые методы платформы не поддерживается либо ведет себя нестабильно.

Правильный подход: разделение загрузки и парсинга через HTTPСоединение

Для надежного получения данных необходимо разделить процесс на два этапа: сетевое взаимодействие с помощью объекта 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.УстановитьСтроку выполняет разбор разметки прямо из оперативной памяти без необходимости создавать временные файлы на жестком диске.

Особенности работы на стороне сервера и сетевые ограничения

Если код выполняется на сервере (в контексте фонового задания, регламентного задания или серверного вызова), необходимо учитывать специфику серверного окружения:

  1. Права системной учетной записи: Служба сервера 1С (обычно ragent.exe или rphost.exe) запускается под специальным системным пользователем (например, USR1CV8). Если на сервере доступ в интернет ограничен или настроен через доменные политики, учетной записи службы 1С необходимо явно предоставить сетевые права для исходящих подключений по портам 80 и 443.
  2. Динамическая подгрузка контента (SPA, React, Vue): Если сайт построен как одностраничное приложение (Single Page Application), в первичном HTML-ответе будет присутствовать только каркас страницы без данных. Вся полезная информация загружается браузером асинхронно через JavaScript-запросы (XHR / Fetch). Для парсинга таких страниц рекомендуется открыть инструменты разработчика в браузере (вкладка Network) и выполнять запросы напрямую к API-эндпоинтам, откуда сайт получает данные в формате JSON или XML.
  3. Протоколы шифрования TLS: Использование объекта ЗащищенноеСоединениеOpenSSL позволяет платформе 1С использовать встроенные механизмы работы с современными протоколами TLS 1.2 и TLS 1.3 независимо от системных настроек реестра Windows.
← На главную