Почему InternetExplorer сбрасывает параметры URL при навигации из 1С и как это исправить?

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

При автоматизации взаимодействия с веб-страницами из 1С через COM-объект InternetExplorer.Application разработчики нередко сталкиваются со странным поведением: метод Navigate передает адрес с GET-параметрами (например, пагинацией страницы вида &page=2), браузер начинает загрузку, отображает нужную страницу, а затем внезапно выполняет автоматический редирект на базовый URL без параметров (на первую страницу).

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

Анализ проблемы: почему сбрасываются параметры страницы

Посмотрим на исходный пример кода, вызывающий проблему при навигации:


appIE = Новый COMОбъект("InternetExplorer.Application");
appIE.Visible = Истина;
url = "http://krasnoyarsk.n1.ru/search/?rubric=flats&is_newbuilding=true&page=2";
appIE.Navigate(url);

Как показывает диагностика, точно такой же эффект возникает даже при ручной вставке этого адреса в окно Internet Explorer 11, в то время как современные браузеры корректно удерживают страницу. Проанализируем ключевые причины этого явления:

  1. Сбой клиентской маршрутизации (SPA): Современные сайты реализуют фильтрацию и пагинацию с помощью клиентских JavaScript-фреймворков. При инициализации скрипт пытается прочитать параметры строки через современные веб-стандарты. В движке Trident (Internet Explorer) нужные API либо отсутствуют, либо обрабатываются некорректно подключенными полифилами, из-за чего роутер сайта сбрасывает состояние на начальное (первую страницу).
  2. Агрессивное кэширование GET-запросов: Internet Explorer жестко кэширует ответы сервера. Если сайт выполняет фоновые асинхронные запросы без заголовков запрета кэширования, браузер может отдать ранее сохраненный ответ для базового адреса.
  3. Особая реакция сервера на User-Agent устаревшего браузера: Серверная часть веб-ресурса может принудительно перенаправлять клиентов на устаревших версиях браузеров на упрощенную или главную страницу раздела.
  4. Ограничения COM-интерфейса в актуальных ОС: Internet Explorer выведен из эксплуатации в современных версиях Windows, а COM-объект может работать нестабильно, перенаправляясь на механизмы совместимости. Кроме того, 64-разрядные клиенты и серверы 1С не могут напрямую взаимодействовать с 32-разрядными COM-серверами без специальной настройки системных суррогатов.

Решение 1. Переход на нативное получение данных через HTTPСоединение

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

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


// Определяем хост и путь к ресурсу
Сервер = "krasnoyarsk.n1.ru";
ОтносительныйURL = "/search/?rubric=flats&is_newbuilding=true&page=2";

// Создаем защищенное соединение (при необходимости работы по https)
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);

// Заполняем необходимые заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("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");
Заголовки.Вставить("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");

Запрос = Новый HTTPЗапрос(ОтносительныйURL, Заголовки);
Ответ = Соединение.Получить(Запрос);

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

Важное ограничение: объект HTTPСоединение выполняет прямой транспортный запрос и не выполняет JavaScript внутри страницы. Если целевой сайт полностью формирует контент динамически на клиенте (SPA), обычный запрос вернет лишь пустой HTML-каркас.

Решение 2. Запрос к внутреннему API сайта

Проанализируем структуру работы современных сайтов объявлений и каталогов. Практически любой ресурс, меняющий пагинацию без полной перезагрузки окна, обращается к собственному внутреннему REST/JSON API. Это означает, что переходить на веб-страницу и парсить сложный HTML-код вообще не требуется.

Разберем последовательность действий:

  1. Открываем целевой сайт в современном браузере (Chrome, Edge, Firefox).
  2. Нажимаем клавишу F12 и переходим на вкладку Network (Сеть).
  3. Фильтруем запросы по типу Fetch/XHR.
  4. Переключаем пагинацию на вторую страницу на самом сайте.
  5. Находим сетевой запрос, отдающий чистый JSON со списком объектов (квартир, товаров, объявлений).
  6. Копируем URL этого внутреннего запроса и обращаемся к нему из 1С через HTTPСоединение.

Посмотрим на пример отправки запроса к эндпоинту API и десериализации ответа в структуру 1С:


Сервер = "krasnoyarsk.n1.ru";
ПутьAPI = "/api/v1/flats/?page=2&is_newbuilding=true";

Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");

Запрос = Новый HTTPЗапрос(ПутьAPI, Заголовки);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    // В переменной Данные находится готовая структура или массив с чистыми данными
КонецЕсли;

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

Решение 3. Альтернативы при необходимости отображения интерфейса

Если отображение страницы все же необходимо пользователю непосредственно в интерфейсе программы, рекомендуется отказаться от создания внешнего COM-объекта и использовать один из следующих вариантов:

  1. Поле HTML-документа на форме: В современных версиях платформы 1С:Предприятие 8.3 рендеринг элемента формы «Поле HTML-документа» переведен на современный кроссплатформенный движок WebKit/Chromium, в котором отсутствуют ошибки совместимости устаревшего Trident.
  2. Автоматизация современных браузеров: Если требуется эмуляция действий пользователя с выполнением клиентских скриптов, применяют запуск современных браузеров (Google Chrome, Microsoft Edge) в фоновом режиме (headless) с помощью метода ЗапуститьПриложение и управление ими по протоколу DevTools (CDP) или WebDriver.
← На главную