Работа с регламентными заданиями
Ряд действий в программе может выполняться автоматически в фоновом режиме, по определенному расписанию. Такие действия называются регламентными заданиями. Настройка регламентных заданий в библиотеке стандартных подсистем выполняется в списке Регламентные и фоновые задания, который открывается с помощью соответствующей ссылки в разделе Администрирование – Обслуживание. Подробнее можно посмотреть здесь
Регламентные задания предназначены для выполнения прикладных задач по расписанию и создаются на основе метаданных, определяемых в конфигурации , а Фоновые задания – для выполнения прикладных задач асинхронно и реализуются средствами встроенного языка. Подробнее о механизме заданий можно посмотреть здесь
Для демонстрации работы с заданиями я показываю 2 не типовые задания: Уведомление о выдаче товаров покупателю и уведомление о готовности заказа покупателя ( см рис 1).
Однако, связи с тем, что
Завершившиеся успешно или аварийно фоновые задания хранятся в течение суток, а потом удаляются,
приходится хранить в отдельном регистре историю интересующих заданий
Пример работы с регламентными и фоновыми задания из встроенного языка
Пример, приведенный в данном разделе, не является законченным и предназначен для демонстрации способов работы с фоновыми заданиями.
Суть примера заключается в том, что требуется получить последнее фоновое задание и последнее фоновое задание, выполненное успешно, а затем эту информацию передавать HTTP – клиенту в формате JSON.
Перед тем, как написать HTTP сервис, я создал обработку для сбора этой информации.
В управляемой форме обработки при нажатии кнопки “Заполнить” формируется таблица, показанной на рис 2
Для получения последнего задания я использую метод
РегламентныеЗадания. ПолучитьРегламентныеЗадания (<Отбор>)
Данный метод возвращает массив объектов РегламентныеЗадания по заданному отбору. В качестве структуры отбора могут быть использован любое свойство объекта : УникальныйИдентификатор, Ключ, Метаданные, Предопределенное, Использование, Наименование. Если отбор не задан, получаются все регламентные задания.
В данном примере я использую отбор по метаданным и в качестве значения указываю метаданные регламентного задания, как указано в конфигураторе.
Для получения последнего фонового задания, которое завершено успешно я использую метод фонового задания :
ФоновыеЗадания. ПолучитьФоновыеЗадания(<Отбор>)
Данный метод возвращает массив объектов ФоновоеЗадание по заданному отбору. Структура, задающая отбор может иметь значения любого свойства объекта : УникальныйИдентификатор, Ключ, Состояние, Начало, Конец, Наименование, ИмяМетода, РегламентноеЗадание.
Если отбор не задан, получаются все задания.
В этом примере я использую отбор по состоянию и по регламентному заданию. В качестве значения Состояние структуры я использую значение перечисления СостояниеФоновогоЗадания.Завершено ( Допустимо также массив перечислений , если идет выборка по нескольким состояниям)
Поскольку я использую отбор по регламентному заданию, то получаются все фоновые задания, которые были созданы по заданному регламентному заданию.
Отметим, что для получения массива объектов
РегламентныеЗадания и ФоновоеЗадание по заданному отбору возможно только для администратора или пользователя, запустившего задания на выполнение
Полный программный код при нажатии кнопки выполнить написано ниже.
&НаКлиенте
Процедура КомандаЗаполнить(Команда)
ОчиститьСообщения();
ЗаполнитТаблицуНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитТаблицуНаСервере()
Объект.ТабличнаяЧасть1.Очистить();
ЗаполнитьТаблицу(Метаданные.РегламентныеЗадания._УведовлениеОВыдаче);
ЗаполнитьТаблицу(Метаданные.РегламентныеЗадания._УведомлениеОготовности);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблицу(МетаданныеРегламентныеЗадания)
Отбор = Новый Структура;
Отбор.Вставить("Метаданные",МетаданныеРегламентныеЗадания);
МассивРегламентныеЗадания = РегламентныеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для каждого РегламентноеЗадание из МассивРегламентныеЗадания цикл
Нов = Объект.ТабличнаяЧасть1.Добавить();
Нов.Задание =Строка(РегламентноеЗадание);
ФоновоеЗадание =РегламентноеЗадание.ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено Тогда
Нов.Состояние = Строка(ФоновоеЗадание.Состояние);
Нов.Конец= ФоновоеЗадание.Конец;
Нов.Начало= ФоновоеЗадание.Начало;
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Нов.Конец1= ФоновоеЗадание.Конец;
Нов.Начало1= ФоновоеЗадание.Начало;
Иначе
Отбор = Новый Структура;
Отбор.Вставить("Состояние",СостояниеФоновогоЗадания.Завершено);
Отбор.Вставить("РегламентноеЗадание",РегламентноеЗадание);
МассивФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если МассивФоновыеЗадания.Количество()>0 Тогда
ФоновоеЗадание= МассивФоновыеЗадания[МассивФоновыеЗадания.Количество()-1];
Нов.Конец1= ФоновоеЗадание.Конец;
Нов.Начало1= ФоновоеЗадание.Начало;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры