При автоматизации взаимодействия 1С с веб-сайтами через встроенный элемент Поле HTML-документа (особенно в обычных формах, использующих движок Internet Explorer), разработчики часто сталкиваются с ситуацией, когда стандартные методы перестают работать. Сценарий обычно выглядит так: мы находим элемент input, присваиваем ему значение через свойство value, и программно нажимаем кнопку отправки. Визуально поле заполнено, но сайт выдает ошибку, утверждая, что данные не введены.
В этой статье мы разберем, почему это происходит с современными сайтами, проанализируем внутренние механизмы работы веб-форм и найдем способ «заставить» сайт принять наши данные.
Разберем ситуацию: современные сайты (как в примере с ресурсами компании Daimler/Mercedes-Benz) строятся с использованием мощных JavaScript-фреймворков, таких как Angular, React или Vue.js. В этих системах работа с формами реализована не через прямое чтение значений из DOM-дерева в момент нажатия кнопки, а через так называемые реактивные формы или двустороннее связывание данных.
Когда вы программно выполняете в 1С код типа:
ЭлементИнпут = ЭлементФормы.ПолеHTMLДокумента.Документ.getElementById("email");
ЭлементИнпут.value = "my-login@mail.com";
Вы изменяете состояние объекта в объектной модели документа (DOM), но внутренние скрипты сайта (контроллеры фреймворка) об этом не узнают. Они ожидают стандартную последовательность событий браузера, таких как focus, keydown, input и blur. Если эти события не произошли, состояние модели данных внутри сайта остается «пустым» (pristine и invalid), даже если визуально в поле видны символы. Именно поэтому ручной ввод или вставка через Ctrl+V работают — браузер при этих действиях автоматически генерирует всю цепочку необходимых событий.
Посмотрим на типичный пример элемента, с которым возникают проблемы:
<input name="email" formcontrolname="email" class="loginform__input-field ng-tns-c148-10 ng-dirty ng-touched ng-valid" placeholder="Адрес электронной почты">
Атрибуты formcontrolname и префиксы классов ng- однозначно указывают на использование фреймворка Angular. Для таких элементов простого присваивания значения недостаточно — нам нужно программно имитировать действия пользователя.
Наиболее правильный и надежный способ — это не просто изменить значение, но и вызвать событие input, которое «разбудит» скрипты сайта. Поскольку 1С работает через COM-объект Internet Explorer, мы можем выполнить произвольный JavaScript-код в контексте загруженной страницы.
Рассмотрим по шагам, как это реализовать. Сначала мы присваиваем значение, а затем вызываем специальную функцию для создания события:
// Получаем объект документа
ДокументHTML = ЭлементФормы.ПолеHTMLДокумента.Документ;
Окно = ДокументHTML.parentWindow;
// Находим наше поле
ПолеВвода = ДокументHTML.getElementById("email");
Если ПолеВвода <> Неопределено Тогда
// 1. Устанавливаем фокус на элемент
ПолеВвода.focus();
// 2. Устанавливаем значение
ПолеВвода.value = "my-login@mail.com";
// 3. Создаем и запускаем событие 'input'
// В современных версиях IE (9+) используется такой подход:
Попытка
Скрипт = "
|var ev = document.createEvent('Event');
|ev.initEvent('input', true, true);
|arguments[0].dispatchEvent(ev);
|
|var evChange = document.createEvent('Event');
|evChange.initEvent('change', true, true);
|arguments[0].dispatchEvent(evChange);
|";
// Выполняем скрипт через метод execScript или аналоги
Окно.eval(Скрипт); // В контексте 1С часто используется Окно.eval или вызов через ScriptControl
Исключение
Сообщить("Не удалось инициировать события");
КонецПопытки;
// 4. Убираем фокус (blur), чтобы сработала финальная валидация
ПолеВвода.blur();
КонецЕсли;
Проанализируем этот код: мы принудительно создаем события input и change. Событие input является критически важным для Angular, так как именно на него подписаны слушатели, обновляющие внутреннюю переменную модели данных.
Если манипуляции с dispatchEvent кажутся слишком сложными или сайт использует специфические проверки (например, проверяет свойство isTrusted у события), можно воспользоваться методом, который максимально приближен к действиям пользователя — вставкой из буфера обмена.
Разберем этот алгоритм:
HTMLFile или методы платформы 1С).ПолеВвода.focus().Ctrl+V.Для эмуляции нажатия клавиш в среде Windows при работе с 1С часто используется объект WScript.Shell:
// Устанавливаем фокус на поле
ПолеВвода = ЭлементФормы.ПолеHTMLДокумента.Документ.getElementById("email");
ПолеВвода.focus();
// Небольшая пауза для обработки фокуса браузером
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.SendKeys("^v"); // Посылаем Ctrl+V
WshShell.SendKeys("{ENTER}"); // Посылаем Enter для отправки формы
Важно: Метод SendKeys работает с активным окном. Перед его вызовом необходимо убедиться, что окно 1С и конкретно элемент управления ПолеHTMLДокумента находятся в фокусе системы.
Иногда сайты используют файлы типа polyfills-es2015.js. Это означает, что они адаптируют современные возможности JavaScript под старые браузеры (такие как IE11). В этом случае логика обработки событий может быть еще более запутанной. Если вышеуказанные способы не помогают, проанализируем вкладку Event Listeners в консоли разработчика браузера (Chrome или Edge). Там можно увидеть, на какие именно события подписан input: это могут быть keyup, keydown или даже специфические pointerevents.
Выясним причину неудачи, если данные все равно не принимаются:
Во-первых, проверьте, не очищается ли поле сразу после программного ввода. Если да — значит, скрипт очистки срабатывает на событие focus. В таком случае сначала вызывайте focus(), а потом присваивайте значение.
Во-вторых, обратите внимание на атрибут formcontrolname. Если вы автоматизируете вход на серьезные корпоративные порталы, попробуйте имитировать ввод каждого символа отдельно, вызывая событие keydown для каждого знака.
Для успешного заполнения полей на современных сайтах из 1С необходимо соблюдать следующую последовательность действий:
focus().value обязательно генерировать события input и change через запуск JavaScript-кода.blur() для инициации проверок на стороне сайта.WScript.Shell и буфер обмена.Применяя эти подходы, мы сможем обойти ограничения, накладываемые современными фронтенд-фреймворками, и восстановить работоспособность наших обработок автоматизации.