Отложенный запуск и пауза в 1С 8.3: какой механизм выбрать
Содержание
Задержки в 1С нет как одной функции «подожди N секунд». Под словом «задержка» скрываются разные задачи: отложить действие на форме, запустить код по расписанию, выполнить что-то в фоне, выстроить очередь заданий или стартовать базу извне. Для каждой — свой инструмент.
На клиенте паузу и повтор даёт ПодключитьОбработчикОжидания. На сервере отложенный запуск — это регламентные и фоновые задания. Серверной функции «усыпить процесс» в платформе нет, и имитировать её циклом категорически нельзя: такой цикл блокирует рабочий процесс и роняет отзывчивость всего кластера.
Ниже — пять рабочих механизмов и их настройка. Начните с таблицы: она подскажет, что именно вам нужно.
| Механизм | Что делает | Где выполняется |
|---|---|---|
| Обработчик ожидания | Пауза и повтор действия на форме | Клиент |
| Регламентное задание | Запуск кода по расписанию | Сервер (кластер) |
| Фоновое задание | Асинхронный запуск прямо сейчас | Сервер |
| Регистр сведений + задание | Очередь отложенных задач | Сервер |
| Планировщик ОС | Старт базы и обработки извне | ОС (cron / Windows) |
Есть ли в 1С функция паузы и при чём тут оператор Ждать
Прямого аналога Sleep(N) для серверного кода в платформе нет. Если встретите совет «сделай цикл по текущему времени, пока не пройдёт 3 секунды» — не используйте его в рабочей базе.
Активное ожидание в цикле занимает рабочий процесс на 100 %. Пока крутится пустой цикл, процесс не обслуживает другие сеансы. На сервере это приводит к тормозам у всех пользователей.
Вот как выглядит этот антипаттерн — приведён, чтобы вы его узнавали и обходили:
// ПЛОХО: процесс блокируется, другие сеансы ждут. Так не делайте.
Пауза = ТекущаяУниверсальнаяДатаВМиллисекундах() + 3000;
Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < Пауза Цикл
КонецЦикла;
Отдельная путаница — с оператором Ждать. В платформе 8.3.18 появилась асинхронная модель Асинх/Ждать. Но Ждать — это не пауза на время. Это ожидание результата асинхронного метода внутри Асинх-функции:
&НаКлиенте
Асинх Процедура СпроситьПередЗакрытием()
Ответ = Ждать ВопросАсинх("Сохранить изменения?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
// сохраняем
КонецЕсли;
КонецПроцедуры
Здесь Ждать приостанавливает выполнение не на фиксированное время, а до ответа пользователя. Для настоящей задержки по времени нужны другие механизмы — они ниже.
Обработчик ожидания: пауза и повтор прямо на форме
Если задача клиентская — подсветить подсказку через пару секунд, периодически обновлять статус документа, дать пользователю время прочитать сообщение — применяйте ПодключитьОбработчикОжидания.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// вызывать ОбновитьСостояние каждые 5 секунд
ПодключитьОбработчикОжидания("ОбновитьСостояние", 5);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСостояние()
// код, который выполнится с задержкой и затем повторится
КонецПроцедуры
Третий параметр — однократность. Передайте Истина, чтобы обработчик сработал ровно один раз:
// один раз через 3 секунды после открытия
ПодключитьОбработчикОжидания("ПоказатьПодсказку", 3, Истина);
Когда повтор больше не нужен, снимите обработчик:
ОтключитьОбработчикОжидания("ОбновитьСостояние");
Что важно помнить про этот механизм:
- 🕐 Минимальный надёжный интервал — 1 секунда. Доли секунды задать можно, но платформа не гарантирует их точность, и миллисекундного таймера из обработчика не выжать.
- 📍 Процедура-обработчик — всегда клиентская, без параметров, и объявлена в модуле формы.
- 🔁 По умолчанию обработчик повторяется бесконечно, пока форма открыта или пока вы его не отключите.
Для обращения к базе данных из обработчика сделайте внутри него вызов серверной процедуры (&НаСервере). Сам обработчик к данным напрямую не ходит — он живёт на клиенте.
Регламентные задания: запуск кода по расписанию
Когда нужно выполнять код регулярно и без участия пользователя (ночной обмен, пересчёт, рассылка), создают регламентное задание — объект метаданных в ветке «Регламентные задания».
Порядок настройки:
- В конфигураторе добавьте регламентное задание и укажите у него общий серверный модуль и имя метода-обработчика.
- Откройте свойство «Расписание» и задайте, когда запускать: дни, время начала, повтор.
- Для частого повтора внутри дня используйте интервал повторения в течение дня (в секундах) — например, 300, чтобы запускать раз в 5 минут.
- В рабочей базе включите и настройте задание через консоль заданий или через встроенную обработку конфигурации.
Где именно выполняется задание, зависит от режима базы:
- Клиент-серверная база . Задания выполняет кластер серверов , пользователь для этого не нужен. Это штатный сценарий.
- Файловая база. Регламентные задания работают только пока открыт клиентский сеанс с правом их выполнять. Закрыли 1С — расписание встало. Для файловой базы обычно выделяют отдельный сеанс-«робот».
В клиент-серверной базе проверьте в консоли кластера свойство информационной базы «Разрешить выполнение регламентных заданий». Если галка снята, ни одно задание по расписанию не стартует, сколько ни правь код.
Запустить задание из кода вне расписания тоже можно — через поиск предопределённого задания и метод выполнения. Это удобно для ручной перепроверки, не дожидаясь следующего срока.
Фоновые задания: отложить выполнение в фон
Регламентное задание отвечает на вопрос «когда». Фоновое — на вопрос «не блокируя пользователя». Фоновое задание запускает серверный метод асинхронно: интерфейс свободен, а расчёт идёт отдельно.
&НаСервере
Процедура ЗапуститьОбработкуВФоне()
Параметры = Новый Массив;
Параметры.Добавить(Объект.Ссылка);
Задание = ФоновыеЗадания.Выполнить(
"РаботаВФоне.ОбработатьДокумент", // экспортный метод вашего общего модуля
Параметры,
"Док_" + Строка(Объект.Ссылка.УникальныйИдентификатор()), // уникальный ключ
"Обработка документа");
КонецПроцедуры
Разберём параметры:
- 🔹 Первый — имя экспортной процедуры серверного общего модуля в формате
Модуль.Метод. - 🔹 Второй — массив параметров, которые получит метод.
- 🔹 Третий — ключ. Пока в кластере крутится задание с таким ключом, повторный запуск с тем же ключом не стартует. Это защита от дублей.
- 🔹 Четвёртый — наименование для консоли заданий, чтобы в списке было понятно, что это.
Дождаться завершения, когда результат нужен прямо в текущем коде, помогает ФоновыеЗадания.ОжидатьЗавершенияВыполнения(Задание, Таймаут) с таймаутом в секундах.
Связь двух механизмов простая: регламентное задание внутри работает через фоновое. Планировщик кластера по расписанию порождает фоновое задание — поэтому в консоли заданий вы видите и те, и другие.
Число одновременных фоновых заданий ограничено количеством рабочих процессов кластера и лицензиями. Если запускать их пачками без контроля, часть встанет в очередь. Для массовых операций стройте очередь (следующий раздел), а не плодите сотни заданий разом.
Очередь заданий через регистр сведений
Когда отложенных задач много и важны повторные попытки, управляемая нагрузка и порядок, одними фоновыми заданиями не обойтись. Классический приём — очередь на регистре сведений.
Схема такая:
- Заводите независимый регистр сведений
, например «ОчередьЗадач», с измерениями-идентификаторами и ресурсами:
ВремяЗапуска,Статус(В очереди / Выполняется / Готово / Ошибка),Параметры,ЧислоПопыток. - Код, который хочет отложить работу, не выполняет её сразу, а пишет строку в регистр с нужным
ВремяЗапуска. - Регламентное задание-диспетчер раз в N секунд выбирает строки, где статус «В очереди», а
ВремяЗапускауже наступило, и запускает их обработку. - Результат диспетчер пишет обратно в статус. При ошибке увеличивает счётчик попыток и при необходимости переносит запуск на потом.
Чем хорош такой подход:
- ⏳ Можно отложить задачу на конкретное время, а не «запустить сейчас».
- 🔁 Повторные попытки и история прямо в регистре — видно, что и почему не выполнилось.
- 🚦 Диспетчер сам регулирует нагрузку: берёт по N строк за проход, остальное ждёт.
Это уже не одна команда, а небольшой механизм. Но для серьёзной фоновой обработки (обмены, интеграции, массовые пересчёты) очередь на регистре надёжнее, чем россыпь независимых заданий.
ПодключитьОбработчикОжидания. Минимум 1 секунда, код клиентский.ФоновыеЗадания.Выполнить. Интерфейс свободен, расчёт идёт на сервере.1cv8 в пакетном режиме.Внешний планировщик: cron и Планировщик заданий Windows
Иногда задержку нужно организовать снаружи платформы: регламентные задания запускаются только при работающем кластере или сеансе, а вам надо гарантированно стартовать базу ночью и выполнить обработку. Тогда зовут планировщик операционной системы.
Он запускает клиент 1С в пакетном режиме с ключом /Execute и внешней обработкой .epf:
"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" ENTERPRISE ^
/S "server:1541\MyBase" ^
/N "Робот" /P "пароль" ^
/Execute "C:\jobs\НочнойОбмен.epf" ^
/DisableStartupDialogs /DisableStartupMessages
Назначение ключей:
/S "сервер:порт\база"— адрес клиент-серверной базы (для файловой используется/F "путь")./Nи/P— пользователь и пароль для автоматического входа./Execute "...epf"— внешняя обработка, модуль объекта которой выполнится и завершит работу./DisableStartupDialogsи/DisableStartupMessages— глушат окна и вопросы, иначе задание в фоне зависнет на диалоге.
В Windows эту строку оборачивают в задачу Планировщика заданий с нужным расписанием. В Linux — в строку cron:
0 2 * * * /opt/1cv8/x86_64/8.3.xx.xxxx/1cv8 ENTERPRISE /S "server:1541\MyBase" /N "Робот" /P "пароль" /Execute "/opt/jobs/obmen.epf" /DisableStartupDialogs
Пароль в задаче планировщика хранится открытым. Заведите для робота отдельного пользователя с минимальными правами — только на ту операцию, что он выполняет, а не полного администратора.
Когда это оправдано: база не должна висеть запущенной круглосуточно, но ночью обязана выполнить обмен; или обработку надо запускать по событию ОС. Если же база и так работает в кластере постоянно — обычно хватает регламентных заданий, и городить внешний планировщик незачем.
Почему задержка не срабатывает
Чаще всего код верный, а задание молчит из-за настроек окружения. Проверьте по симптому.
/DisableStartupDialogs и /DisableStartupMessages — обработка остановилась на диалоге или сообщении. Добавьте оба ключа.Отдельно про нагрузку: если задержки начались после того, как вы добавили фоновые задания, посмотрите в консоли кластера, сколько их крутится одновременно. Десятки параллельных заданий забивают рабочие процессы, и всё остальное встаёт в очередь. Лучше очередь на регистре с диспетчером, который берёт задачи порциями.
Частые вопросы
Можно ли задать задержку меньше одной секунды?
В чём разница между фоновым и регламентным заданием?
Почему регламентные задания не идут в файловой базе после закрытия 1С?
Как дождаться результата фонового задания в коде?
ФоновыеЗадания.ОжидатьЗавершенияВыполнения с таймаутом. Но помните: ожидание блокирует текущий вызов, поэтому для длительных операций лучше опрашивать статус задания, а не ждать его в одном вызове.Нужна ли внешняя обработка для запуска через планировщик ОС?
1cv8 с ключом /Execute и путём к файлу .epf. Логику выполняете в модуле объекта этой обработки. Внутренние расписания платформы внешний файл не используют.