При автоматизации взаимодействия с веб-страницами из 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, в то время как современные браузеры корректно удерживают страницу. Проанализируем ключевые причины этого явления:
Если цель работы с 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-каркас.
Проанализируем структуру работы современных сайтов объявлений и каталогов. Практически любой ресурс, меняющий пагинацию без полной перезагрузки окна, обращается к собственному внутреннему REST/JSON API. Это означает, что переходить на веб-страницу и парсить сложный HTML-код вообще не требуется.
Разберем последовательность действий:
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.Закрыть();
// В переменной Данные находится готовая структура или массив с чистыми данными
КонецЕсли;
Данный подход работает в десятки раз быстрее, не зависит от установленных в системе браузеров, не нагружает оперативную память процессами отрисовки интерфейса и гарантирует точное сохранение параметров выборки.
Если отображение страницы все же необходимо пользователю непосредственно в интерфейсе программы, рекомендуется отказаться от создания внешнего COM-объекта и использовать один из следующих вариантов:
ЗапуститьПриложение и управление ими по протоколу DevTools (CDP) или WebDriver.