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

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

Обработчик ожидания в 1С: что это и как его использовать

Что такое обработчик ожидания в 1С, как работают ПодключитьОбработчикОжидания и ОтключитьОбработчикОжидания, типовые сценарии, ошибки и ограничения.

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

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

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

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

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

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

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

bsl
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Однократный вызов через 2 секунды
    ПодключитьОбработчикОжидания("ПослеОткрытияФормы", 2, Истина);
    // Циклический опрос каждые 5 секунд
    ПодключитьОбработчикОжидания("ПроверитьСтатусЗадания", 5);
КонецПроцедуры

&НаКлиенте
Процедура ПослеОткрытияФормы() Экспорт
    ОбновитьДанныеФормы();
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСтатусЗадания() Экспорт
    Если ЗаданиеЗавершено() Тогда
        ОтключитьОбработчикОжидания("ПроверитьСтатусЗадания");
    КонецЕсли;
КонецПроцедуры

Однократный и циклический вызов: что выбрать

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

Циклический режим нужен для мониторинга: опроса фонового задания, обновления показателей, проверки новых сообщений. Здесь ключевая обязанность разработчика — гарантированно отключить обработчик при достижении результата и при закрытии формы. «Забытый» циклический обработчик продолжает выполняться, пока открыта форма, и расходует ресурсы клиента и сервера.

Сравнение режимов

Однократный (Истина)

Отложенный запуск одного действия. Отключается сам, риск утечки минимален. Не подходит для мониторинга.

Циклический (Ложь или опущен)

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

Типовые сценарии применения

Опрос фонового задания

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

Задержка при вводе в строку поиска

Чтобы не отправлять запрос на сервер при каждом нажатии клавиши, в обработчике изменения поля подключают однократный обработчик ожидания на 0,5–1 секунду. Если пользователь продолжает печатать, обработчик переподключается, и поиск выполняется только после паузы во вводе. Это заметно снижает число серверных вызовов.

Автообновление данных

Рабочие места диспетчеров и мониторы очередей обновляют данные циклическим обработчиком с интервалом от десятков секунд до минут. Здесь важно предусмотреть отключение при неактивности и не выполнять тяжёлые запросы слишком часто — иначе пострадают все пользователи базы.

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

Как правильно отключать обработчик

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

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

Порядок действий при внедрении
  1. 1
    Определите задачу: однократная задержка или циклический опрос
  2. 2
    Создайте экспортную клиентскую процедуру-обработчик
  3. 3
    Подключите обработчик с осмысленным интервалом (обычно от 0,5 до 60 секунд)
  4. 4
    Внутри обработчика предусмотрите условие отключения при достижении результата
  5. 5
    Добавьте отключение в обработчик закрытия формы
  6. 6
    Проверьте поведение при повторном открытии формы и при ошибках сервера

Ограничения и подводные камни

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

Точность срабатывания не гарантирована: если клиент занят выполнением другого кода, вызов откладывается. Поэтому обработчик ожидания нельзя использовать для задач, где критична точная периодичность. Кроме того, код обработчика выполняется в основном потоке клиента — длительная операция внутри него «подвесит» интерфейс пользователя.

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

Типичные ошибки
01
Не отключён циклический обработчик — процедура выполняется бесконечно и грузит клиента и сервер
02
Опечатка в имени процедуры — ошибка проявляется только в момент вызова, а не при проверке модуля
03
Длительная операция внутри обработчика — интерфейс пользователя зависает на время выполнения
04
Слишком маленький интервал (0,1 с) с серверными вызовами — лавина обращений к серверу без выигрыша в скорости
05
Ожидание точного таймера — обработчик срабатывает с задержкой, когда клиент занят

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

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

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

Маршрут решения

Как выбрать действие

Нужно выполнить действие один раз после открытия формыПодключите однократный обработчик ожидания с интервалом 0,1–2 секунды
Нужно отслеживать завершение фонового заданияИспользуйте ДлительныеОперации (БСП) или циклический обработчик с интервалом 1–5 секунд
Нужна периодическая задача на сервере без участия пользователяСоздайте регламентное задание — обработчик ожидания здесь не работает
Нужно реагировать на действия других пользователейРассмотрите систему взаимодействия или оповещения вместо частого опроса
Контрольные точки

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

Срабатывание обработчика
Норма

Процедура вызывается через заданный интервал, виден результат её работы

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

Процедура не вызывается — проверьте имя строкой и контекст подключения

Отключение циклического обработчика
Норма

После достижения результата вызовы прекращаются

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

Вызовы продолжаются — условие отключения не срабатывает

Нагрузка на сервер
Норма

Серверные вызовы редкие и лёгкие

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

Заметны паузы в интерфейсе и рост нагрузки на сервер

Частые вопросы

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

Нет. Методы ПодключитьОбработчикОжидания и ОтключитьОбработчикОжидания доступны только в клиентском контексте. Для серверных периодических задач используются регламентные задания.

Какой минимальный интервал можно задать?

Формально — 0,1 секунды. На практике такие значения не дают реальной точности и создают лишнюю нагрузку; для большинства сценариев разумный минимум — 0,5–1 секунда.

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

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

Отключится ли обработчик при закрытии формы?

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

Почему обработчик срабатывает не точно в срок?

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

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

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

Итог

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

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