Как в 1С организовать работу с веб-формами сайтов: авторизация, поиск и извлечение данных

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

В практике разработчика 1С часто возникают задачи по интеграции с внешними ресурсами, у которых отсутствует открытый API. Это может быть сайт поставщика, государственный портал или корпоративный ресурс. Рассмотрим, как программно реализовать авторизацию, заполнение форм поиска и «граббинг» (парсинг) данных, используя встроенные инструменты 1С и современные подходы к веб-технологиям.

Выбор метода взаимодействия: Поле HTML-документа против прямых запросов

Проанализируем ситуацию, когда нам необходимо взаимодействовать с сайтом, написанным на ASP.NET или использующим современные фреймворки типа Angular. Основная сложность заключается в том, что обычного HTTPСоединение часто бывает недостаточно, так как сайт требует исполнения JavaScript на стороне клиента.

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

  1. Использование Поля HTML-документа (движок IE или Chromium): Позволяет видеть визуальное состояние страницы и программно обращаться к объектной модели документа (DOM).
  2. Прямые HTTP-запросы (WinHttp.WinHttpRequest.5.1): Более быстрый и «невидимый» способ, требующий ручной обработки Cookies и параметров состояния сессии.

Выясним причину, по которой автор темы остановился на «Поле HTML-документа». В обычных формах 1С этот элемент управления базируется на движке Internet Explorer, что позволяет имитировать действия реального пользователя, нажимая на кнопки и заполняя поля ввода.

Программное управление элементами Angular-форм

Рассмотрим конкретную проблему: как кликнуть на кнопку, если она описана через директивы Angular, например data-ng-click="$ctrl.authData.guestLogin()". Обычный метод Click() через COM-объект может не сработать, если на элементе нет стандартного обработчика события.

Проанализируем пример кода для работы с такими элементами. Если мы используем обращение через коллекцию классов, важно помнить, что getElementsByClassName возвращает массив (коллекцию), даже если элемент один:


// Ошибка: попытка вызвать Click у всей коллекции
// IE.document.getElementsByClassName("btn color-blue uppercase").Click(); 

// Правильно: обращение к конкретному индексу
Элемент = HTMLДокумент.getElementsByClassName("btn color-blue uppercase")[0];
Если Элемент <> Неопределено Тогда
    Элемент.click();
КонецЕсли;

Однако в Angular-приложениях простой вызов click() часто игнорируется. В таких случаях нам поможет выполнение произвольного JavaScript-кода. Разберем более надежный способ через инициацию события:


ТекстСкрипта = "
|var element = document.getElementsByClassName('btn color-blue uppercase')[0];
|var evt = document.createEvent('HTMLEvents');
|evt.initEvent('click', true, true);
|element.dispatchEvent(evt);";
HTMLДокумент.parentWindow.execScript(ТекстСкрипта, "javascript");

Если же платформа 1С позволяет использовать движок Chromium (в новых версиях 8.3), рекомендуется использовать метод ВыполнитьJavaScript(), который работает стабильнее устаревшего execScript.

Специфика работы с сайтами на ASP.NET

Посмотрим на особенности сайтов, созданных на базе ASP.NET Web Forms. Такие ресурсы часто защищены механизмом ViewState. Это скрытые поля формы (__VIEWSTATE, __EVENTVALIDATION), в которых сервер хранит состояние страницы.

Если вы решили отказаться от визуального «Поля HTML-документа» в пользу HTTPСоединение, вам придется:

  1. Выполнить GET-запрос к странице авторизации.
  2. С помощью регулярных выражений или парсера вычленить значения скрытых полей __VIEWSTATE.
  3. Передать эти значения обратно в POST-запросе вместе с логином и паролем.

Важный момент: Использование WinHttp.WinHttpRequest.5.1 через COM-объект в 1С зачастую удобнее встроенного HTTPСоединение, так как он лучше справляется с автоматической обработкой редиректов и хранением куки-файлов (Cookies) в рамках сессии.

Имитация действий пользователя и обход защиты

Разберем ситуацию, когда сайт пытается защититься от автоматизированного сбора данных («граблинга»). Современные системы защиты от ботов анализируют поведение и заголовки запросов.

Чтобы минимизировать риск блокировки, проанализируем следующие рекомендации:

Продвинутый парсинг через анализ сетевых запросов (XHR)

Посмотрим на задачу под другим углом. Вместо того чтобы пытаться имитировать клики в браузере и парсить сложный HTML-код, проанализируем вкладку "Network" (Сеть) в инструментах разработчика браузера (F12).

Зачастую выясняется, что при нажатии кнопки «Поиск» сайт отправляет асинхронный JSON-запрос к своему внутреннему API. Если найти этот запрос, можно просто имитировать его из 1С:


Соединение = Новый HTTPСоединение("api.site.com",,,,, 10, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/search?query=артикул");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Читаем JSON напрямую, это в разы быстрее парсинга DOM
    Данные = ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Заключение

Мы рассмотрели различные пути взаимодействия 1С с веб-формами. Для простых задач в «обычных формах» достаточно использования ПолеHTMLДокумента с прямым обращением к DOM через COM-объект IE. Для сложных высоконагруженных задач парсинга лучше использовать связку из WinHttp и прямого анализа API-запросов сайта. При работе с Angular-приложениями всегда отдавайте предпочтение выполнению JavaScript внутри контекста страницы для надежной инициации событий.

← На главную