ПеренаправитьЗадачи (БСП)

Автор: 1С
ОбщийМодуль.БизнесПроцессыИЗадачиВызовСервера
БСП

Перенаправить задачи. Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре.

// Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре.
// ИнфоОПеренаправлении. 
//
// Параметры:
//  МассивЗадач          - Массив    - массив задач для перенаправления.
//  ИнфоОПеренаправлении - Структура - содержит новые значения реквизитов адресации задачи.
//  ТолькоПроверка       - Булево    - если Истина, то функция не будет выполнять
//                                     физического перенаправления задач, а только 
//                                     проверит возможность перенаправления.
//  МассивПеренаправленныхЗадач - Массив - массив перенаправленных задач.
//                                         Может отличаться по составу элементов от 
//                                         массива МассивЗадач, если какие-то задачи
//                                         не удалось перенаправить.
//
// Возвращаемое значение:
//   Булево   - Истина, если перенаправление выполнено успешно.
//
Функция ПеренаправитьЗадачи(Знач МассивЗадач, Знач ИнфоОПеренаправлении, Знач ТолькоПроверка = Ложь,
	МассивПеренаправленныхЗадач = Неопределено) Экспорт
	
	Результат = Истина;
	
	СведенияОЗадачах = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивЗадач, "БизнесПроцесс,Выполнена");
	НачатьТранзакцию();
	Попытка
		Для Каждого Задача Из СведенияОЗадачах Цикл
			
			Если Задача.Значение.Выполнена Тогда
				Результат = Ложь;
				Если ТолькоПроверка Тогда
					ОтменитьТранзакцию();
					Возврат Результат;
				КонецЕсли;
			КонецЕсли;	
			
			БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задача.Ключ);
			Если ЗначениеЗаполнено(Задача.Значение.БизнесПроцесс) И Не Задача.Значение.БизнесПроцесс.Пустая() Тогда
				БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(Задача.Значение.БизнесПроцесс);
			КонецЕсли;
		КонецЦикла;
						
		Если ТолькоПроверка Тогда
			Для Каждого Задача Из СведенияОЗадачах Цикл
				ЗадачаОбъект = Задача.Ключ.ПолучитьОбъект();
				ЗадачаОбъект.Выполнена = Ложь;
				ЗадачаОбъект.ДополнительныеСвойства.Вставить("Перенаправление", Истина);
				ЗадачаОбъект.ВыполнитьЗадачу();
			КонецЦикла;	
			ОтменитьТранзакцию();
			Возврат Результат;
		КонецЕсли;	
		
		Для Каждого Задача Из СведенияОЗадачах Цикл
			
			Если НЕ ЗначениеЗаполнено(МассивПеренаправленныхЗадач) Тогда
				МассивПеренаправленныхЗадач = Новый Массив();
			КонецЕсли;
			
			// Не устанавливаем объектную блокировку на задачу Задача для того, чтобы 
			// позволить выполнять перенаправление по команде из формы этой задачи.
			ЗадачаОбъект = Задача.Ключ.ПолучитьОбъект();
			
			УстановитьПривилегированныйРежим(Истина);
			НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
			НоваяЗадача.Заполнить(ЗадачаОбъект);
			ЗаполнитьЗначенияСвойств(НоваяЗадача, ИнфоОПеренаправлении, 
				"Исполнитель,РольИсполнителя,ОсновнойОбъектАдресации,ДополнительныйОбъектАдресации");
			НоваяЗадача.Записать();
			УстановитьПривилегированныйРежим(Ложь);
		
			МассивПеренаправленныхЗадач.Добавить(НоваяЗадача.Ссылка);
			
			ЗадачаОбъект.РезультатВыполнения = ИнфоОПеренаправлении.Комментарий; 
			ЗадачаОбъект.Выполнена = Ложь;
			ЗадачаОбъект.ДополнительныеСвойства.Вставить("Перенаправление", Истина);
			ЗадачаОбъект.ВыполнитьЗадачу();
			
			УстановитьПривилегированныйРежим(Истина);
			ПодчиненныеБизнесПроцессы = БизнесПроцессыИЗадачиСервер.ВыбратьБизнесПроцессыВедущейЗадачи(Задача.Ключ, Истина).Выбрать();
			УстановитьПривилегированныйРежим(Ложь);
			Пока ПодчиненныеБизнесПроцессы.Следующий() Цикл
				БизнесПроцессОбъект = ПодчиненныеБизнесПроцессы.Ссылка.ПолучитьОбъект();
				БизнесПроцессОбъект.ВедущаяЗадача = НоваяЗадача.Ссылка;
				БизнесПроцессОбъект.Записать();
			КонецЦикла;
			
			ПодчиненныеБизнесПроцессы = БизнесПроцессыИЗадачиСервер.БизнесПроцессыГлавнойЗадачи(Задача.Ключ, Истина);
			Для каждого ПодчиненныйБизнесПроцесс Из ПодчиненныеБизнесПроцессы Цикл
				БизнесПроцессОбъект = ПодчиненныйБизнесПроцесс.ПолучитьОбъект();
				БизнесПроцессОбъект.ГлавнаяЗадача = НоваяЗадача.Ссылка;
				БизнесПроцессОбъект.Записать();
			КонецЦикла;
			
			ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадача);
				
		КонецЦикла;
			
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		Результат = Ложь;
		Если Не ТолькоПроверка Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

ПеренаправитьЗадачиЗавершение (БСП)

Сгибы листка (задача с собеседования)

ПроконтролироватьЗадачи (БСП)

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

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

ПринятьЗадачиКИсполнению (БСП)

ЭтоВедущаяЗадача (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз