При работе с элементом формы Поле HTML документа программисты часто сталкиваются с ситуацией, когда необходимо выполнить программный код только после того, как страница или её часть полностью отобразились. Вторая часть задачи — управление асинхронными вызовами, такими как обработчики ожидания, которые не позволяют просто «остановить» выполнение кода до завершения процесса. Рассмотрим подробно, как правильно организовать проверку загрузки и работу с асинхронностью.
Самый простой и стандартный способ — использование встроенных механизмов платформы 1С. У элемента формы Поле HTML документа существует событие ДокументСформирован. Оно генерируется, когда основной каркас документа загружен. Однако, чтобы убедиться в полной готовности DOM-дерева, рекомендуется проверять свойство readyState.
Проанализируем пример кода, который позволяет убедиться, что документ готов к работе:
&НаКлиенте
Процедура ПолеHTMLДокументаДокументСформирован(Элемент)
// Проверяем наличие объекта Документ и его состояние
Если (Элемент.Документ <> Неопределено) И (Элемент.Документ.readyState = "complete") Тогда
// Документ прогружен полностью
Сообщить("Страница успешно загружена!");
// Здесь можно выполнять дальнейшие действия с DOM
Иначе
// Состояние может быть "loading" или "interactive"
// В некоторых случаях требуется дополнительное ожидание
КонецЕсли;
КонецПроцедуры
Важно понимать, что значение complete означает завершение загрузки всех ресурсов страницы, включая изображения и стили. Если ваша задача — начать работу сразу после появления текста, можно проверять состояние interactive.
Часто современные веб-страницы подгружают данные частями через AJAX уже после того, как readyState перешел в состояние complete. В этом случае стандартное событие платформы не поможет. Выясним, как поступить в такой ситуации.
Одним из эффективных решений является использование JavaScript-объекта MutationObserver. Мы можем внедрить скрипт в страницу, который будет следить за появлением конкретного элемента (например, таблицы с данными или определенного div). Как только элемент появится, скрипт может вызвать внешнее событие 1С.
Разберем логику взаимодействия:
ВыполнитьСкрипт().window.external.OnClickEvent() (или аналогичный метод в зависимости от движка), что перехватывается в 1С.Иногда возникает вопрос: можно ли «дождаться» завершения работы метода ПодключитьОбработчикОжидания в цикле? Рассмотрим, почему стандартный подход «ожидания в цикле» здесь не работает.
Метод ПодключитьОбработчикОжидания является асинхронным по своей природе. Он не прерывает выполнение текущего потока кода, а лишь ставит задачу в очередь исполнения. Попытка сделать пустой цикл ожидания приведет к «зависанию» интерфейса 1С, так как поток будет занят циклом и не сможет переключиться на выполнение самого обработчика.
Если вам нужно выполнить действие после выполнения асинхронной процедуры, используйте «цепочку вызовов». Проанализируем правильную структуру:
&НаКлиенте
Процедура НачатьПроцесс()
// Вместо ожидания здесь, мы просто запускаем обработчик
ПодключитьОбработчикОжидания("ЗавершитьПроцесс", 1, Истина);
// На этом выполнение текущей процедуры заканчивается, 1С свободна
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьПроцесс()
// Этот код выполнится через 1 секунду
// Здесь мы пишем логику, которая должна идти "после" ожидания
ПродолжитьВыполнениеЗадач();
КонецПроцедуры
Если же необходимо ожидать выполнения фонового задания на сервере, следует использовать методы БСП, такие как ДлительныеОперации.ОжидатьЗавершение(), но помните, что это применимо только к серверным вызовам, а не к манипуляциям с формой.
Если вам нужно дождаться появления элемента на странице, не блокируя интерфейс, можно реализовать систему рекурсивного опроса. Это гораздо профессиональнее и стабильнее, чем использование Предупреждение("...", 2).
Рассмотрим, как это работает по шагам:
Поле HTML документа.Пример реализации такого механизма:
&НаКлиенте
Процедура ПроверитьЗагрузкуЭлемента() Экспорт
Документ = Элементы.ПолеHTML.Документ;
Если Документ <> Неопределено Тогда
ЦелевойЭлемент = Документ.getElementById("my-data-id");
Если ЦелевойЭлемент <> Неопределено Тогда
ОтключитьОбработчикОжидания("ПроверитьЗагрузкуЭлемента");
ОбработатьДанные(ЦелевойЭлемент);
Возврат;
КонецЕсли;
КонецЕсли;
// Если не нашли, обработчик сработает повторно сам,
// если при подключении 'Истина' не была указана.
КонецПроцедуры
Важно учитывать, какой режим отображения HTML используется в вашей версии платформы 1С. В старых конфигурациях и при определенных настройках используется движок Internet Explorer. В современных версиях (начиная с 8.3.14) доступен режим использования WebKit или Chromium.
Для режима Internet Explorer: наиболее стабильным является событие DocumentComplete. Доступ к объектам осуществляется через COM-модель.
Для режима Chromium: работа с DOM более стандартизирована, но прямое обращение к объектам документа из 1С может быть ограничено в целях безопасности. В этом случае основным инструментом становится метод ВыполнитьСкрипт(), который возвращает результат выполнения JS-кода обратно в 1С. Это позволяет безопасно проверять наличие элементов или готовность страницы.
Подведем итог: для проверки загрузки страницы всегда начинайте с события ДокументСформирован и проверки readyState. Если страница динамическая — используйте рекурсивный обработчик ожидания или MutationObserver на стороне JavaScript. Избегайте блокирующих циклов, разделяя логику на цепочки процедур, вызываемых последовательно.