При интеграции 1С с внешними веб-ресурсами разработчики часто сталкиваются с ситуацией, когда обычный объект HTTPЗапрос возвращает вместо ожидаемых данных (JSON или HTML-кода страницы) лаконичное сообщение: "Please enable JavaScript to view the page content". Это сигнализирует о том, что целевой сайт защищен специализированными средствами защиты от автоматизированного сбора данных (скрейпинга) или DDoS-атак, такими как Cloudflare, F5 BIG-IP или внутренними фильтрами WAF (Web Application Firewall). В данной статье мы подробно разберем, почему это происходит и какими способами можно обойти данное ограничение в среде 1С.
Для начала проанализируем ситуацию и поймем механику защиты. Обычный объект 1С HTTPСоединение — это «чистый» HTTP-клиент. Он умеет отправлять запросы и получать ответы, но он не является браузером. Он не обладает движком для исполнения программного кода (JavaScript), который содержится в теле ответа. Современные системы защиты используют так называемый JavaScript Challenge.
Когда вы обращаетесь к сайту, сервер проверяет ваш заголовок User-Agent и другие параметры. Если он подозревает, что запрос делает бот, он отправляет промежуточную страницу с JS-скриптом. Браузер пользователя незаметно для него исполняет этот скрипт, вычисляет некий математический токен, устанавливает специальную Cookie и перенаправляет запрос обратно на сервер. Сервер видит правильную куку и «пропускает» пользователя к реальному контенту. Поскольку 1С просто скачивает текст страницы, скрипт не выполняется, токен не вычисляется, и вы остаетесь перед «закрытой дверью» с надписью об отключенном JavaScript.
Рассмотрим на примере сайта румынского министерства финансов (mfinante.ro), о котором шла речь в исходном вопросе. Попытка «парсить» визуальную страницу — это тупиковый путь, так как дизайн и методы защиты могут меняться. Правильнее всего будет найти официальный программный интерфейс.
Для налогоплательщиков Румынии существует сервис ANAF API. Вместо того чтобы имитировать действия пользователя в браузере, мы можем отправить прямой структурированный запрос. Разберем примерную схему взаимодействия:
HTTPЗапрос к адресу сервиса (например, для проверки по ИНН/CUI).Content-Type: application/json.Такой метод гарантированно вернет данные без проверки на JavaScript, так как API предназначено именно для программного доступа.
Если API отсутствует, нам придется имитировать поведение браузера. В 1С для этого есть объект ПолеHTMLДокумента. В отличие от HTTPЗапрос, этот объект использует движок Internet Explorer (в старых версиях) или современные движки (в новых версиях платформы), которые умеют исполнять JavaScript.
Однако при работе с этим полем часто возникают всплывающие окна с ошибками скриптов или вопросами безопасности. Чтобы этого избежать, проанализируем настройку режима «тишины». Рассмотрим пример кода для программного создания объекта и подавления диалогов:
// Создаем форму или используем готовую с элементом ПолеHTMLДокумента
// Чтобы подавить ошибки скриптов, обратимся к объекту COM
ДокументHTML = ЭлементыФормы.ПолеHTMLДокумента1.Документ;
// Для подавления окон в ActiveX Internet Explorer:
ЭлементыФормы.ПолеHTMLДокумента1.Silent = Истина;
Рассмотрим подробнее алгоритм действий:
ПолеHTMLДокумента на форме (можно сделать его невидимым или разместить на скрытой странице панели).Перейти(АдресСайта).ДокументСформирован. На этом этапе скрипты защиты уже отработали.ЭлементыФормы.ПолеHTMLДокумента1.Документ.body.innerText.Постоянно использовать ПолеHTMLДокумента ресурсоемко и неудобно для массовых запросов. Проанализируем ситуацию: нам нужно пройти проверку JavaScript всего один раз, чтобы получить «проходной билет» в виде файлов Cookie.
Выясним, как автоматизировать этот процесс:
ПолеHTMLДокумента.КукиСайта = ЭлементыФормы.ПолеHTMLДокумента1.Документ.cookie;.HTTPЗапрос, добавляя заголовок Cookie.Посмотрим на пример формирования такого запроса:
Соединение = Новый HTTPСоединение("www.mfinante.ro");
Запрос = Новый HTTPЗапрос("/infocodfiscal.html");
// Подставляем куки, полученные через браузер
Запрос.Заголовки.Вставить("Cookie", ПолученныеКукиИзПоляHTML);
// Обязательно имитируем реальный браузер в User-Agent
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36");
Ответ = Соединение.Получить(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Иногда защитный экран срабатывает просто потому, что 1С отправляет слишком «честный» заголовок User-Agent, который прямо говорит серверу: «Я — библиотека 1C+Runtime». Посмотрим, какие заголовки необходимо добавить, чтобы минимизировать риск блокировки:
ru-RU,ru;q=0.9,en-US;q=0.8).text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8.В наиболее сложных случаях, когда защита постоянно обновляется (например, Cloudflare последней версии), встроенных средств 1С может быть недостаточно. Профессиональные разработчики используют внешние «прослойки».
Рассмотрим вариант использования Python с библиотекой cloudscraper. Эта библиотека специально разработана для обхода проверок на JavaScript. Мы можем написать небольшой скрипт на Python, который принимает ИНН, делает запрос и возвращает результат, а из 1С запускать его через ЗапуститьПриложение или через COMОбъект("WScript.Shell").
Пример логики вызова внешнего скрипта:
КомандаЗапуска = "python C:\Scripts\get_data.py " + ИНН;
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);
// Далее читаем результат из текстового файла, куда его сохранил скрипт
Проблема «Please enable JavaScript» — это не ошибка в коде 1С, а результат работы системы безопасности сайта. Для её решения мы проанализировали три основных подхода:
Во-первых, использование официальных API, что является «золотым стандартом» разработки.
Во-вторых, использование встроенного ПолеHTMLДокумента с флагом Silent для имитации действий пользователя.
В-третьих, комбинированный метод с извлечением сессионных куки для последующей работы через быстрые HTTP-соединения.
Выбор метода зависит от ваших задач: для разовых запросов подойдет ПолеHTMLДокумента, для высоконагруженных систем — поиск API или использование внешних специализированных скриптов.