В практике разработчика 1С часто возникают задачи по интеграции с внешними ресурсами, у которых отсутствует открытый API. Это может быть сайт поставщика, государственный портал или корпоративный ресурс. Рассмотрим, как программно реализовать авторизацию, заполнение форм поиска и «граббинг» (парсинг) данных, используя встроенные инструменты 1С и современные подходы к веб-технологиям.
Проанализируем ситуацию, когда нам необходимо взаимодействовать с сайтом, написанным на ASP.NET или использующим современные фреймворки типа Angular. Основная сложность заключается в том, что обычного HTTPСоединение часто бывает недостаточно, так как сайт требует исполнения JavaScript на стороне клиента.
Разберем два основных пути решения задачи:
Выясним причину, по которой автор темы остановился на «Поле HTML-документа». В обычных формах 1С этот элемент управления базируется на движке Internet Explorer, что позволяет имитировать действия реального пользователя, нажимая на кнопки и заполняя поля ввода.
Рассмотрим конкретную проблему: как кликнуть на кнопку, если она описана через директивы 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 Web Forms. Такие ресурсы часто защищены механизмом ViewState. Это скрытые поля формы (__VIEWSTATE, __EVENTVALIDATION), в которых сервер хранит состояние страницы.
Если вы решили отказаться от визуального «Поля HTML-документа» в пользу HTTPСоединение, вам придется:
__VIEWSTATE.Важный момент: Использование WinHttp.WinHttpRequest.5.1 через COM-объект в 1С зачастую удобнее встроенного HTTPСоединение, так как он лучше справляется с автоматической обработкой редиректов и хранением куки-файлов (Cookies) в рамках сессии.
Разберем ситуацию, когда сайт пытается защититься от автоматизированного сбора данных («граблинга»). Современные системы защиты от ботов анализируют поведение и заголовки запросов.
Чтобы минимизировать риск блокировки, проанализируем следующие рекомендации:
User-Agent, соответствующий современному браузеру. Стандартный заголовок 1С выдает бота мгновенно.Посмотрим на задачу под другим углом. Вместо того чтобы пытаться имитировать клики в браузере и парсить сложный 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 внутри контекста страницы для надежной инициации событий.