Как в 1С получить данные со всех страниц сайта при пагинации, если URL не меняется?

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

При интеграции 1С с внешними веб-ресурсами нередко возникает задача автоматического сбора данных. Мы настраиваем объект HTTPСоединение, отправляем GET-запрос, получаем страницу и успешно парсим её содержимое. Однако при наличии на сайте постраничной навигации часто обнаруживается проблема: при переходе по номерам страниц в браузере визуально меняются отображаемые данные, но основной URL в адресной строке остаётся прежним. При попытке повторного запроса к этому же адресу из 1С загружается только самая первая страница.

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

Почему адрес в строке браузера не меняется?

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

  1. Асинхронные запросы (AJAX / Fetch / XHR). При клике на номер страницы JavaScript в браузере перехватывает событие, отправляет фоновый запрос к бэкенду сайта (чаще всего API, возвращающее JSON или готовый блок HTML) и перерисовывает таблицу на экране без полной перезагрузки страницы. Это стандартная модель для SPA (Single Page Application).
  2. Передача параметров методом POST. Страница может перезагружаться, но номер текущей страницы и параметры фильтрации передаются не в адресной строке (как GET-параметры вида ?page=2), а внутри тела HTTP-запроса методом POST.
  3. Использование фреймов (iframe). Данные могут отображаться во вложенном фрейме. Адрес родительского окна при этом остаётся постоянным, а меняется только адрес внутреннего ресурса, загружаемого в src фрейма.

Ограничения серверного контекста и регламентных заданий в 1С

На форумах часто советуют использовать элемент управления формы ПолеHTMLДокумента или COM-объект Internet Explorer (через обращение к свойству Документ, поиск элементов frames и вызов метода нажатия на кнопки). Выясним, почему этот путь не подходит для регламентных задач:

  1. Отсутствие интерфейса: Регламентные и фоновые задания выполняются на стороне сервера 1С:Предприятия. В этом контексте экранных форм, диалогов и элементов управления вроде ПолеHTMLДокумента не существует в принципе.
  2. Ненадёжность COM-объектов: Использование внешних COM-объектов (Internet Explorer) внутри серверных процессов rphost крайне нестабильно, провоцирует утечки памяти, не работает в 64-разрядных средах без дополнительных прослоек и полностью неработоспособно на серверах под управлением Linux.

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

Решение 1. Анализ сетевого трафика и прямое обращение к API (основной способ)

В большинстве случаев эмулировать клики пользователя не требуется. Достаточно выяснить, куда сам браузер обращается за следующей порцией данных, и воспроизвести этот запрос в 1С.

Разберём по шагам процесс отслеживания и реализации:

  1. Открываем целевой сайт в браузере и нажимаем клавишу F12 (Панель разработчика).
  2. Переходим на вкладку Network («Сеть») и включаем фильтрацию по типу Fetch/XHR.
  3. Нажимаем на вторую страницу пагинации на сайте и смотрим, какой сетевой запрос появился в списке.
  4. Изучаем параметры появившегося запроса: метод (GET или POST), точный адрес эндпоинта, заголовки и передаваемые параметры (payload/query).
  5. Повторяем аналогичный запрос из 1С с помощью объектов HTTPСоединение и HTTPЗапрос.

Посмотрим на пример отправки запроса в цикле по страницам, если параметры пагинации передаются в URL:


// Пример GET-запроса к реальному источнику данных
Сервер = "api.example.com";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, ЗащищенноеСоединение);

Для НомерСтраницы = 1 По 5 Цикл
    АдресРесурса = "/api/v1/items?page=" + Формат(НомерСтраницы, "ЧГ=0") + "&limit=50";
    
    Запрос = Новый HTTPЗапрос(АдресРесурса);
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
    Запрос.Заголовки.Вставить("Accept", "application/json");
    
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
        
        // Разбираем полученный структурированный ответ
        ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
        Данные = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        // Обработка полученного массива данных
    КонецЕсли;
КонецЦикла;

Если веб-сервер принимает параметры пагинации через метод POST (в формате JSON или формы), передаём их непосредственно в теле запроса:


// Пример POST-запроса с параметрами в теле
Запрос = Новый HTTPЗапрос("/api/getData");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");

ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("page", 2);
ПараметрыЗапроса.Вставить("pageSize", 50);

ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Решение 2. Использование headless-инструментов для сложных SPA

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

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

  1. На сервере настраивается скрипт на базе библиотек автоматизации (например, Puppeteer или Playwright на Node.js / Python).
  2. Скрипт запускает браузер в фоновом режиме, открывает страницу, ожидает выполнения клиентских скриптов, программно кликает по кнопкам навигации и сохраняет итоговый HTML-код или структурированный JSON-файл на диск.
  3. 1С в регламентном задании вызывает этот скрипт через метод ЗапуститьПриложение() и считывает результат:

// Вызов внешнего скрипта парсинга из серверного контекста 1С
КомандаЗапуска = "node /opt/scripts/parser.js --page=2 --output=/tmp/result.json";
КодВозврата = 0;

ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);

Если КодВозврата = 0 Тогда
    ЧтениеТекста = Новый ЧтениеТекста();
    ЧтениеТекста.Открыть("/tmp/result.json", "UTF-8");
    РезультатСтр = ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    
    // Выполняем разбор полученных данных
КонецЕсли;

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

← На главную