При автоматизации взаимодействия с веб-сайтами через компонент ActiveX Microsoft Web Browser (часто используемый в обычных формах 1С) разработчики нередко сталкиваются с трудностями при передаче данных в поля ввода. Стандартные методы, которые отлично работают в ПолеHTMLДокумента, здесь могут вызывать ошибки или вовсе не находить необходимые свойства объектов.
Основная сложность заключается в особенностях работы OLE-автоматизации и модели объектов документа DOM в старом движке MSHTML. Когда мы пытаемся обратиться к элементу через GetElementByID, платформа 1С не всегда корректно определяет тип объекта. В результате обращение к свойству .value или использование SetAttribute может приводить к ошибке «Метод не найден» или «Поле не обнаружено».
Для успешного решения задачи нам необходимо правильно взаимодействовать с коллекцией элементов страницы, принудительно проходя по ним и идентифицируя нужный объект через его атрибуты.
Рассмотрим самый надежный способ работы с элементами ввода. Вместо прямого обращения по идентификатору, мы получим список всех элементов INPUT на странице и выберем нужный нам по значению атрибута name или id. Это позволяет «обмануть» ограничения типизации, так как в процессе перебора 1С точнее определяет доступные свойства объекта.
Разберем этот процесс по шагам:
Document из нашего элемента WebBrowser.GetElementsByTagName("INPUT") для получения коллекции всех полей ввода.name или id.Value.Посмотрим, как это выглядит в коде:
// Получаем доступ к документу
Документ = ЭлементыФормы.WebBrowser.Document;
// Получаем коллекцию всех полей ввода
ЭлементыВвода = Документ.GetElementsByTagName("INPUT");
// Перебираем элементы в цикле
Для Каждого Элемент Из ЭлементыВвода Цикл
// Сравниваем атрибут name с искомым значением
Если Элемент.name = "SearchString" Тогда
// Устанавливаем нужное значение
Элемент.Value = "мой текст для поиска";
Прервать; // Выходим из цикла после успешного заполнения
КонецЕсли;
КонецЦикла;
Если простая установка значения не приводит к результату (например, на сайте используется сложная логика JavaScript или современные фреймворки вроде React или Vue), нам могут потребоваться дополнительные инструменты.
Использование setAttribute:
В некоторых случаях, когда свойство Value недоступно напрямую, можно попробовать использовать метод setAttribute. Важно помнить, что применять его нужно не ко всему документу, а непосредственно к найденному объекту элемента:
// Предположим, мы уже нашли объект Элемент
Элемент.setAttribute("value", "ваш текст");
Эмуляция событий:
Многие современные сайты следят за изменениями полей через события. Если после программной вставки текста сайт «не видит» изменений (например, кнопка «Найти» остается неактивной), необходимо принудительно вызвать событие изменения:
Элемент.FireEvent("onchange");
Элемент.FireEvent("oninput");
Применение метода FireEvent позволяет «сообщить» скриптам сайта о том, что в поле были внесены изменения программным путем, что зачастую снимает блокировку с кнопок отправки формы или активации поиска.
При разработке решений на базе Microsoft Web Browser всегда учитывайте следующие моменты:
Internet Explorer. Если целевой сайт требует современные стандарты HTML5 или использует последние версии библиотек, он может отображаться некорректно.GetElementsByTagName — это самый проверенный способ «достучаться» до объекта в 1С.ActiveX становятся слишком сложными в поддержке, рассмотрите возможность использования внешних библиотек автоматизации или WebDriver, если архитектура вашего решения это позволяет.Работая вместе над автоматизацией, вы сможете преодолеть любые сложности взаимодействия с DOM-структурой веб-страниц, используя правильную последовательность действий и методы доступа к элементам.