К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С подключить обработчик ожидания

Как в 1С подключить обработчик ожидания: синтаксис ПодключитьОбработчикОжидания, интервал, однократный вызов, отключение, типичные ошибки и примеры кода.

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

Важно понимать ограничение: обработчик ожидания выполняется в контексте клиента и не заменяет фоновые задания или регламентные задания на сервере. Если задача должна выполняться независимо от того, запущен ли сеанс пользователя, нужен другой механизм. Обработчик ожидания — это именно клиентский таймер, привязанный к времени работы приложения.

Ниже разобраны синтаксис, практические примеры подключения и отключения, выбор интервала, типичные ошибки и способы проверить, что обработчик действительно работает.

Как работает механизм обработчика ожидания

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

Таймер срабатывает, только когда приложение не занято модальными операциями. Если пользователь открыл модальное окно или выполняется длительный серверный вызов, срабатывание откладывается до освобождения потока. Это означает, что обработчик ожидания не подходит для задач, где критична точность до секунды: реальный интервал между вызовами может быть больше заданного.

Синтаксис ПодключитьОбработчикОжидания

Метод имеет три параметра: имя процедуры-обработчика (строка), интервал в секундах (число, допускается дробное от 0.1) и необязательный признак однократного вызова (булево, по умолчанию Ложь). Минимальный интервал — 0.1 секунды, однако на практике интервалы меньше одной секунды создают лишнюю нагрузку и применяются редко.

Пример подключения обработчика, который будет вызывать процедуру ПроверитьНовыеСообщения каждые 60 секунд:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

ПодключитьОбработчикОжидания("ПроверитьНовыеСообщения", 60);

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

&НаКлиенте

Процедура ПроверитьНовыеСообщения() Экспорт

// проверка новых сообщений и обновление формы

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

Обратите внимание на два обязательных условия. Первое: процедура-обработчик должна быть объявлена с директивой &НаКлиенте и ключевым словом Экспорт — иначе платформа не сможет её найти по имени и выдаст ошибку. Второе: процедура не должна иметь параметров, платформа вызывает её без аргументов.

Однократный и многократный вызов

Третий параметр определяет режим работы таймера. Если передать Истина, обработчик сработает один раз через указанный интервал и автоматически отключится. Это удобно для отложенных действий: например, показать уведомление через 2 секунды после открытия формы или запустить обновление данных, когда интерфейс уже отрисован.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

// однократный вызов через 2 секунды после открытия

ПодключитьОбработчикОжидания("ОбновитьДанныеФормы", 2, Истина);

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

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

Отложенный запуск после открытия формы

Частый сценарий — выполнить действие сразу после открытия формы, но не в событии ПриОткрытии, чтобы не задерживать отрисовку интерфейса. Однократный обработчик с интервалом 0.1–1 секунды решает эту задачу: форма открывается мгновенно, а тяжёлая логика запускается следом.

Как отключить обработчик ожидания

Для остановки циклического обработчика используется метод ОтключитьОбработчикОжидания с тем же именем процедуры, что передавалось при подключении. Имя должно совпадать в точности, включая регистр букв в соответствии с объявлением процедуры.

&НаКлиенте

Процедура ПриЗакрытии(ЗавершениеРаботы)

ОтключитьОбработчикОжидания("ПроверитьНовыеСообщения");

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

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

Динамическое управление интервалом делается через пару «отключить — подключить»: сначала отключите обработчик со старым именем, затем подключите заново с новым интервалом. Изменить интервал существующего таймера напрямую нельзя.

Порядок подключения обработчика
  1. 1
    Создайте в модуле формы процедуру с директивой &НаКлиенте и ключевым словом Экспорт, без параметров
  2. 2
    В событии ПриОткрытии вызовите ПодключитьОбработчикОжидания с именем процедуры и интервалом
  3. 3
    При необходимости передайте третьим параметром Истина для однократного вызова
  4. 4
    В событии ПриЗакрытии отключите обработчик вызовом ОтключитьОбработчикОжидания
  5. 5
    Запустите форму и проверьте, что процедура срабатывает с заданной периодичностью

Выбор интервала и влияние на производительность

Интервал выбирается исходя из сути задачи. Для обновления индикаторов на форме достаточно 5–30 секунд, для проверки новых сообщений или состояния обмена — 30–300 секунд. Слишком частый опрос создаёт нагрузку: каждый вызов обработчика, который обращается к серверу, — это отдельный серверный вызов с сетевыми издержками. На медленных каналах и при большом числе пользователей это заметно влияет на отклик системы.

