Работа с регламентными заданиями

Печать (Ctrl+P)


Ряд действий в программе может выполняться автоматически в фоновом режиме, по определенному расписанию. Такие действия называются регламентными заданиями. Настройка регламентных заданий в библиотеке стандартных подсистем выполняется в списке Регламентные и фоновые задания, который открывается с помощью соответствующей ссылки в разделе Администрирование – Обслуживание. Подробнее можно посмотреть здесь

Регламентные задания предназначены для выполнения прикладных задач по расписанию и создаются на основе метаданных, определяемых в конфигурации , а Фоновые задания – для выполнения прикладных задач асинхронно и реализуются средствами встроенного языка. Подробнее о механизме заданий можно посмотреть здесь

Для демонстрации работы с заданиями я показываю 2 не типовые задания: Уведомление о выдаче товаров покупателю и уведомление о готовности заказа покупателя ( см рис 1).

Однако, связи с тем, что

Завершившиеся успешно или аварийно фоновые задания хранятся в течение суток, а потом удаляются,

приходится хранить в отдельном регистре историю интересующих заданий

Пример работы с регламентными и фоновыми задания из встроенного языка

Пример, приведенный в данном разделе, не является законченным и предназначен для демонстрации способов работы с фоновыми заданиями.

Суть примера заключается в том, что требуется получить последнее фоновое задание и последнее фоновое задание, выполненное успешно, а затем эту информацию передавать HTTP – клиенту в формате JSON.

Перед тем, как написать HTTP сервис, я создал обработку для сбора этой информации.

В управляемой форме обработки при нажатии кнопки “Заполнить” формируется таблица, показанной на рис 2

Для получения последнего задания я использую метод

РегламентныеЗадания. ПолучитьРегламентныеЗадания (<Отбор>)  

Данный метод возвращает массив объектов РегламентныеЗадания по заданному отбору. В качестве структуры отбора могут быть использован любое свойство объекта : УникальныйИдентификатор, Ключ, Метаданные, Предопределенное, Использование, Наименование. Если отбор не задан, получаются все регламентные задания.
В данном примере я использую отбор по метаданным и в качестве значения указываю метаданные регламентного задания, как указано в конфигураторе.

Для получения последнего фонового задания, которое завершено успешно я использую метод фонового задания :

ФоновыеЗадания. ПолучитьФоновыеЗадания(<Отбор>)  

Данный метод возвращает массив объектов ФоновоеЗадание по заданному отбору. Структура, задающая отбор может иметь значения любого свойства объекта : УникальныйИдентификатор, Ключ, Состояние, Начало, Конец, Наименование, ИмяМетода, РегламентноеЗадание.
Если отбор не задан, получаются все задания.
В этом примере я использую отбор по состоянию и по регламентному заданию. В качестве значения Состояние структуры я использую значение перечисления СостояниеФоновогоЗадания.Завершено ( Допустимо также массив перечислений , если идет выборка по нескольким состояниям)
Поскольку я использую отбор по регламентному заданию, то получаются все фоновые задания, которые были созданы по заданному регламентному заданию.

Отметим, что для получения массива объектов
РегламентныеЗадания и ФоновоеЗадание по заданному отбору возможно только для администратора или пользователя, запустившего задания на выполнение

Полный программный код при нажатии кнопки выполнить написано ниже.


&НаКлиенте
Процедура КомандаЗаполнить(Команда)
ОчиститьСообщения();
	ЗаполнитТаблицуНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитТаблицуНаСервере()
Объект.ТабличнаяЧасть1.Очистить();
ЗаполнитьТаблицу(Метаданные.РегламентныеЗадания._УведовлениеОВыдаче);
ЗаполнитьТаблицу(Метаданные.РегламентныеЗадания._УведомлениеОготовности);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицу(МетаданныеРегламентныеЗадания)
Отбор = Новый Структура;
Отбор.Вставить("Метаданные",МетаданныеРегламентныеЗадания);
МассивРегламентныеЗадания = РегламентныеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для каждого РегламентноеЗадание из МассивРегламентныеЗадания цикл
	Нов = Объект.ТабличнаяЧасть1.Добавить();
	Нов.Задание =Строка(РегламентноеЗадание);
	ФоновоеЗадание =РегламентноеЗадание.ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено Тогда
Нов.Состояние = Строка(ФоновоеЗадание.Состояние); 
Нов.Конец= ФоновоеЗадание.Конец;
Нов.Начало= ФоновоеЗадание.Начало;
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Нов.Конец1= ФоновоеЗадание.Конец;
Нов.Начало1= ФоновоеЗадание.Начало;
Иначе	
Отбор = Новый Структура;
Отбор.Вставить("Состояние",СостояниеФоновогоЗадания.Завершено);
Отбор.Вставить("РегламентноеЗадание",РегламентноеЗадание);
МассивФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если МассивФоновыеЗадания.Количество()>0 Тогда
ФоновоеЗадание= МассивФоновыеЗадания[МассивФоновыеЗадания.Количество()-1];
Нов.Конец1= ФоновоеЗадание.Конец;
Нов.Начало1= ФоновоеЗадание.Начало;
КонецЕсли;
КонецЕсли;
КонецЕсли;	
КонецЦикла;
КонецПроцедуры

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.