Как проверить, загрузилась ли страница в поле HTML документа, и правильно работать с асинхронными процессами в 1С?

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

При работе с элементом формы Поле HTML документа программисты часто сталкиваются с ситуацией, когда необходимо выполнить программный код только после того, как страница или её часть полностью отобразились. Вторая часть задачи — управление асинхронными вызовами, такими как обработчики ожидания, которые не позволяют просто «остановить» выполнение кода до завершения процесса. Рассмотрим подробно, как правильно организовать проверку загрузки и работу с асинхронностью.

Метод 1. Использование события «ДокументСформирован» и проверку readyState

Самый простой и стандартный способ — использование встроенных механизмов платформы 1С. У элемента формы Поле HTML документа существует событие ДокументСформирован. Оно генерируется, когда основной каркас документа загружен. Однако, чтобы убедиться в полной готовности DOM-дерева, рекомендуется проверять свойство readyState.

Проанализируем пример кода, который позволяет убедиться, что документ готов к работе:


&НаКлиенте
Процедура ПолеHTMLДокументаДокументСформирован(Элемент)
    
    // Проверяем наличие объекта Документ и его состояние
    Если (Элемент.Документ <> Неопределено) И (Элемент.Документ.readyState = "complete") Тогда
        // Документ прогружен полностью
        Сообщить("Страница успешно загружена!");
        // Здесь можно выполнять дальнейшие действия с DOM
    Иначе
        // Состояние может быть "loading" или "interactive"
        // В некоторых случаях требуется дополнительное ожидание
    КонецЕсли;

КонецПроцедуры

Важно понимать, что значение complete означает завершение загрузки всех ресурсов страницы, включая изображения и стили. Если ваша задача — начать работу сразу после появления текста, можно проверять состояние interactive.

Метод 2. Отслеживание динамического контента (AJAX)

Часто современные веб-страницы подгружают данные частями через AJAX уже после того, как readyState перешел в состояние complete. В этом случае стандартное событие платформы не поможет. Выясним, как поступить в такой ситуации.

Одним из эффективных решений является использование JavaScript-объекта MutationObserver. Мы можем внедрить скрипт в страницу, который будет следить за появлением конкретного элемента (например, таблицы с данными или определенного div). Как только элемент появится, скрипт может вызвать внешнее событие 1С.

Разберем логику взаимодействия:

  1. Внедряем JS-код через метод ВыполнитьСкрипт().
  2. Скрипт находит нужный узел в DOM и подписывается на изменения.
  3. При обнаружении изменений скрипт вызывает window.external.OnClickEvent() (или аналогичный метод в зависимости от движка), что перехватывается в 1С.

Метод 3. Работа с асинхронностью и ПодключитьОбработчикОжидания

Иногда возникает вопрос: можно ли «дождаться» завершения работы метода ПодключитьОбработчикОжидания в цикле? Рассмотрим, почему стандартный подход «ожидания в цикле» здесь не работает.

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

Если вам нужно выполнить действие после выполнения асинхронной процедуры, используйте «цепочку вызовов». Проанализируем правильную структуру:


&НаКлиенте
Процедура НачатьПроцесс()
    // Вместо ожидания здесь, мы просто запускаем обработчик
    ПодключитьОбработчикОжидания("ЗавершитьПроцесс", 1, Истина);
    // На этом выполнение текущей процедуры заканчивается, 1С свободна
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьПроцесс()
    // Этот код выполнится через 1 секунду
    // Здесь мы пишем логику, которая должна идти "после" ожидания
    ПродолжитьВыполнениеЗадач();
КонецПроцедуры

Если же необходимо ожидать выполнения фонового задания на сервере, следует использовать методы БСП, такие как ДлительныеОперации.ОжидатьЗавершение(), но помните, что это применимо только к серверным вызовам, а не к манипуляциям с формой.

Метод 4. Рекурсивный опрос состояния (Safe Waiting)

Если вам нужно дождаться появления элемента на странице, не блокируя интерфейс, можно реализовать систему рекурсивного опроса. Это гораздо профессиональнее и стабильнее, чем использование Предупреждение("...", 2).

Рассмотрим, как это работает по шагам:

  1. Запускаем обработчик ожидания с коротким интервалом (например, 0.2 сек).
  2. В процедуре обработчика проверяем: загрузился ли нужный элемент в Поле HTML документа.
  3. Если элемент найден — отключаем обработчик и вызываем основную логику.
  4. Если элемент не найден — ничего не делаем, обработчик сработает снова через 0.2 сек.

Пример реализации такого механизма:


&НаКлиенте
Процедура ПроверитьЗагрузкуЭлемента() Экспорт
    Документ = Элементы.ПолеHTML.Документ;
    Если Документ <> Неопределено Тогда
        ЦелевойЭлемент = Документ.getElementById("my-data-id");
        Если ЦелевойЭлемент <> Неопределено Тогда
            ОтключитьОбработчикОжидания("ПроверитьЗагрузкуЭлемента");
            ОбработатьДанные(ЦелевойЭлемент);
            Возврат;
        КонецЕсли;
    КонецЕсли;
    // Если не нашли, обработчик сработает повторно сам, 
    // если при подключении 'Истина' не была указана.
КонецПроцедуры

Нюансы используемых движков (WebKit/Chromium vs IE)

Важно учитывать, какой режим отображения HTML используется в вашей версии платформы 1С. В старых конфигурациях и при определенных настройках используется движок Internet Explorer. В современных версиях (начиная с 8.3.14) доступен режим использования WebKit или Chromium.

Для режима Internet Explorer: наиболее стабильным является событие DocumentComplete. Доступ к объектам осуществляется через COM-модель.

Для режима Chromium: работа с DOM более стандартизирована, но прямое обращение к объектам документа из 1С может быть ограничено в целях безопасности. В этом случае основным инструментом становится метод ВыполнитьСкрипт(), который возвращает результат выполнения JS-кода обратно в 1С. Это позволяет безопасно проверять наличие элементов или готовность страницы.

Подведем итог: для проверки загрузки страницы всегда начинайте с события ДокументСформирован и проверки readyState. Если страница динамическая — используйте рекурсивный обработчик ожидания или MutationObserver на стороне JavaScript. Избегайте блокирующих циклов, разделяя логику на цепочки процедур, вызываемых последовательно.

← На главную