Обработать очередь заданий. Обрабатывает очередь заданий.
// Обрабатывает очередь заданий.
//
// Параметры:
// ПараметрыЗадания - СправочникСсылка.ДополнительныеОбработчикиОчередиЗаданий.
// ДатаЗавершения - Дата.
// ТекстЗапроса - Строка.
//
Процедура ОбработатьОчередьЗаданий(ПараметрыЗадания, ДатаЗавершения = Неопределено, ТекстЗапроса = Неопределено) Экспорт
ИсполняющееФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ДатаЗавершения = Неопределено Тогда
ДатаЗавершения = ТекущаяУниверсальнаяДата() + ПараметрыЗадания.ДлительностьЗадания;
КонецЕсли;
Если ТекстЗапроса = Неопределено Тогда
ТекстЗапроса = ТекстЗапросаЗаданияВОчереди();
КонецЕсли;
РазмерВыборкиТекст = Формат(ПараметрыЗадания.КоличествоЗаданий * 3, "ЧН=; ЧГ=");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "111", РазмерВыборкиТекст);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Методы", ПараметрыЗадания.Методы.ВыгрузитьКолонку("Метод"));
Запрос.Текст = ТекстЗапроса;
БлокировкаУстановлена = Неопределено;
// Цикл должен выполниться хотя бы один раз.
Пока БлокировкаУстановлена = Неопределено Или ТекущаяУниверсальнаяДата() < ДатаЗавершения Цикл
Запрос.УстановитьПараметр("ТекущаяУниверсальнаяДата", ТекущаяУниверсальнаяДата());
Выборка = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать();
БлокировкаУстановлена = Ложь;
Пока Выборка.Следующий() Цикл
Попытка
ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка);
// Проверка блокировки области.
Если Выборка.ОбластьДанных <> -1
И РаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда
РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
// Область заблокирована, перейти к следующей записи.
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Выборка.Шаблон) И Выборка.СсылкаШаблона = Неопределено Тогда
ШаблонСообщения = НСтр("ru = 'На найден шаблон задания очереди с идентификатором %1'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Выборка.Шаблон);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь заданий.Выполнение'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
,
,
ТекстСообщения);
РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
Продолжить;
КонецЕсли;
БлокировкаУстановлена = Истина;
Прервать;
Исключение
// Не удалось установить блокировку.
БлокировкаУстановлена = Ложь;
КонецПопытки;
КонецЦикла;
Если Не БлокировкаУстановлена Тогда
Возврат;
КонецЕсли;
Расписание = Выборка.Расписание.Получить();
Если Расписание <> Неопределено Тогда
// Проверка попадания в допустимые интервалы очереди.
ЧасовойПояс = Выборка.ЧасовойПояс;
Если ПустаяСтрока(ЧасовойПояс) Тогда
ЧасовойПояс = Неопределено;
КонецЕсли;
ВремяОбласти = МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПояс);
Просрочено = Не Расписание.ТребуетсяВыполнение(ВремяОбласти);
Иначе
Просрочено = Ложь;
КонецЕсли;
Если Просрочено Тогда
// Требуется перепланировать задание.
Задание = Выборка.Ссылка.ПолучитьОбъект();
Задание.СостояниеЗадания = Перечисления.СостоянияЗаданий.НеЗапланировано;
ЗапланироватьЗадание(Задание,
Выборка.Расписание.Получить(),
Выборка.КоличествоПовторовПриАварийномЗавершении,
Выборка.ИнтервалПовтораПриАварийномЗавершении,
Выборка.ЧасовойПояс);
Иначе
ВыполнитьЗаданиеОчереди(Выборка.Ссылка, ИсполняющееФоновоеЗадание, Выборка.Шаблон, Выборка.ИмяМетода);
ЗапланироватьЗадание(Выборка.Ссылка.ПолучитьОбъект(),
Выборка.Расписание.Получить(),
Выборка.КоличествоПовторовПриАварийномЗавершении,
Выборка.ИнтервалПовтораПриАварийномЗавершении,
Выборка.ЧасовойПояс);
КонецЕсли;
РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)