Вывод всей истории в задаче комплексного процесса

Программирование - Практика программирования

3
В статье описывается, какие изменения нужно сделать, чтобы в задаче комплексного процесса выводилась вся история (по всем процессам), а не только история текущего процесса.

К примеру, есть комплексный процесс, состоящий из согласования и подписания. После прохождения согласования пользователь получает задачу подписания и хочет тут же видеть, как прошло согласование. Просматривать визы в карточке документа не хочет, слишком много телодвижений.

В качестве решения предлагается выводить всю историю выполнения комплексного процесса.

Для этого нужно внести изменения в модуль менеджера регистра сведений "История выполнения задач".

1. Заменить код функции ИсторияПоБизнесПроцессу:

// Возвращает описание истории переданного бизнес-процесса
Функция ИсторияПоБизнесПроцессу(БизнесПроцесс) Экспорт
	
	//ИсторияВыполнения = "";
	//
	//УстановитьПривилегированныйРежим(Истина);
	//
	//Запрос = Новый Запрос("ВЫБРАТЬ
	//	|	ИсторияВыполненияЗадач.Описание
	//	|ИЗ
	//	|	РегистрСведений.ИсторияВыполненияЗадач КАК ИсторияВыполненияЗадач
	//	|ГДЕ
	//	|	ИсторияВыполненияЗадач.БизнесПроцесс = &БизнесПроцесс");
	//	
	//Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
	//Выборка = Запрос.Выполнить().Выбрать();
	//
	//Если Выборка.Следующий() Тогда
	//	ИсторияВыполнения = Выборка.Описание;
	//КонецЕсли;
	//
	//Возврат ИсторияВыполнения;
	
	//{
	
	ИсторияВыполнения = "";
	
	УстановитьПривилегированныйРежим(Истина);

	// проверим, содержится ли процесс в комплексном
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	КомплексныйПроцессЭтапы.Ссылка КАК КомплексныйПроцесс
	|ИЗ
	|	БизнесПроцесс.КомплексныйПроцесс.Этапы КАК КомплексныйПроцессЭтапы
	|ГДЕ
	|	КомплексныйПроцессЭтапы.ЗапущенныйБизнесПроцесс = &БизнесПроцесс";
	
	Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		КомплексныйПроцесс = Выборка.КомплексныйПроцесс;		
		КоличествоЭтапов = КомплексныйПроцесс.Этапы.Количество();
		
		ИсторияВыполнения = Доработка_ИсторияПоБизнесПроцессу(БизнесПроцесс);
				
		Для Сч = 1 По КоличествоЭтапов Цикл 
			ЗапущенныйБизнесПроцесс = КомплексныйПроцесс.Этапы[КоличествоЭтапов-Сч].ЗапущенныйБизнесПроцесс;
			
			Если ЗначениеЗаполнено(ЗапущенныйБизнесПроцесс) и ЗапущенныйБизнесПроцесс <> БизнесПроцесс Тогда 				    		
				ИсторияВыполнения = ?(ИсторияВыполнения = "","", ИсторияВыполнения + Символы.ПС + Символы.ПС)
					+ "ПРОЦЕСС " + Строка(ЗапущенныйБизнесПроцесс) + Символы.ПС + Символы.ПС + Доработка_ИсторияПоБизнесПроцессу(ЗапущенныйБизнесПроцесс);
			КонецЕсли;	
					
		КонецЦикла;
		
		Возврат ИсторияВыполнения;
		
	Иначе
		Возврат Доработка_ИсторияПоБизнесПроцессу(БизнесПроцесс)
	КонецЕсли;
	
	//}

КонецФункции

И добавить функцию:

Функция Доработка_ИсторияПоБизнесПроцессу(БизнесПроцесс) Экспорт
	
	ИсторияВыполнения = "";
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос("ВЫБРАТЬ
		|	ИсторияВыполненияЗадач.Описание
		|ИЗ
		|	РегистрСведений.ИсторияВыполненияЗадач КАК ИсторияВыполненияЗадач
		|ГДЕ
		|	ИсторияВыполненияЗадач.БизнесПроцесс = &БизнесПроцесс");
		
	Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		ИсторияВыполнения = Выборка.Описание;
	КонецЕсли;
	
	Возврат ИсторияВыполнения;

КонецФункции

Надеюсь, кому-то будет полезен данный прием.

3

См. также

Комментарии
Сортировка: Древо
1. Rustig 977 08.08.18 13:56 Сейчас в теме
(0) история согласования красиво смотрится, думаю полезный функционал

про код:
УстановитьПривилегированныйРежим(Истина);
после этого не надо разве прописывать
УстановитьПривилегированныйРежим(Ложь);
?
2. umizumi 3 08.08.18 14:43 Сейчас в теме
(1) нет, не нужно. Из синтаксис-помощника: "Для явного выключения привилегированного режима необходимо внутри процедуры или функции, в которой он был включен, вызвать метод с параметром Ложь столько же раз, сколько раз в этой же процедуре или функции был вызван метод с параметром Истина.
Если этого сделано не было, то при возврате из процедуры/функции, в которой был включен привилегированный режим, он будет выключен автоматически (неявно)."
3. vcv 84 09.08.18 14:02 Сейчас в теме
Несколько сложней, но гораздо функциональней изменить общий модуль ОбзорЗадачВызовСервераПереопределяемый.
Оставьте свое сообщение