Задания
Задания — это механизм, который позволяет выполнять заданный код асинхронно в фоновом режиме (фоновые задания) или по расписанию (запланированные задания). В «1С:Исполнителе» задания описываются типами из пространства имен Стд::Задания
.
Фоновые задания
С помощью фоновых заданий можно выполнять код на встроенном языке в фоновом режиме.
Фоновые задания описываются типом ФоновыеЗадания
, который позволяет создавать задания и управлять ими.
метод СозданиеФоновогоЗадания()
пер Задания = новый Массив<ФоновоеЗадание>()
Задания.Добавить(ФоновыеЗадания.Выполнить(&Расчеты.ПервыйРасчет))
Задания.Добавить(ФоновыеЗадания.Выполнить(&Расчеты.ВторойРасчет))
Задания.Добавить(ФоновыеЗадания.Выполнить(&Расчеты.ТретийРасчет))
ФоновыеЗадания.ОжидатьЗавершения(Задания)
;
Фоновое задание запускается при наличии ресурсов, однако результат его работы не гарантирован:
- при выключении сервера или остановке приложения задание может не запуститься;
- при выключении сервера, остановке приложения или прерывании работы выполняемые задания теряются.
Типичное применение фонового задания — параллельные вычисления.
Запланированные задания
С помощью запланированных заданий можно выполнять код на встроенном языке по расписанию, в том числе с многократными повторами в запланированные моменты времени. Чтобы сервис запланированных заданий запускался автоматически при запуске приложения, включите соответствующую настройку в панели управления в меню Настройки приложения:
При включении сервиса в журнал событий записывается событие СобытиеЗапланированныеЗаданияВключены
, а при выключении — СобытиеЗапланированныеЗаданияВыключены
.
Запуск запланированного задания гарантируется в следующих случаях:
- при выключении сервера или остановке приложения, если задание не выполнялось в момент выключения;
- при выключении сервера, остановке приложения или прерывании выполнения работающее задание завершается с ошибкой и обрабатывается в соответствии со стратегией обработки ошибок: например, задание может быть запущено повторно через равные интервалы времени, а также линейно и экспоненциально меняющиеся.
Создание и планирование заданий
Запланированные задания описываются типом ЗапланированныеЗадания
, который позволяет создавать запланированные задани я и управлять ими. В методе Создать()
в качестве параметров указывается имя обработчика, который вызывается для выполнения задания, и параметры, передаваемые в обработчик. Например:
метод МойМетод(Ключ: Строка, Период: Число)
// код выполнения задания
;
знч Задание = ЗапланированныеЗадания.Создать(&МояПодсистема::МойМодуль.МойМетод, "Ключ", 500)
Метод Создать()
возвращает объект типа СоздаваемоеЗапланированноеЗадание
, который позволяет настроить создаваемое задание с помощью метода Настроить()
и запланировать его выполнение относительно активной транзакции с помощью методов:
Запланировать()
— если нет активной транзакции, задание планируется немедленно, в противном случае задание сохраняется в базу данных и планируется после завершения активной транзакции;ЗапланироватьБезТранзакции()
— задание планируется немедленно, независимо от наличия активной транзакции;ЗапланироватьВТранзакции()
— задание сохраняется в базу данных и планируется после завершения активной транзакции. Если активной транзакции нет, выбрасывается исключение.
Если сервис заданий выключен, метод ЗапланироватьБезТранзакции()
выбрасывает исключение. Если сервис заданий выключен и активных транзакций нет, то методы Запланировать()
и ЗапланироватьВТранзакции()
выбрасывают исключение. При наличии активной транзакции методы Запланировать()
и ЗапланироватьВТранзакции()
успешно выполнятся, а задания будут запланированы, когда запустится сервис.
При обновлении проекта сервис запланированных заданий всегда выключен, поэтому в обработчике @ОбновлениеПроекта
можно планировать задания только с помощью метода ЗапланироватьВТранзакции()
.
Изменение и настройка заданий
Метод Изменить()
типа ЗапланированныеЗадания
возвращает объект типа ИзменяемоеЗапланированноеЗадание
, с помощью которого можно поменять некоторые параметры запуска существующего запланированного задания. Чтобы запланировать измененное задание, используются методы Запланировать()
, ЗапланироватьБезТранзакции()
и ЗапланироватьВТранзакции()
по аналогии с одноименными методами типа СоздаваемоеЗапланированноеЗадание
.
При настройке запланированного задания с помощью метода СоздаваемоеЗапланированноеЗадание.Настроить()
вы можете задавать следующие параметры:
Ключ
Строка
. Ключ служит для идентификации задания. С его помощью вы можете:
-
изменить задание;
// Создание запланированного задания НовоеЗадание с заданным ключом Ключ
знч Ключ = "ЗаданиеРассылкиСпама"
пер НовоеЗадание = ЗапланированныеЗадания.Создать(&МойМодуль.МойМетод)
.Настроить(Ключ = Ключ)
.Запланировать()
// Получение объекта типа ИзменяемоеЗапланированноеЗадание,
// чтобы изменить задание с ключом Ключ
знч ИзмЗадание = ЗапланированныеЗадания.Изменить(Ключ) -
отменить выполнение задания — прерывает исполнение задания, если оно выполняется в момент вызова; для задания с расписанием отменяется только текущее исполнение;
ЗапланированныеЗадания.Отменить("МоеЗадание")
-
приостановить выполнение задания (только для заданий с расписанием);
ЗапланированныеЗадания.Приостановить("МоеЗадание")
-
возобновить выполнение задания (только для заданий с расписанием).
ЗапланированныеЗадания.Возобновить("МоеЗадание")
Ключ, назначенный с помощью метода Настроить()
, удобно использовать для регулярных заданий. Если задание выполняется однократно, обычно используется уникальный автоматически сгенерированный ключ.
Если в момент вызова метода Запланировать()
уже существует задание с таким же ключом, то поведение метода определяется стратегией публикации.
Параметр нельзя изменить после планирования задания.
Описание
Строка
. Описание задания. Параметр нельзя изменить после планирования задания.
Расписание
Расписание|Обходимое<Расписание>
. Задает расписание запуска задания.
метод ЗапланироватьЗаданияСРасписанием()
знч Праздничное = ЗапланированныеЗадания.Создать(&МойМодуль.МойМетод)
Праздничное.Настроить(Расписание = [
Расписание.Ежемесячно(Время{8:00}, {Месяц.Февраль}, {23}),
Расписание.Ежемесячно(Время{8:00}, {Месяц.Март}, {8})])
Праздничное.Запланировать()
;
Задержка
Длительность
. Задает задержку начала выполнения относительн о времени планирования задания:
- если задание запланировано с помощью метода
ЗапланироватьБезТранзакции()
, то задержка вычисляется от момента вызова этого метода; - если задание запланировано с помощью метода
ЗапланироватьВТранзакции()
, то задержка вычисляется от момента окончания активной транзакции; - если задано расписание, то задержка игнорируется.
метод ЗапланироватьЗаданияСЗадержкой()
знч ЗаданиеСЗадержкой = ЗапланированныеЗадания.Создать(&МойМодуль.МойМетод)
ЗаданиеСЗадержкой.Настроить(Задержка = 3с)
ЗаданиеСЗадержкой.Запланировать()
;
ПовторыПриОшибке
СтратегияПовтораЗадания
. Используется, чтобы запланировать повторный запуск задания, если текущий запуск завершается с ошибкой.