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