Как программно заполнить поля на сайте в ActiveX Microsoft Web Browser из 1С?

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

При автоматизации взаимодействия с веб-сайтами через компонент ActiveX Microsoft Web Browser (часто используемый в обычных формах 1С) разработчики нередко сталкиваются с трудностями при передаче данных в поля ввода. Стандартные методы, которые отлично работают в ПолеHTMLДокумента, здесь могут вызывать ошибки или вовсе не находить необходимые свойства объектов.

Разбор причин возникновения ошибок

Основная сложность заключается в особенностях работы OLE-автоматизации и модели объектов документа DOM в старом движке MSHTML. Когда мы пытаемся обратиться к элементу через GetElementByID, платформа 1С не всегда корректно определяет тип объекта. В результате обращение к свойству .value или использование SetAttribute может приводить к ошибке «Метод не найден» или «Поле не обнаружено».

Для успешного решения задачи нам необходимо правильно взаимодействовать с коллекцией элементов страницы, принудительно проходя по ним и идентифицируя нужный объект через его атрибуты.

Решение проблемы через перебор элементов коллекции

Рассмотрим самый надежный способ работы с элементами ввода. Вместо прямого обращения по идентификатору, мы получим список всех элементов INPUT на странице и выберем нужный нам по значению атрибута name или id. Это позволяет «обмануть» ограничения типизации, так как в процессе перебора 1С точнее определяет доступные свойства объекта.

Разберем этот процесс по шагам:

  1. Получаем объект Document из нашего элемента WebBrowser.
  2. Используем метод GetElementsByTagName("INPUT") для получения коллекции всех полей ввода.
  3. Организуем цикл для перебора всех найденных элементов.
  4. Внутри цикла проверяем атрибут name или id.
  5. При совпадении присваиваем значение свойству Value.

Посмотрим, как это выглядит в коде:


// Получаем доступ к документу
Документ = ЭлементыФормы.WebBrowser.Document;

// Получаем коллекцию всех полей ввода
ЭлементыВвода = Документ.GetElementsByTagName("INPUT");

// Перебираем элементы в цикле
Для Каждого Элемент Из ЭлементыВвода Цикл
    // Сравниваем атрибут name с искомым значением
    Если Элемент.name = "SearchString" Тогда
        // Устанавливаем нужное значение
        Элемент.Value = "мой текст для поиска";
        Прервать; // Выходим из цикла после успешного заполнения
    КонецЕсли;
КонецЦикла;

Дополнительные методы управления элементами

Если простая установка значения не приводит к результату (например, на сайте используется сложная логика JavaScript или современные фреймворки вроде React или Vue), нам могут потребоваться дополнительные инструменты.

Использование setAttribute:

В некоторых случаях, когда свойство Value недоступно напрямую, можно попробовать использовать метод setAttribute. Важно помнить, что применять его нужно не ко всему документу, а непосредственно к найденному объекту элемента:


// Предположим, мы уже нашли объект Элемент
Элемент.setAttribute("value", "ваш текст");

Эмуляция событий:

Многие современные сайты следят за изменениями полей через события. Если после программной вставки текста сайт «не видит» изменений (например, кнопка «Найти» остается неактивной), необходимо принудительно вызвать событие изменения:


Элемент.FireEvent("onchange");
Элемент.FireEvent("oninput");

Применение метода FireEvent позволяет «сообщить» скриптам сайта о том, что в поле были внесены изменения программным путем, что зачастую снимает блокировку с кнопок отправки формы или активации поиска.

Важные рекомендации при работе с ActiveX

При разработке решений на базе Microsoft Web Browser всегда учитывайте следующие моменты:

Работая вместе над автоматизацией, вы сможете преодолеть любые сложности взаимодействия с DOM-структурой веб-страниц, используя правильную последовательность действий и методы доступа к элементам.

← На главную