Как получить текст HTML в режиме веб-клиента?

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

При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью получения данных с внешних веб-ресурсов. В «толстом» клиенте или на сервере эта задача решается тривиально через использование объекта HTTPСоединение. Однако в веб-клиенте долгое время существовали строгие ограничения. Давайте разберем, как реализовать получение данных сегодня и какие нюансы при этом стоит учитывать.

Разбор ситуации: почему возникали проблемы?

Исторически веб-клиент 1С работает внутри браузера, который накладывает жесткие ограничения безопасности. Главное из них — политика CORS (Cross-Origin Resource Sharing). Если вы пытались сделать запрос к стороннему сайту, браузер блокировал его, так как 1С работала в рамках одного домена, а запрашиваемый ресурс находился в другом. Именно поэтому раньше единственным надежным способом было перенесение логики запроса на сторону сервера.

Решение 1: Прямые HTTP-запросы в веб-клиенте

В актуальных версиях платформы 1С разработчики реализовали поддержку объектов HTTPЗапрос и HTTPСоединение непосредственно в веб-клиенте. Теперь вы можете выполнять запросы, не прибегая к серверным вызовам, при условии, что целевой сервер разрешает кросс-доменные запросы.

Важно помнить, что в веб-клиенте все операции с сетью выполняются асинхронно. Блокировка интерфейса браузера недопустима, поэтому использование синхронных методов приведет к ошибке исполнения.

Рассмотрим, как правильно организовать асинхронный вызов:


// Пример асинхронного выполнения запроса
Асинх Процедура ПолучитьДанныеСайта()
    Соединение = Новый HTTPСоединение("example.com");
    Запрос = Новый HTTPЗапрос("/index.html");
    
    // Используем ключевое слово Ждать для асинхронного получения ответа
    Ответ = Ждать Соединение.ПолучитьАсинх(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
        Сообщить(ТекстHTML);
    Иначе
        Сообщить("Ошибка соединения: " + Ответ.КодСостояния);
    КонецЕсли;
КонецПроцедуры

При работе с этим подходом обратите внимание на следующие моменты:

  1. Ограничения CORS: Если сервер не отдает заголовок Access-Control-Allow-Origin, ваш запрос будет отклонен браузером. Никакие настройки 1С здесь не помогут — это правила безопасности самого браузера.
  2. Авторизация: Браузер может автоматически подставлять куки текущей сессии пользователя, если вы обращаетесь к ресурсам, требующим авторизации, что часто приводит к непредсказуемым результатам.

Решение 2: Использование серверного вызова (Проксирование)

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

Разберем алгоритм работы:

  1. На клиенте вызывается серверная функция.
  2. Сервер 1С выполняет запрос, используя стандартные методы HTTPСоединение.
  3. Полученный результат (HTML или JSON) возвращается на клиент в виде строки.

Этот метод является универсальным и наиболее стабильным. Он позволяет скрыть детали запроса от браузера и избежать проблем с безопасностью.


// Клиентский вызов
&НаКлиенте
Процедура ПолучитьКонтент(Команда)
    ТекстHTML = ПолучитьДанныеНаСервере();
    // Обработка полученного текста...
КонецПроцедуры

// Серверная функция
&НаСервереБезКонтекста
Функция ПолучитьДанныеНаСервере()
    Соединение = Новый HTTPСоединение("example.com");
    Запрос = Новый HTTPЗапрос("/index.html");
    Ответ = Соединение.Получить(Запрос);
    Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции

Итоги и рекомендации

Мы проанализировали основные способы взаимодействия с веб-ресурсами из веб-клиента 1С:

Использование Поле HTML документа на форме также остается доступным инструментом для визуализации полученного контента. Вы можете программно загрузить полученную строку HTML в это поле, используя свойство Документ или метод УстановитьТекст (в зависимости от версии платформы), что позволит пользователю сразу увидеть результат в удобном виде.

← На главную