При интеграции 1С с веб-сайтами и внешними сервисами разработчики часто сталкиваются с ситуацией, когда адрес страницы содержит символ # (якорь или хэш), указывающий на конкретную вкладку или блок на странице. В этой статье проанализируем, почему сервер игнорирует фрагменты после символа # при выполнении GET-запросов из 1С, и разберем способы получения необходимых данных.
Рассмотри, как работают запросы с символом #. По стандарту протокола HTTP часть URL-адреса, расположенная после знака # (fragment identifier), предназначена исключительно для клиента (браузера) и никогда не отправляется на веб-сервер. Когда вы вводите такой URL в адресную строку браузера, сетевой стек отсекает всё, что идет после #, и формирует HTTP-запрос только к основному пути и Query-параметрам.
В браузере переключение вкладок или отображение нужного блока происходит за счет работы скриптов JavaScript, которые читают фрагмент URL и либо меняют видимость элементов DOM-дерева, либо выполняют фоновый запрос (AJAX) за дополнительными данными.
Объекты 1С HTTPСоединение и HTTPЗапрос представляют собой чистый HTTP-клиент. Они получают исходный HTML-код, отдаваемый сервером, но не содержат браузерного движка для выполнения JavaScript. В результате запрос передается без хэша, а скрипты сайта для отображения нужной вкладки не исполняются.
Некоторые веб-серверы анализируют заголовок User-Agent и отдают разный состав данных для обычных веб-браузеров и для автоматизированных запросов. Если передать заголовки, имитирующие полноценный браузер, сервер может вернуть полную версию страницы, содержащую данные со всех вкладок сразу.
Разберем по шагам, как настроить заголовки запроса в 1С:
Соответствие для хранения заголовков HTTP.User-Agent значением современного браузера.HTTPЗапрос с требуемым путем (без символа #).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 Тогда
ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Если данные нужной вкладки подгружаются динамически с помощью JavaScript, наиболее надежный подход — выяснить, какой реальный сетевой запрос отправляется при клике на вкладку.
Проанализируем порядок действий:
?tab=rejection).HTTPЗапрос в 1С непосредственно по найденному адресу, при необходимости добавив заголовок X-Requested-With: XMLHttpRequest.Если сервер выдает информацию только после исполнения клиентского JavaScript и прямой API-запрос сделать невозможно, используем элемент формы ПолеHTMLДокумента. В нем задействован полноценный движок браузера, который отработает скрипты страницы и загрузит данные нужной вкладки по URL с якорем.
Выясним особенности работы с этим элементом:
ПолеHTMLДокумента.Перейти().ДокументСформирован) извлекаем данные из структуры DOM через свойство Документ.Выбор конкретного решения зависит от логики работы целевого сайта: в простых случаях достаточно подставить заголовок User-Agent, а для динамических веб-страниц следует использовать прямой API-запрос или встроенный браузерный элемент формы.