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

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

Как сделать таймер в 1С: способы и примеры кода

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

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

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

Ниже разобраны рабочие способы с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых таймер «молчит» или, наоборот, грузит систему лишними вызовами.

Какие механизмы заменяют таймер в 1С

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

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

Сравнение вариантов

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

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

Регламентное задание

Для периодических серверных задач: обмены, очистка данных, рассылки. Не зависит от пользователей, но минимальный разумный интервал — от минуты.

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

Для разовой длительной операции с опросом результата из формы. Не подходит для бесконечного цикла.

Оповещения пользователя

Для напоминаний по времени без постоянного опроса: платформа сама покажет сообщение в нужный момент.

Таймер на форме через обработчик ожидания

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

Пример: процедура ОпроситьСостояние будет вызываться каждые 5 секунд, пока открыта форма.

&НаКлиенте

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

ПодключитьОбработчикОжидания("ОпроситьСостояние", 5, Ложь);

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

&НаКлиенте

Процедура ОпроситьСостояние()

// периодические действия: обновить данные, проверить статус

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

&НаКлиенте

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

ОтключитьОбработчикОжидания("ОпроситьСостояние");

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

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

Обратный отсчёт: таймер с секундомером на форме

Частая прикладная задача — показать пользователю оставшееся время: на ввод кода подтверждения, на выполнение операции, до конца резерва товара. Реализуется обработчиком ожидания с интервалом 1 секунда и реквизитом формы, хранящим остаток секунд.

&НаКлиенте

Процедура ЗапуститьОтсчет(Команда)

ОсталосьСекунд = 60; // реквизит формы

ПодключитьОбработчикОжидания("ШагОтсчета", 1, Ложь);

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

&НаКлиенте

Процедура ШагОтсчета()

ОсталосьСекунд = ОсталосьСекунд - 1;

Если ОсталосьСекунд <= 0 Тогда

ОтключитьОбработчикОжидания("ШагОтсчета");

ВремяИстекло();

КонецЕсли;

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

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

Порядок действий
  1. 1
    Добавьте на форму реквизит для остатка времени и элемент для его отображения
  2. 2
    В нужном событии задайте начальное значение и вызовите ПодключитьОбработчикОжидания с интервалом 1 секунда
  3. 3
    В процедуре-обработчике уменьшайте счётчик и обновляйте отображение
  4. 4
    При достижении нуля отключите обработчик и выполните итоговое действие
  5. 5
    В ПриЗакрытии формы отключите обработчик, чтобы не осталось висящих вызовов

Опрос фонового задания: таймер для длительных операций

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

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

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

Не ставьте интервал опроса фонового задания меньше 1–2 секунд. Каждый тик — это серверный вызов, и при частом опросе из множества открытых форм создаётся заметная лишняя нагрузка на сервер без какой-либо пользы для пользователя.
ПЗ
Практическое замечание

Серверные таймеры: регламентные задания

Если действие должно выполняться по расписанию независимо от того, открыта ли какая-то форма, нужен не клиентский таймер, а регламентное задание. Оно создаётся в конфигураторе: добавляется объект метаданных «Регламентное задание», указывается метод (процедура общего модуля) и расписание — например, каждые 10 минут или ежедневно в заданное время.

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

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

Проверка результата и типичные ошибки

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

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

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

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

Процедура вызывается с заданным интервалом, значения на форме обновляются

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

Обработчик молчит — проверьте имя процедуры строкой и директиву &amp;НаКлиенте

Закрытие формы
Норма

После закрытия нет ошибок в журнале и повторных вызовов

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

Ошибки обращения к закрытой форме — обработчик не отключён в ПриЗакрытии

Повторный запуск
Норма

Повторное нажатие не создаёт дублирующих вызовов

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

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

Нагрузка
Норма

Интервал опроса соответствует реальной потребности

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

Серверные вызовы каждую секунду из множества форм — интервал нужно увеличить

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

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

Как выбрать подходящий способ

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

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

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

Нужен видимый отсчёт или автообновление на открытой формеИспользуйте ПодключитьОбработчикОжидания с подходящим интервалом
Действие должно выполняться по расписанию без участия пользователяСоздайте регламентное задание в конфигураторе
Нужно запустить тяжёлую операцию и показать прогрессЗапустите фоновое задание и опрашивайте его состояние обработчиком ожидания
Нужно просто напомнить пользователю о событииИспользуйте механизм оповещений пользователя вместо постоянного таймера
Итог

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

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

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

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

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

Можно ли сделать таймер точностью до миллисекунд?

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

Работает ли таймер, если пользователь свернул 1С?

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

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

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

Чем регламентное задание отличается от фонового?

Регламентное задание выполняется по расписанию многократно и настраивается в конфигураторе или административном интерфейсе. Фоновое задание запускается программно один раз для конкретной операции и завершается вместе с ней. Таймер в классическом смысле — это скорее регламентное задание.

Можно ли сделать таймер без изменения конфигурации?

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