ОбработатьОчередьЗаданий (БСП)

Автор: 1С
ОбщийМодуль.ОчередьЗаданийБТС
БСП

Обработать очередь заданий. Обрабатывает очередь заданий.

// Обрабатывает очередь заданий.
//
// Параметры:
//   ПараметрыЗадания - СправочникСсылка.ДополнительныеОбработчикиОчередиЗаданий.
//   ДатаЗавершения - Дата.
//   ТекстЗапроса - Строка.
//
Процедура ОбработатьОчередьЗаданий(ПараметрыЗадания, ДатаЗавершения = Неопределено, ТекстЗапроса = Неопределено) Экспорт
	
	ИсполняющееФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
	
	Если ДатаЗавершения = Неопределено Тогда
		ДатаЗавершения = ТекущаяУниверсальнаяДата() + ПараметрыЗадания.ДлительностьЗадания;
	КонецЕсли;
	
	Если ТекстЗапроса = Неопределено Тогда
		ТекстЗапроса = ТекстЗапросаЗаданияВОчереди();
	КонецЕсли;
	
	РазмерВыборкиТекст = Формат(ПараметрыЗадания.КоличествоЗаданий * 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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ОбработатьДанные (БСП)

ШаблоныЗаданийОчереди (БСП)

ПараметрыЗаданийОчереди (БСП)

УдалитьЗадание (БСП)

ОбновитьЗаданияОчередиПоШаблонам (БСП)

ПодготовитьДанные (БСП)

ВыполнитьКоманду (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом