Разработка и Конфигурация · 11 мин
Как сделать таймер в 1С: способы и примеры кода
Как сделать таймер в 1С: обработчик ожидания на форме, таймер обратного отсчёта, фоновые задания и регламентные задачи. Примеры кода и разбор ошибок.
Задача «сделать таймер» в 1С встречается в разных сценариях: обратный отсчёт на форме обработки, периодический опрос внешнего оборудования, автоматическое обновление данных на рабочем столе, отложенный запуск длительной операции. Встроенного объекта «таймер» в языке 1С нет, поэтому разработчики используют несколько механизмов платформы, каждый из которых решает свой класс задач.
Основной инструмент на клиенте — обработчик ожидания, который вызывает заданную процедуру через указанный интервал. Для серверной логики применяются фоновые и регламентные задания. Выбор зависит от того, где должен «тикать» таймер: в интерфейсе конкретного пользователя или на сервере независимо от открытых сеансов.
Ниже разобраны рабочие способы с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых таймер «молчит» или, наоборот, грузит систему лишними вызовами.
Какие механизмы заменяют таймер в 1С
Платформа 1С:Предприятие не содержит отдельного объекта Timer, как в других средах разработки. Вместо него доступны четыре подхода, и правильный выбор экономит массу времени на отладке.
Первый — обработчики ожидания на клиенте: процедура формы вызывается через заданный интервал, пока форма открыта. Второй — регламентные задания: код выполняется на сервере по расписанию, независимо от пользователей. Третий — фоновые задания: разовый запуск длительной операции с возможностью опроса результата. Четвёртый — система взаимодействия и оповещения пользователей, когда «таймер» нужен только для напоминаний.
Сравнение вариантов
Подходит для таймеров на форме: отсчёт, автообновление, опрос состояния. Работает только пока открыта форма и запущен сеанс.
Для периодических серверных задач: обмены, очистка данных, рассылки. Не зависит от пользователей, но минимальный разумный интервал — от минуты.
Для разовой длительной операции с опросом результата из формы. Не подходит для бесконечного цикла.
Для напоминаний по времени без постоянного опроса: платформа сама покажет сообщение в нужный момент.
Таймер на форме через обработчик ожидания
Базовый приём — методы глобального контекста ПодключитьОбработчикОжидания и ОтключитьОбработчикОжидания. Подключать обработчик удобно в событии ПриОткрытии формы, а отключать — обязательно в ПриЗакрытии, иначе вызовы продолжатся и обернутся ошибками обращения к уже закрытой форме.
Пример: процедура ОпроситьСостояние будет вызываться каждые 5 секунд, пока открыта форма.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОпроситьСостояние", 5, Ложь);
КонецПроцедуры;
&НаКлиенте
Процедура ОпроситьСостояние()
// периодические действия: обновить данные, проверить статус
КонецПроцедуры;
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ОтключитьОбработчикОжидания("ОпроситьСостояние");
КонецПроцедуры;
Третий параметр определяет режим: Ложь — вызов повторяется с заданным интервалом, Истина — процедура сработает один раз. Однократный вариант удобен для отложенных действий: например, показать подсказку через 10 секунд после открытия формы.
Обратный отсчёт: таймер с секундомером на форме
Частая прикладная задача — показать пользователю оставшееся время: на ввод кода подтверждения, на выполнение операции, до конца резерва товара. Реализуется обработчиком ожидания с интервалом 1 секунда и реквизитом формы, хранящим остаток секунд.
&НаКлиенте
Процедура ЗапуститьОтсчет(Команда)
ОсталосьСекунд = 60; // реквизит формы
ПодключитьОбработчикОжидания("ШагОтсчета", 1, Ложь);
КонецПроцедуры;
&НаКлиенте
Процедура ШагОтсчета()
ОсталосьСекунд = ОсталосьСекунд - 1;
Если ОсталосьСекунд <= 0 Тогда
ОтключитьОбработчикОжидания("ШагОтсчета");
ВремяИстекло();
КонецЕсли;
КонецПроцедуры;
Значение ОсталосьСекунд выводится в надпись на форме — пользователь видит живой отсчёт. Учтите, что обработчик ожидания не гарантирует точность до миллисекунд: при загруженном клиенте срабатывания могут запаздывать. Для контрольных по времени операций (например, блокировка по таймауту) сверяйтесь с серверным временем, а не только с количеством «тиков».
- 1Добавьте на форму реквизит для остатка времени и элемент для его отображения
- 2В нужном событии задайте начальное значение и вызовите ПодключитьОбработчикОжидания с интервалом 1 секунда
- 3В процедуре-обработчике уменьшайте счётчик и обновляйте отображение
- 4При достижении нуля отключите обработчик и выполните итоговое действие
- 5В ПриЗакрытии формы отключите обработчик, чтобы не осталось висящих вызовов
Опрос фонового задания: таймер для длительных операций
Когда таймер нужен, чтобы ждать завершения тяжёлой операции (загрузка данных, формирование большого отчёта), правильная схема — фоновое задание плюс обработчик ожидания, который периодически проверяет его состояние. Сама операция выполняется на сервере, клиент не зависает, а форма показывает прогресс.
Логика такая: при нажатии кнопки запускается фоновое задание, его уникальный идентификатор сохраняется в реквизит формы, и подключается обработчик ожидания с интервалом 2–5 секунд. В обработчике вызывается серверная функция, которая по идентификатору находит задание и возвращает его состояние. Когда состояние — «Завершено», обработчик отключается и результат выводится пользователю.
В управляемом приложении для этой задачи также есть штатный механизм длительных операций из БСП (если конфигурация на ней построена), который уже включает опрос и отображение прогресса — изобретать собственный опрос тогда не нужно.
Не ставьте интервал опроса фонового задания меньше 1–2 секунд. Каждый тик — это серверный вызов, и при частом опросе из множества открытых форм создаётся заметная лишняя нагрузка на сервер без какой-либо пользы для пользователя.
Серверные таймеры: регламентные задания
Если действие должно выполняться по расписанию независимо от того, открыта ли какая-то форма, нужен не клиентский таймер, а регламентное задание. Оно создаётся в конфигураторе: добавляется объект метаданных «Регламентное задание», указывается метод (процедура общего модуля) и расписание — например, каждые 10 минут или ежедневно в заданное время.
В файловой базе регламентные задания выполняются только пока запущен сеанс, в котором разрешено их выполнение, — это важное ограничение. В клиент-серверном варианте задания исполняет кластер серверов 1С, и они работают круглосуточно.
Типовые сценарии: обмен с сайтом, пересчёт итогов, очистка устаревших данных, отправка уведомлений. Процедура задания должна быть серверной, без контекста формы, и обязана корректно обрабатывать ошибки — необработанное исключение приведёт к аварийному завершению задания и записи в журнал регистрации.
Проверка результата и типичные ошибки
После внедрения таймера проверьте не только факт срабатывания, но и поведение в пограничных ситуациях: закрытие формы во время отсчёта, повторное нажатие кнопки запуска, разрыв соединения с сервером во время фоновой операции.
Как проверить результат
Процедура вызывается с заданным интервалом, значения на форме обновляются
Обработчик молчит — проверьте имя процедуры строкой и директиву &НаКлиенте
После закрытия нет ошибок в журнале и повторных вызовов
Ошибки обращения к закрытой форме — обработчик не отключён в ПриЗакрытии
Повторное нажатие не создаёт дублирующих вызовов
Отсчёт ускоряется — обработчик подключён дважды без предварительного отключения
Интервал опроса соответствует реальной потребности
Серверные вызовы каждую секунду из множества форм — интервал нужно увеличить
Отдельная группа проблем — путаница клиентского и серверного контекстов. Обработчик ожидания всегда выполняется на клиенте, поэтому обращение к данным базы из него требует вызова серверной процедуры. Частые серверные вызовы в таймере — признак того, что задачу стоит перенести в регламентное задание.
Как выбрать подходящий способ
Критерий выбора простой: где должна жить логика таймера. Если она привязана к открытой форме и видна пользователю — обработчик ожидания. Если должна работать всегда, в том числе ночью и без пользователей — регламентное задание. Если нужно дождаться конкретной длительной операции — фоновое задание с опросом.
Как выбрать действие
Что важно запомнить
Таймер на форме — это обработчик ожидания: подключение по имени процедуры, обязательное отключение при закрытии, разумный интервал. Для серверных периодических задач — регламентные задания, для длительных операций — фоновые задания с опросом состояния.
Частые вопросы
Почему обработчик ожидания не срабатывает?
Чаще всего причина в несовпадении имени процедуры: оно передаётся строкой и проверяется только в момент вызова. Также проверьте, что процедура объявлена с директивой &НаКлиенте и не имеет обязательных параметров — обработчик ожидания вызывает процедуру без аргументов.
Можно ли сделать таймер точностью до миллисекунд?
Нет. Обработчик ожидания — интерфейсный механизм, его срабатывание зависит от загрузки клиентского приложения и не гарантирует точного интервала. Для задач, где критично точное время, фиксируйте серверное время начала и сверяйте фактическую разницу, а не считайте количество тиков.
Работает ли таймер, если пользователь свернул 1С?
Обработчик ожидания продолжает срабатывать, пока сеанс активен и форма открыта, даже если окно свёрнуто. Но при завершении сеанса или закрытии формы таймер прекращает работу — для задач, независимых от сеанса, нужны регламентные задания.
Как остановить таймер по кнопке?
Вызовите ОтключитьОбработчикОжидания с тем же именем процедуры, что передавалось при подключении. Это безопасно: если обработчик не был подключён, ошибки не возникнет. После отключения таймер можно запустить заново повторным подключением.
Чем регламентное задание отличается от фонового?
Регламентное задание выполняется по расписанию многократно и настраивается в конфигураторе или административном интерфейсе. Фоновое задание запускается программно один раз для конкретной операции и завершается вместе с ней. Таймер в классическом смысле — это скорее регламентное задание.
Можно ли сделать таймер без изменения конфигурации?
Да, если логика размещается во внешней обработке: обработчики ожидания работают и в формах внешних обработок. Регламентное же задание требует объекта метаданных, поэтому без доработки конфигурации или расширения его не добавить.