При интеграции 1С с современными веб-порталами (особенно государственными ресурсами, такими как наш.дом.рф) разработчики часто сталкиваются с ситуацией, когда стандартный запрос возвращает не ожидаемый JSON или HTML-код с данными, а техническую страницу с «прелоадером» — анимированным спиннером ожидания. В этой статье мы подробно разберем, почему это происходит, проанализируем механизмы работы современных сайтов и выясним, как заставить 1С получать корректные данные.
Основная причина кроется в архитектуре современных веб-приложений, называемой SPA (Single Page Application). Проанализируем механику процесса: когда вы отправляете запрос через объект HTTPСоединение, сервер возвращает не готовую страницу, а пустой «каркас» и тяжелый набор JavaScript-сценариев. Обычный браузер (Chrome, Firefox) исполняет эти скрипты, которые в свою очередь делают дополнительные запросы к бэкенду и отрисовывают данные на экране.
Объект HTTPСоединение в 1С является «низкоуровневым» клиентом. Он умеет скачивать тело ответа, но не умеет исполнять JavaScript. Получив статус ответа 200, 1С считает задачу выполненной, однако в теле ответа содержится лишь код индикатора загрузки. Именно поэтому увеличение таймаута не приносит результата — соединение закрывается корректно с точки зрения протокола HTTP, но данные просто не успевают «родиться» внутри JS-движка, которого у HTTPСоединение нет.
Рассмотрим наиболее правильный и производительный способ решения задачи. Вместо того чтобы пытаться загрузить и отрендерить всю страницу целиком, мы можем найти прямой путь к данным, который использует сам сайт. Разберем этот процесс по шагам:
/api/v1/get_data....После того как нужный URL найден, его можно использовать в 1С напрямую. Посмотрим на пример формирования такого запроса:
Соединение = Новый HTTPСоединение("наш.дом.рф", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
ЗаголовокЗапроса = Новый Соответствие;
ЗаголовокЗапроса.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36");
ЗаголовокЗапроса.Вставить("Accept", "application/json");
ЗаголовокЗапроса.Вставить("Referer", "https://наш.дом.рф/сервис/поиск");
Запрос = Новый HTTPЗапрос("/api/pdl/v1/objects/list", ЗаголовокЗапроса);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
КонецЕсли;
Важный нюанс: многие сайты защищаются от парсинга и проверяют наличие специфических куки (Cookies) или токенов безопасности (CSRF-token). Если запрос возвращает ошибку 403, проанализируйте в консоли браузера вкладку Headers (Заголовки) и перенесите все ключевые параметры в свой код 1С.
Если сайт использует сложные алгоритмы формирования подписей или JS-челленджи, которые сложно воспроизвести через HTTPСоединение, мы можем задействовать Поле HTML документа. Начиная с версии платформы 1С 8.3.14 (и особенно стабильно с 8.3.18), в 1С появилась возможность использовать движок Chromium вместо устаревшего WebKit или Internet Explorer.
Рассмотрим, как настроить конфигурацию для корректной работы:
РежимИспользованияВстроенногоЯзыка.Вариант2 или убедитесь, что в свойствах конкретного Поля HTML документа на форме выбран современный движок в параметре Режим отображения.Проанализируем пример получения данных из уже отрисованного DOM-дерева:
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
// ЭлементФормы.ПолеСайта - это программное имя поля HTML документа
ТекстСтраницы = Элементы.ПолеСайта.Документ.documentElement.innerHTML;
// Если данные лежат в JSON внутри тега script или в определенном div
// Мы можем использовать регулярные выражения или поиск по строке
ПозицияНачала = Найти(ТекстСтраницы, "window.__INITIAL_STATE__ =");
// Далее следует логика парсинга конкретного блока
КонецПроцедуры
Главный минус этого способа — необходимость наличия открытой формы (интерфейса). Для фоновых заданий на сервере этот метод не подходит, так как требует контекста клиентского приложения.
При работе с государственными порталами РФ (такими как наш.дом.рф) часто возникает проблема не со спиннером, а с невозможностью установить защищенное соединение. 1С может выдавать ошибку «Удаленный хост принудительно разорвал существующее подключение».
Выясним причину: такие сайты перешли на отечественные сертификаты шифрования. Для решения проблемы в 1С необходимо выполнить следующие шаги:
HTTPСоединение явно инициализировать ЗащищенноеСоединениеOpenSSL, при необходимости указывая путь к файлу сертификатов.Если защита сайта крайне высока (используются проверки движений мыши, Canvas Fingerprinting и т.д.), проанализируем вариант создания «прослойки». Мы можем использовать внешнюю библиотеку на Python (библиотека Selenium или Playwright) или Node.js (Puppeteer).
Сценарий взаимодействия будет следующим:
ЗапуститьПриложение) или отправляет запрос к локальному микросервису на Python.Это самый ресурсоемкий, но и самый надежный метод обхода прелоадеров, так как для сайта такой запрос ничем не отличается от действий реального пользователя.
Для успешной обработки ответа http-сервиса в 1С важно понимать, что прелоадер — это не ошибка, а промежуточное состояние интерфейса. Чтобы получить данные, мы должны либо спуститься на уровень ниже и работать с прямым API сайта, либо подняться на уровень выше и использовать полноценный движок рендеринга Chromium.
Рекомендуем начинать с анализа вкладки Network в браузере. В 90% случаев это позволяет найти прямой URL, который отдает чистый JSON, что работает в десятки раз быстрее и стабильнее любых визуальных методов парсинга.