При автоматизации взаимодействия 1С с внешними сайтами через ПолеHTMLДокумента программисты часто сталкиваются с проблемой: данные, введенные программно в поля логина или пароля, мгновенно сбрасываются. Особенно часто это происходит на современных ресурсах, таких как СберБизнес, использующих библиотеку React. В этой статье мы подробно разберем, почему обычное присвоение значения не работает, и рассмотрим надежные способы программной имитации ввода данных и нажатия клавиш.
Проанализируем ситуацию. Современные веб-приложения строятся на базе Virtual DOM. Когда мы пишем в коде 1С Элемент.value = "Логин", мы меняем состояние реального DOM-дерева в браузере. Однако React «не знает» об этом изменении, так как его внутреннее состояние (state) остается прежним. Как только происходит любое событие (например, клик по кнопке «Войти»), React синхронизирует реальный DOM со своим внутренним состоянием, видит там пустоту и затирает наш введенный текст.
Кроме того, банковские системы часто используют обработчики событий типа __reactEventHandlers, которые ожидают именно физического нажатия клавиш или инициирования цепочки событий ввода. Разберем по шагам, как это обойти.
Если сайт просто ожидает уведомления об изменении поля, мы можем программно создать и отправить событие input. Рассмотрим пример кода на стороне 1С, который находит элемент по идентификатору, устанавливает значение и уведомляет систему об изменениях:
&НаКлиенте
Процедура ЗаполнитьПолеНаСайте(ИмяЭлемента, Значение)
// Получаем документ из ПоляHTMLДокумента
Документ = Элементы.АдресHTML.Документ;
ЭлементHTML = Документ.getElementById(ИмяЭлемента);
Если ЭлементHTML <> Неопределено Тогда
// Устанавливаем значение
ЭлементHTML.value = Значение;
// Создаем событие "input", которое "услышит" React/Vue
evt = Документ.createEvent("HTMLEvents");
evt.initEvent("input", true, true);
// Отправляем событие элементу
ЭлементHTML.dispatchEvent(evt);
КонецЕсли;
КонецПроцедуры
Важный нюанс: В некоторых случаях требуется передать не HTMLEvents, а KeyboardEvent, чтобы имитировать нажатие конкретной клавиши, например, Enter. Однако в старых движках (Internet Explorer), которые использует 1С, метод initKeyboardEvent может работать нестабильно и приводить к аварийному завершению работы платформы.
Рассмотрим более продвинутый метод. Чтобы React «поверил» в ввод данных, нам нужно вызвать нативный сеттер значения. Мы можем выполнить произвольный JavaScript-код прямо в контексте страницы. Проанализируем следующий алгоритм:
Для реализации этого в 1С используем метод ExecuteJavaScript() (доступен в новых версиях платформы) или обращение к parentWindow:
Скрипт = "
|var input = document.getElementById('login_field');
|var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
|nativeInputValueSetter.call(input, '" + Логин + "');
|
|var ev = new Event('input', { bubbles: true });
|input.dispatchEvent(ev);
|";
Элементы.ПолеHTML.Документ.parentWindow.eval(Скрипт);
Этот метод считается наиболее надежным для работы с полями в защищенных веб-интерфейсах, так как он имитирует низкоуровневое изменение данных.
Если программная отправка событий в DOM не помогает, мы можем воспользоваться средствами операционной системы. Объект WScript.Shell позволяет отправить нажатия клавиш в активное окно. Посмотрим на пример:
Шелл = Новый COMОбъект("WScript.Shell");
// Сначала нужно установить фокус на нужный элемент через JS
Элементы.ПолеHTML.Документ.getElementById("password").focus();
// Пауза, чтобы браузер успел обработать фокус
// Затем отправляем символы
Шелл.SendKeys("МойПароль123");
Шелл.SendKeys("{ENTER}");
Преимущества и недостатки этого метода:
Посмотрим на технические особенности платформы 1С. Работа ПолеHTMLДокумента зависит от того, какой движок используется:
document.createEvent("HTMLEvents").new Event, const, let), и эмуляция событий работает гораздо стабильнее.Совет: Если ваша задача — массовая загрузка выписок из банк-клиентов (как в случае со СберБизнесом), и встроенное поле 1С не справляется с защитой сайта, рассмотрите использование внешних инструментов автоматизации, таких как Selenium или Playwright. Они позволяют запускать полноценный браузер в невидимом режиме и полностью имитировать действия пользователя, включая движения мыши и задержки между нажатиями клавиш, что помогает обходить антифрод-системы.
Подводя итог, для успешного программного нажатия клавиш в 1С сначала попробуйте метод с dispatchEvent и событием input. Если это не помогает — используйте JavaScript-инъекцию для изменения состояния через прототипы элементов. Это позволит вам автоматизировать даже самые сложные веб-интерфейсы, не выходя за рамки платформы.