Как передать параметр с якорем (#) в GET-запросе через HTTPСоединение в 1С?

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

При интеграции 1С с веб-сайтами и внешними сервисами разработчики часто сталкиваются с ситуацией, когда адрес страницы содержит символ # (якорь или хэш), указывающий на конкретную вкладку или блок на странице. В этой статье проанализируем, почему сервер игнорирует фрагменты после символа # при выполнении GET-запросов из 1С, и разберем способы получения необходимых данных.

Причина игнорирования якоря в HTTP-запросах

Рассмотри, как работают запросы с символом #. По стандарту протокола HTTP часть URL-адреса, расположенная после знака # (fragment identifier), предназначена исключительно для клиента (браузера) и никогда не отправляется на веб-сервер. Когда вы вводите такой URL в адресную строку браузера, сетевой стек отсекает всё, что идет после #, и формирует HTTP-запрос только к основному пути и Query-параметрам.

В браузере переключение вкладок или отображение нужного блока происходит за счет работы скриптов JavaScript, которые читают фрагмент URL и либо меняют видимость элементов DOM-дерева, либо выполняют фоновый запрос (AJAX) за дополнительными данными.

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

Способ 1. Установка заголовка User-Agent в HTTPЗапрос

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

Разберем по шагам, как настроить заголовки запроса в 1С:

  1. Создаем объект Соответствие для хранения заголовков HTTP.
  2. Заполняем заголовок User-Agent значением современного браузера.
  3. Формируем HTTPЗапрос с требуемым путем (без символа #).
  4. Выполняем запрос через HTTPСоединение и получаем ответ.

Посмотрим на пример кода 1С:


Сервер = "cargo.rzd.ru";
Соединение = Новый HTTPСоединение(Сервер);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Host", Сервер);
Заголовки.Вставить("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");

Запрос = Новый HTTPЗапрос("/cargo-notice/public/ru?STRUCTURE_ID=5180&page5753_4412", Заголовки);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Способ 2. Запрос напрямую к AJAX/API-эндпоинту сайта

Если данные нужной вкладки подгружаются динамически с помощью JavaScript, наиболее надежный подход — выяснить, какой реальный сетевой запрос отправляется при клике на вкладку.

Проанализируем порядок действий:

  1. Открываем нужную страницу в браузере и вызываем панель разработчика (клавиша F12).
  2. Переходим на вкладку Сеть (Network) и включаем фильтр Fetch/XHR.
  3. Кликаем на интересующую вкладку на сайте и находим появившийся сетевой запрос.
  4. Копируем URL этого запроса и его параметры (часто это прямой адрес API или GET-запрос с параметрами вида ?tab=rejection).
  5. Выполняем HTTPЗапрос в 1С непосредственно по найденному адресу, при необходимости добавив заголовок X-Requested-With: XMLHttpRequest.

Способ 3. Использование элемента «ПолеHTMLДокумента»

Если сервер выдает информацию только после исполнения клиентского JavaScript и прямой API-запрос сделать невозможно, используем элемент формы ПолеHTMLДокумента. В нем задействован полноценный движок браузера, который отработает скрипты страницы и загрузит данные нужной вкладки по URL с якорем.

Выясним особенности работы с этим элементом:

  1. Размещаем на управляемой форме элемент с типом ПолеHTMLДокумента.
  2. Загружаем адрес с якорем с помощью метода Перейти().
  3. После завершения загрузки и выполнения скриптов (событие ДокументСформирован) извлекаем данные из структуры DOM через свойство Документ.

Выбор конкретного решения зависит от логики работы целевого сайта: в простых случаях достаточно подставить заголовок User-Agent, а для динамических веб-страниц следует использовать прямой API-запрос или встроенный браузерный элемент формы.

← На главную