Если внутри обработчика выполняется серверный вызов, делайте его лёгким: один запрос, минимум возвращаемых данных. Не запускайте из обработчика ожидания длительные операции синхронно — интерфейс пользователя будет «подвисать» на время выполнения. Для тяжёлых задач используйте длительные операции (фоновые задания с оповещением о завершении), а обработчик ожидания применяйте только для проверки их статуса.

Чем заменить обработчик ожидания

Обработчик ожидания

Клиентский таймер для периодических действий в открытом сеансе. Не работает при закрытом приложении

Фоновые задания

Выполнение кода на сервере по инициативе сеанса. Подходят для тяжёлых операций, результат возвращается через оповещение

Регламентные задания

Серверное выполнение по расписанию независимо от сеансов. Единственный вариант, если задача должна работать без запущенного клиента

Длительные операции (БСП)

Обёртка над фоновыми заданиями с готовым механизмом ожидания и оповещения формы о результате

Типичные ошибки и их устранение

Самая частая ошибка — «Процедура или функция с указанным именем не определена». Она возникает, когда процедура-обработчик объявлена без Экспорт, размещена в серверном контексте (&НаСервере) или имя в строке подключения не совпадает с именем процедуры. Проверьте все три условия: директива &НаКлиенте, ключевое слово Экспорт, точное имя.

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

Третья типичная ситуация — попытка использовать обработчик ожидания на сервере или в обычном приложении без учёта контекста. Метод доступен в тонком клиенте, веб-клиенте и толстом клиенте управляемого приложения. В серверном коде и внешних соединениях он недоступен — там нужны регламентные задания.

Типичные ошибки
01
Процедура без Экспорт — платформа не находит обработчик и выдаёт ошибку при первом срабатывании
02
Параметры в процедуре-обработчике — вызов падает, так как платформа вызывает её без аргументов
03
Повторное подключение без отключения — несколько таймеров, обработчик срабатывает чаще заданного интервала
04
Тяжёлый серверный вызов внутри обработчика — интерфейс подвисает на каждом срабатывании
05
Отсутствие отключения при закрытии формы — ошибки вызова после выгрузки модуля формы

Как проверить, что обработчик работает

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

Для более точной диагностики используйте замер времени между вызовами: сохраняйте ТекущаяДатаСеанса в переменную модуля и сравнивайте с предыдущим значением. Это поможет увидеть реальный интервал, который из-за занятости потока может отличаться от заданного в большую сторону.

Контрольные точки

Как проверить результат

Срабатывание процедуры
Норма

Обработчик вызывается с заданной периодичностью, ошибок нет

Тревожный признак

Ошибка 'процедура не определена' или полное отсутствие вызовов

Периодичность
Норма

Интервал между вызовами близок к заданному

Тревожный признак

Вызовы идут чаще интервала — признак дублирования таймеров

Отзывчивость интерфейса
Норма

Форма реагирует на действия пользователя без пауз

Тревожный признак

Интерфейс подвисает в моменты срабатывания обработчика

После закрытия формы
Норма

Ошибок в журнале нет, обработчик остановлен

Тревожный признак

Ошибки вызова процедуры после закрытия формы

FAQ

Можно ли передать параметры в процедуру обработчика ожидания?

Нет, платформа вызывает процедуру без параметров. Если нужны данные, сохраните их в реквизитах формы или переменных модуля до подключения обработчика — процедура прочитает их из контекста при срабатывании.

Работает ли обработчик ожидания, если свернуть приложение?

Да, таймер продолжает работать, пока сеанс активен, даже если окно свёрнуто. Но при закрытии приложения или разрыве сеанса все обработчики ожидания прекращают работу.

Что будет, если подключить обработчик с тем же именем дважды?

Платформа допускает повторное подключение, и фактически обработчик может начать срабатывать чаще заданного интервала. Перед повторным подключением вызывайте ОтключитьОбработчикОжидания с тем же именем — это гарантирует один активный таймер.

Можно ли использовать обработчик ожидания в общем модуле?

Да, если общий модуль клиентский (в свойствах установлен признак «Клиент (управляемое приложение)») и процедура объявлена экспортной. В строке подключения укажите полное имя: ИмяМодуля.ИмяПроцедуры.

Чем заменить обработчик ожидания, если задача должна работать без открытого сеанса?

Используйте регламентные задания — они выполняются на сервере по расписанию независимо от сеансов пользователей. Обработчик ожидания для таких сценариев не подходит в принципе.

Какой минимальный интервал допустим?

Синтаксически допускаются значения от 0.1 секунды, но на практике интервалы меньше секунды редко оправданы: реальная периодичность зависит от занятости основного потока, а частые срабатывания создают лишнюю нагрузку.

Итог

Что важно запомнить

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