В процессе разработки на платформе 1С:Предприятие 8.3 (обычные формы) разработчики часто сталкиваются с особенностями работы ПолеHTMLДокумента. Одной из наиболее частых проблем является невозможность взаимодействия с содержимым этого поля (например, с картой), если пользователь не перешел на ту закладку формы, где этот элемент расположен. В этой статье мы разберем причины такого поведения и способы решения поставленной задачи.
Важно уяснить, что ПолеHTMLДокумента не является самостоятельным процессом, работающим в фоновом режиме. Платформа 1С использует механизм «ленивой инициализации». Это означает, что системный компонент (браузер) не создается до тех пор, пока элемент управления не попадет в область отрисовки пользовательского интерфейса.
Когда вы пытаетесь программно обратиться к объекту Документ или запустить JavaScript-функцию сразу после открытия формы (или при переключении страницы), система выдает ошибку, так как объект еще не сформирован. Фактически, DOMReady и другие события инициализации срабатывают только в момент первого отображения элемента.
Наиболее простым и эффективным способом решения данной задачи, который успешно применил автор темы, является использование ПодключитьОбработчикОжидания. Суть метода заключается в том, чтобы после программного переключения на нужную закладку дать платформе небольшое время на отрисовку элемента и выполнение скриптов инициализации.
Разберем реализацию этого метода по шагам:
ПолеHTMLДокумента.Посмотрим на пример кода реализации:
Процедура КнопкаНайтиНаКартеНажатие(Элемент)
// 1. Программно меняем страницу
ЭлементыФормы.ПанельЗакладок.ТекущаяСтраница = ЭлементыФормы.СтраницаКарты;
// 2. Подключаем обработчик ожидания на 2 секунды
ПодключитьОбработчикОжидания("ВыполнитьПоискНаКарте", 2, Истина);
КонецПроцедуры
Процедура ВыполнитьПоискНаКарте()
// К этому моменту карта уже инициализирована
ПолеКарты.Документ.parentWindow.ИнициализироватьПоиск(СтрокаАдреса);
КонецПроцедуры
Хотя обработчик ожидания — это рабочее решение, более профессиональным подходом считается использование событийного цикла 1С. В платформе предусмотрено событие ДокументСформирован для элемента ПолеHTMLДокумента.
Для реализации этого метода можно использовать глобальные флаги в модуле формы:
ФлагПоискаПослеОткрытия = Ложь;.Истина и переключите страницу.ДокументСформирован проверьте значение флага. Если он равен Истина, значит, форма была открыта по сценарию поиска, и можно безопасно вызывать функции JavaScript.Анализируя ситуацию, мы можем прийти к следующим выводам:
ПолеHTMLДокумента, которая подразумевает взаимодействие с DOM, должна быть привязана к моменту завершения отрисовки.HTTPСоединение в серверном коде. Это исключит необходимость в графическом интерфейсе и JavaScript, делая работу программы стабильной независимо от того, какие закладки открыты.ПолеHTMLДокумента корректно настроены под используемый в вашей системе движок (например, Edge WebView2). Это значительно повышает производительность рендеринга по сравнению с устаревшими компонентами Internet Explorer.Таким образом, мы выяснили, что поведение платформы — это не баг, а архитектурная особенность. Используя ПодключитьОбработчикОжидания или событийную модель с флагами, вы сможете добиться корректной работы вашего функционала в любой ситуации.