Работа с заданиями
Задания — это механизм, который позволяет выполнять заданный код асинхронно в фоновом режиме (фоновые задания) или по расписанию (запланированные задания). В «1С:Шине» задания описываются типами из пространства имен Стд::Задания.
Фоновые задания
С помощью фоновых заданий можно выполнять код на встроенном языке в фоновом режиме.
Ф оновые задания описываются типом ФоновыеЗадания, который позволяет создавать задания и управлять ими.
метод СозданиеФоновогоЗадания()
пер Задания = новый Массив<ФоновоеЗадание>()
Задания.Добавить(ФоновыеЗа дания.Выполнить(&Расчеты.ПервыйРасчет))
Задания.Добавить(ФоновыеЗадания.Выполнить(&Расчеты.ВторойРасчет))
Задания.Добавить(ФоновыеЗадания.Выполнить(&Расчеты.ТретийРасчет))
ФоновыеЗадания.ОжидатьЗавершения(Задания)
;
Фоновое задание запускается при наличии ресурсов, однако результат его работы не гарантирован:
- при выключении сервера или остановке приложения задание может не запуститься;
- при выключении сервера, остановке приложения или прерывании работы выполняемые задания теряются.
Типичное применение фонового задания — параллельные вычисления.
Запланированные задания
С помощью запланированных заданий можно выполнять код на встроенном языке по расписанию, в том числе с многократными повторами в запланированные моменты времени. Чтобы сервис запланированных заданий запускался автоматически при запуске приложения, включите соответствующую настройку в панели управления в меню Настройки приложения:

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