Вывод полной истории в задаче по всему "дереву" бизнес-процессов

30.01.20

Задачи пользователя - Адаптация типовых решений

Вашему вниманию предлагается моя версия текста общего модуля "ОбзорЗадачВызовСервераПереопределяемый" для конфигурации 1С:Документооборот.

Задача:

Пользователям необходим просмотр полной истории выполнения всех подчинённых бизнес-процессов(всего "дерева") из задачи исполнителя.

 

Решение:

Если есть подчиненные или текущий процесс является подчиненным, тогда выводим историю выполнения всего "дерева" бизнес-процессов в обратном хронологическом порядке.

Заменить текст общего модуля "ОбзорЗадачВызовСервераПереопределяемый".

 
 ОбзорЗадачВызовСервераПереопределяемый

////////////////////////////////////////////////////////////////////////////////
// Обзор задач вызов сервера переопределяемый: Содержит переопределяемые процедуры
//  по формированию HTML представления задач.
//  
////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Возвращает текст HTML для показа обзора процесса Исполнение
//
// Параметры:
//   Задача - ЗадачаСсылка.ЗадачаИсполнителя
//
Функция ПолучитьОбзорЗадачи(Задача) Экспорт
	// Было	
	//HTMLТекст = "";
	//
	//Возврат HTMLТекст;

////////////////////////////////////////////////////////////////////////////////////
//Романов И.В. 15.11.2019 10:21:50
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачи()) Начало
////////////////////////////////////////////////////////////////////////////////////
	                   
	// Формируем основное представление процесса
	HTMLТекст = "<html>
	|<head>
	|<style type=""text/css"">
	|	body {
	|		overflow:    auto;
	|		margin-top:  2px;
	|		margin-left: 2px;
	|		margin-right: 2px;
	|		font-family: Arial; 
	|		font-size:   10pt;}
	|	table {
	|		width:       100%;
	|		font-family: Arial; 
	|		font-size:   10pt;
	|		border: 0px solid;}
	|	td {vertical-align: top;}
	| 	a:link {
	|		color: #006699; text-decoration: none;}
	|	a:visited {
	|		color: #006699; text-decoration: none;}
	|	a:hover {
	|		color: #006699; text-decoration: underline;}
	|	p {
	|		margin-top: 7px;}
	|	img {border: 0px;}
	|</style>
	|<body>";
	
	СостояниеВыполненияЗадачи = РегистрыСведений.ЗадачиДляВыполнения.СостояниеВыполненияЗадачи(Задача.Ссылка);
	
	// Состояние процесса и результат выполнения задачи
	Если Задача.СостояниеБизнесПроцесса = Перечисления.СостоянияБизнесПроцессов.Прерван Тогда
		
		ПричинаПрерывания = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
			Задача.Ссылка, "БизнесПроцесс.ПричинаПрерывания");
		
		Если ПустаяСтрока(ПричинаПрерывания) Тогда
			ПричинаПрерывания = НСтр("ru = 'Задача прервана'");	
		Иначе			
			ПричинаПрерывания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Задача прервана: %1'"),
			ПричинаПрерывания);
		КонецЕсли;
		
		HTMLТекст = HTMLТекст + "<table bgcolor=#F0F0F0><tr>";
		HTMLТекст = HTMLТекст + "<td width=20>";
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(
			HTMLТекст, БиблиотекаКартинок.ЗнакПрерванПроцесс, "ПоказатьПричинуПрерыванияПроцесса");
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "<td>";
		HTMLТекст = HTMLТекст + СтрШаблон(
			"<A href=ПоказатьПричинуПрерыванияПроцесса>%1</A>",
			РаботаС_HTML.ЗаменитьСпецСимволыHTML(ПричинаПрерывания));
		HTMLТекст = HTMLТекст + "</td>";
		
		HTMLТекст = HTMLТекст + "</tr></table>";
		
		HTMLТекст = HTMLТекст + "<p>";
		
	ИначеЕсли Задача.СостояниеБизнесПроцесса = Перечисления.СостоянияБизнесПроцессов.Остановлен Тогда
		
		HTMLТекст = HTMLТекст + "<table bgcolor=#F0F0F0><tr>";
		HTMLТекст = HTMLТекст + "<td width=20> ";
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(HTMLТекст, БиблиотекаКартинок.ЗнакПауза);
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "<td>";
		ОбзорОбъектовКлиентСервер.ДобавитьЗначение(HTMLТекст, НСтр("ru = 'Задача остановлена'"), "");
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "</tr></table>";
		
		HTMLТекст = HTMLТекст + "<p>";
		
	ИначеЕсли СостояниеВыполненияЗадачи.СостояниеВыполнения = Перечисления.СостоянияЗадачДляВыполнения.ВыполнениеОтменено Тогда
		
		HTMLТекст = HTMLТекст + "<table bgcolor=#F0F0F0><tr>";
		HTMLТекст = HTMLТекст + "<td width=20>";
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(
			HTMLТекст, БиблиотекаКартинок.Предупреждение, "ПоказатьПричинуОтменыВыполнения");
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "<td>";
		
		ПричинаОтменыВыполненияHTML = "";
		ОбзорОбъектовКлиентСервер.ДобавитьЗначение(
			ПричинаОтменыВыполненияHTML,
			СостояниеВыполненияЗадачи.ПричинаОтменыВыполнения,
			"FF0000");
		
		HTMLТекст = HTMLТекст + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			"<A href=ПоказатьПричинуОтменыВыполнения>%1</A>", ПричинаОтменыВыполненияHTML);
		
		HTMLТекст = HTMLТекст + "</td>";
		
		HTMLТекст = HTMLТекст + "</tr></table>";
		
		HTMLТекст = HTMLТекст + "<p>";
		
	ИначеЕсли СостояниеВыполненияЗадачи.СостояниеВыполнения = Перечисления.СостоянияЗадачДляВыполнения.ГотоваКВыполнению Тогда
		
		HTMLТекст = HTMLТекст + "<table bgcolor=#F0F0F0><tr>";
		HTMLТекст = HTMLТекст + "<td width=20> ";
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(HTMLТекст, БиблиотекаКартинок.СтартБизнесПроцесса);
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "<td>";
		ОбзорОбъектовКлиентСервер.ДобавитьЗначение(HTMLТекст,
			НСтр("ru = 'Задача находится в очереди для выполнения. Выполнение задачи произойдет автоматически в ближайшее время.'"), "");
		HTMLТекст = HTMLТекст + "</td>";
		HTMLТекст = HTMLТекст + "</tr></table>";
		
		HTMLТекст = HTMLТекст + "<p>";
		
	ИначеЕсли Задача.Выполнена Тогда
		
		МетаданныеПроцесса = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Задача.БизнесПроцесс);
		ПредставлениеРезультатаЗадачи = МетаданныеПроцесса.ПредставлениеРезультатаЗадачи(Задача);
		
		РезультатВыполненияЗадачи = РегистрыСведений.
			РезультатыВыполненияПроцессовИЗадач.РезультатВыполненияПоОбъекту(Задача.Ссылка);
			
		Если РезультатВыполненияЗадачи = 
				Перечисления.ВариантыВыполненияПроцессовИЗадач.Положительно Тогда
				
			Картинка = БиблиотекаКартинок.РезультатВыполненияПроцессовИЗадач_Положительный;
			ЦветТекста = "#008000";
		ИначеЕсли РезультатВыполненияЗадачи = 
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Отрицательно Тогда
			
			Картинка = БиблиотекаКартинок.РезультатВыполненияПроцессовИЗадач_Отрицательный;
			ЦветТекста = "#B22222";
		ИначеЕсли РезультатВыполненияЗадачи = Перечисления.
			ВариантыВыполненияПроцессовИЗадач.ПоложительноСЗамечаниями Тогда
			
			Картинка = БиблиотекаКартинок.РезультатВыполненияПроцессовИЗадач_ПоложительныйСЗамечаниями;
			ЦветТекста = "#008000";
		Иначе
			Картинка = БиблиотекаКартинок.РезультатВыполненияПроцессовИЗадач;
			ЦветТекста = "";
		КонецЕсли;
		
		HTMLТекст = HTMLТекст + "<table bgcolor=#F0F0F0><tr>";
		
		HTMLТекст = HTMLТекст + "<td width=20>";
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(HTMLТекст, Картинка);
		HTMLТекст = HTMLТекст + "</td>";
		
		HTMLТекст = HTMLТекст + "<td>";
		ОбзорОбъектовКлиентСервер.ДобавитьЗначение(HTMLТекст, ПредставлениеРезультатаЗадачи, ЦветТекста);
		HTMLТекст = HTMLТекст + "</td>";
		
		HTMLТекст = HTMLТекст + "</tr></table>";
		
		HTMLТекст = HTMLТекст + "<p>";
		
	КонецЕсли;
	
	HTMLТекст = HTMLТекст + "<table><tr>";
	HTMLТекст = HTMLТекст + "<td>";
	
	// Наименование
	HTMLТекст = HTMLТекст + "<B>";
	ОбзорОбъектовКлиентСервер.ДобавитьЗначение(HTMLТекст, Задача.Наименование, "");
	HTMLТекст = HTMLТекст + "<br>";
	HTMLТекст = HTMLТекст + "</B>";
	
	//было
	//ПредметДокумент = ПолучитьОсновнойПредметДокумент(Задача.Предметы);
	//стало
	ПредметДокумент = ОбзорЗадачВызовСервера.ПолучитьОсновнойПредметДокумент(Задача.Предметы);
	
	Если ЗначениеЗаполнено(ПредметДокумент) Тогда
		                //
		ОбзорПредмета = ОбзорЗадачВызовСервера.ПолучитьОбзорПредметаЗадачи(ПредметДокумент);
		Если Не ПустаяСтрока(ОбзорПредмета) Тогда
			HTMLТекст = HTMLТекст + "<p>" + ОбзорПредмета + "</p>";
		КонецЕсли;	
			
	КонецЕсли;		
	
	// Описание
	Если ЗначениеЗаполнено(Задача.Описание) Тогда
		HTMLТекст = HTMLТекст + "<p>";
		
		ОписаниеЗадачиHTML = "";
		ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ОписаниеЗадачиHTML, "", Задача.Описание);
		
		ОписаниеЗадачиHTML = СтрЗаменить(ОписаниеЗадачиHTML, Символы.Таб, "&nbsp;&nbsp;&nbsp;");
		ОписаниеЗадачиHTML = СтрЗаменить(ОписаниеЗадачиHTML, Символы.ПС, "<br>");
		
		HTMLТекст = HTMLТекст + ОписаниеЗадачиHTML;
		
	КонецЕсли;
	
	// Важность
	Если Задача.Важность = Перечисления.ВариантыВажностиЗадачи.Высокая Тогда
		Важность = НСтр("ru = 'Высокая'");
	ИначеЕсли Задача.Важность = Перечисления.ВариантыВажностиЗадачи.Обычная Тогда
		Важность = НСтр("ru = 'Обычная'");
	ИначеЕсли Задача.Важность = Перечисления.ВариантыВажностиЗадачи.Низкая Тогда
		Важность = НСтр("ru = 'Низкая'");
	КонецЕсли;
	HTMLТекст = HTMLТекст + "<p>";
	ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(HTMLТекст, НСтр("ru = 'Важность: '"), Важность);
	
	// Исполнитель
	HTMLТекст = HTMLТекст + "<p>";
	ОбзорОбъектовКлиентСервер.ДобавитьПодпись(HTMLТекст, НСтр("ru = 'Кому:'"));
	
	ТекущийПользователь = ПользователиКлиентСервер.ТекущийПользователь();
	ИсполнителиЗадачПользователя = БизнесПроцессыИЗадачиСервер.
		ИсполнителиЗадачПользователя(ТекущийПользователь);
		
	// Признак ролевой/делегированной задачи
	ЗадачаДелегированаТекущемуПользователю = 
		РегистрыСведений.ИсполнителиРолейИДелегаты.ИсполнительЯвляетсяДелегатом(
			Задача.ТекущийИсполнитель,
			ТекущийПользователь,
			"ПроцессыИЗадачи");
	
	Если ЗадачаДелегированаТекущемуПользователю Тогда
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(HTMLТекст, БиблиотекаКартинок.ДелегированнаяЗадача);
		HTMLТекст = HTMLТекст + " ";
	ИначеЕсли ТипЗнч(Задача.ТекущийИсполнитель) = Тип("СправочникСсылка.ПолныеРоли") Тогда
		ОбзорОбъектовКлиентСервер.ДобавитьКартинку(HTMLТекст, БиблиотекаКартинок.РолеваяЗадача);
		HTMLТекст = HTMLТекст + " ";
	КонецЕсли;
	
	Если НЕ Задача.Исполнитель.Пустая() Тогда
		ОбзорОбъектовКлиентСервер.ДобавитьЗначение(HTMLТекст, Задача.Исполнитель, "");
	Иначе
		ИсполнительСтрокой = Строка(Задача.РольИсполнителя);
		HTMLТекст = HTMLТекст + СтрШаблон(
			"<A href=v8doc:%1>%2</A>",
			ПолучитьНавигационнуюСсылку(Задача.РольИсполнителя),
			РаботаС_HTML.ЗаменитьСпецСимволыHTML(Строка(ИсполнительСтрокой)));
	КонецЕсли;
	
	HTMLТекст = HTMLТекст + "<br>";
	
	// Срок
	Если ЗначениеЗаполнено(Задача.СрокИсполнения) Тогда
		ОбзорОбъектовКлиентСервер.ДобавитьПодпись(HTMLТекст, НСтр("ru = 'Срок:'"));
		ФормаДаты = ?(ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"),
			"ДФ='dd.MM.yyyy HH:mm'", "ДФ='dd.MM.yyyy'");
			
		Если ТипЗнч(Задача.БизнесПроцесс) <> 
			Тип("БизнесПроцессСсылка.РешениеВопросовВыполненияЗадач")
			И Не Задача.Выполнена
			И ПолучитьФункциональнуюОпцию("ВестиУчетПереносовСроковЗадач") Тогда
			
			HTMLТекст = HTMLТекст + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				"<A href=%1> %2</A>",
				"ИзменитьСрокВыполнения",
				Формат(Задача.СрокИсполнения, ФормаДаты));
		Иначе
			HTMLТекст = HTMLТекст + " " + Формат(Задача.СрокИсполнения, ФормаДаты);
		КонецЕсли;
			
		HTMLТекст = HTMLТекст + "<br>";
	КонецЕсли;
	
	// Автор
	ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(HTMLТекст, НСтр("ru = 'Автор:'"), Задача.Автор);
	
	// Контроль
	Если ПолучитьФункциональнуюОпцию("ИспользоватьКонтрольОбъектов") Тогда
		Контролеры = РаботаСБизнесПроцессамиВызовСервера.КонтролерыЗадачи(Задача, Не Задача.Выполнена);
		
		КонтролерыСтрокой = СтрСоединить(Контролеры, ", ");
		
		Если Задача.Выполнена Тогда
			ПодписьКонтролера = НСтр("ru = 'Контролеры: '");
		Иначе
			КоличествоКонтролеров = Контролеры.Количество();
			Если КоличествоКонтролеров = 1 Тогда
				ПодписьКонтролера = НСтр("ru = 'Контролирует: '");
			ИначеЕсли КоличествоКонтролеров > 1 Тогда
				ПодписьКонтролера = НСтр("ru = 'Контролируют: '");
			КонецЕсли;
		КонецЕсли;
		
		ОбзорОбъектовКлиентСервер.ДобавитьПодпись(HTMLТекст, ПодписьКонтролера);
		HTMLТекст = HTMLТекст + СтрШаблон(
			"<A href=ОткрытьКарточкуКонтроля>%1</A>", 
			РаботаС_HTML.ЗаменитьСпецСимволыHTML(КонтролерыСтрокой));
		HTMLТекст = HTMLТекст + "<br>";
		
	КонецЕсли;
	
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачи()) Прерывание
////////////////////////////////////////////////////////////////////////////////////
	// История выполнения
	HTMLТекст = HTMLТекст + ПолучитьИсториюВыполненияHTML(Задача);
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачи()) Продолжение
////////////////////////////////////////////////////////////////////////////////////	
	HTMLТекст = HTMLТекст + "</td>";
	HTMLТекст = HTMLТекст + "</tr></table>";
	HTMLТекст = HTMLТекст + "</body></html>";
	Возврат HTMLТекст;
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачи()) Конец
////////////////////////////////////////////////////////////////////////////////////
//Романов И.В. 15.11.2019 10:22:02
////////////////////////////////////////////////////////////////////////////////////
	
КонецФункции

// Возвращает текст HTML для показа обзора задачи
//
// Параметры:
//   РеквизитыЗадачи - Структура - реквизиты задачи:
//      Ссылка
//      БизнесПроцесс
//      БизнесПроцессВедущаяЗадача
//      Описание
//      Наименование
//      ТочкаМаршрута
//      Выполнена
//      РезультатВыполнения
//      Исполнитель
//      РольИсполнителя
//      НомерИтерацииЗадачи
//
// Возвращаемое значение:
//   Строка - текст HTML
//
Функция ПолучитьОбзорЗадачиДляСпискаЗадачиМне(РеквизитыЗадачи) Экспорт
////////////////////////////////////////////////////////////////////////////////////
//Романов И.В. 20.11.2019 10:17:37
	// Было
	//HTMLТекст = "";
	//
	//Возврат HTMLТекст;
	ИсторияВыполнения = "";
	ТекущийПользователь = ПользователиКлиентСервер.ТекущийПользователь();
	
	СтрокаПолноеОписаниеЗадачи = РеквизитыЗадачи.Описание;
	
	Если ЗначениеЗаполнено(РеквизитыЗадачи.БизнесПроцесс) Тогда
		ИсторияВыполнения = ПолучитьИсториюВыполненияHTML(РеквизитыЗадачи.Ссылка);
		
		Если Не ПустаяСтрока(ИсторияВыполнения) Тогда
			СтрокаПолноеОписаниеЗадачи = 
				СтрокаПолноеОписаниеЗадачи
				+ ?(ЗначениеЗаполнено(СтрокаПолноеОписаниеЗадачи),
					"" + Символы.ПС + Символы.ПС, "");
		КонецЕсли;
	КонецЕсли;

	ТекстHTML = "<html>
	 |<head>  	  	
	 | <style>
	 |  h1 {	 
	 |   font-size: 10pt;	 
	 |	 font-family:Arial; 
	 |  } 
	 |  p {
	 |   font-size: 10pt;	 
	 |	 font-family:Arial; 
	 |  }
	 |	BODY {
	 |	 margin: 0px; 
	 |	 padding: 3px;
	 |   font-size: 10pt;
	 |	 font-family:Arial;
	 |	}
	 | </style>	 
	 |</head>
	 |<body scroll=auto>";
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачиДляСпискаЗадачиМне()) Начало
////////////////////////////////////////////////////////////////////////////////////
	// Отображаем Кому в мини-карточке, если задача делегирована либо назначена роли.
	ОписаниеИсполнителя = "";
	Если ЗначениеЗаполнено(РеквизитыЗадачи.Исполнитель) Тогда
		Если РеквизитыЗадачи.Исполнитель <> ТекущийПользователь Тогда
			ОписаниеИсполнителя = Строка(РеквизитыЗадачи.Исполнитель);
		КонецЕсли;
	Иначе
		ОписаниеИсполнителя = Строка(РеквизитыЗадачи.РольИсполнителя);
	КонецЕсли;
	
	ТекстHTML = ТекстHTML + "<h1>";
	НаименованиеЗадачиHTML = "";
	ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(НаименованиеЗадачиHTML, "", РеквизитыЗадачи.Наименование);
	НаименованиеЗадачиHTML = СтрЗаменить(НаименованиеЗадачиHTML, Символы.Таб, "&nbsp;&nbsp;&nbsp;");
	НаименованиеЗадачиHTML = СтрЗаменить(НаименованиеЗадачиHTML, Символы.ПС, "<br>");
	ТекстHTML = ТекстHTML + НаименованиеЗадачиHTML;
	ТекстHTML = ТекстHTML + "</h1>";
	
	Если ЗначениеЗаполнено(ОписаниеИсполнителя) Тогда
		ТекстHTML = ТекстHTML + "<p>";
		ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСТР("ru = 'Кому: '"), ОписаниеИсполнителя);
		ТекстHTML = ТекстHTML + "</p>";
	КонецЕсли;
	
	Если РеквизитыЗадачи.НомерИтерацииЗадачи > 0 Тогда
		ТекстHTML = ТекстHTML + "<p>";
		ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ТекстHTML, НСТР("ru = 'Цикл: '"), РеквизитыЗадачи.НомерИтерацииЗадачи);
		ТекстHTML = ТекстHTML + "</p>";
	КонецЕсли;
	
	Если РеквизитыЗадачи.Свойство("ПредметДокумент") Тогда
		//было
		//ОбзорПредмета = ПолучитьОбзорПредметаЗадачи(РеквизитыЗадачи.ПредметДокумент);
		ОбзорПредмета = ОбзорЗадачВызовСервера.ПолучитьОбзорПредметаЗадачи(РеквизитыЗадачи.ПредметДокумент);
		Если Не ПустаяСтрока(ОбзорПредмета) Тогда
			ТекстHTML = ТекстHTML + "<p>" + ОбзорПредмета + "</p>";
		КонецЕсли;	
	КонецЕсли;	
	
	Если ЗначениеЗаполнено(СтрокаПолноеОписаниеЗадачи) Тогда
		ПолноеОписаниеЗадачиHTML = "";
		ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ПолноеОписаниеЗадачиHTML, "", СтрокаПолноеОписаниеЗадачи);
		ПолноеОписаниеЗадачиHTML = СтрЗаменить(ПолноеОписаниеЗадачиHTML, Символы.Таб, "&nbsp;&nbsp;&nbsp;");
		ПолноеОписаниеЗадачиHTML = СтрЗаменить(ПолноеОписаниеЗадачиHTML, Символы.ПС, "<br>");
		ТекстHTML = ТекстHTML + "<p>" + ПолноеОписаниеЗадачиHTML + "</p>";
	Иначе
		//ТекстHTML = ТекстHTML + "<p><FONT color=""#C0C0C0"">"
		//	+ НСтр("ru = 'У задачи нет описания.'") + "</FONT></p>";
	КонецЕсли;
////////////////////////////////////////////////////////////////////////////////////
// КопиПаста(ОбзорЗадачВызовСервера.ПолучитьОбзорЗадачиДляСпискаЗадачиМне()) Конец
////////////////////////////////////////////////////////////////////////////////////	
	ТекстHTML = ТекстHTML + ИсторияВыполнения +"</body></html>";
	
	Возврат ТекстHTML;

//Романов И.В. 20.11.2019 10:30:02
////////////////////////////////////////////////////////////////////////////////////
КонецФункции

// Возвращает текст HTML для показа важных реквизитов предмета задачи (если предмет один, и это документ)
//
// Параметры:
//   ПредметДокумент - ссылка на предмет - документ
//
// Возвращаемое значение:
//   Строка - текст HTML
//
Функция ПолучитьОбзорПредметаЗадачи(ПредметДокумент) Экспорт
	
	HTMLТекст = "";
	
	Возврат HTMLТекст;

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

//Романов И.В. 15.11.2019 11:45:45
Функция ПолучитьИсториюВыполненияHTML(Задача)
	ТЗПодчБизнесПроцессы = Новый ТаблицаЗначений;
	ТЗПодчБизнесПроцессы.Колонки.Добавить("БизнесПроцесс");
	ТЗПодчБизнесПроцессы.Колонки.Добавить("ДатаДляСортировки");

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

Функция ПреобразоватьИсторияВыполненияHTML(БизнесПроцесс)
	Если БизнесПроцесс.Завершен Тогда
		СтатусБПСтрокой = "Процесс: ";
	Иначе
		СтатусБПСтрокой = "Процесс выполняется: ";
	КонецЕсли;
	//Заголовок
	ИсторияВыполненияHTML = "<hr><p><B>" +	СтрШаблон("<A href=v8doc:%1>%2</A>",
							ПолучитьНавигационнуюСсылку(БизнесПроцесс),
							РаботаС_HTML.ЗаменитьСпецСимволыHTML(СтатусБПСтрокой+Строка(БизнесПроцесс)))+ "</B><p>";
	//Содержание						
	ИсторияВыполнения = РегистрыСведений.ИсторияВыполненияЗадач.ИсторияПоБизнесПроцессу(БизнесПроцесс);
	//Получаем задачи по процессу
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЗадачаИсполнителя.Ссылка КАК Ссылка
	|ИЗ
	|	Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
	|ГДЕ
	|	ЗадачаИсполнителя.БизнесПроцесс = &БизнесПроцесс");
	Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
	
	Если ЗначениеЗаполнено(ИсторияВыполнения) Тогда
		ВыборкаЗадач = Запрос.Выполнить().Выбрать();
		//Проставим ссылки на задачи в историю
		Пока ВыборкаЗадач.Следующий() Цикл
			ТекстПоискаЗамены = Формат(ВыборкаЗадач.Ссылка.ДатаИсполнения,"ДФ='dd.MM.yyyy HH:mm'")+", "+
								СокрЛП(ВыборкаЗадач.Ссылка.Исполнитель);
			ИсторияВыполнения = СтрЗаменить(ИсторияВыполнения, ТекстПоискаЗамены,
							СтрШаблон("<A href=v8doc:%1>%2</A>",
							ПолучитьНавигационнуюСсылку(ВыборкаЗадач.Ссылка),
							ТекстПоискаЗамены));
		КонецЦикла;
		ИсторияВыполненияHTML = ИсторияВыполненияHTML +	ИсторияВыполнения;
	Иначе
		//Нет истории, но процесс то есть, добавим рога
		ИсторияВыполненияHTML = ИсторияВыполненияHTML +	"<..>";
	КонецЕсли;
	ИсторияВыполненияHTML = СтрЗаменить(ИсторияВыполненияHTML, Символы.Таб, "&nbsp;&nbsp;&nbsp;");
	ИсторияВыполненияHTML = СтрЗаменить(ИсторияВыполненияHTML, Символы.ПС, "<br>");

	Возврат ИсторияВыполненияHTML;
КонецФункции
	
Функция ПолучитьГлавнуюВедущуюЗадачу(ИскомыйПроцессСсылка)
	врИскомыйПроцесс = ИскомыйПроцессСсылка.ПолучитьОбъект();
	Если ЗначениеЗаполнено(врИскомыйПроцесс.ВедущаяЗадача) Тогда
		Возврат врИскомыйПроцесс.ВедущаяЗадача;
	КонецЕсли;
	Попытка
		Если ЗначениеЗаполнено(врИскомыйПроцесс.ГлавнаяЗадача) Тогда
			Возврат врИскомыйПроцесс.ГлавнаяЗадача;
		КонецЕсли;
	Исключение
	КонецПопытки;
	Возврат Неопределено;
КонецФункции

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

Процедура ЗаполнитьДеревоБПДетально(ТЗПодчинБП, ТЗПодчБизнесПроцессы)
	Для Каждого стрРез Из ТЗПодчинБП Цикл
		ЗаполнитьЗначенияСвойств(ТЗПодчБизнесПроцессы.Добавить(), стрРез);
		ТЗПодчинБП2 = ПолучитьПодчиненныеБизнесПроцесы(стрРез.БизнесПроцесс);
		Если ТЗПодчинБП2.Количество()>0 Тогда
			ЗаполнитьДеревоБПДетально(ТЗПодчинБП2, ТЗПодчБизнесПроцессы);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

//Романов И.В. 15.11.2019 11:45:53
////////////////////////////////////////////////////////////////////////////////////

#КонецОбласти

 

Писалось на конфе: Документооборот 8 КОРП, редакция 2.1 (2.1.14.4), платформа 8.3.13.1690

UPD 2019/11/20 Исправил ошибку пропадания бизнес-процессов из истории
                             Исправил разные шрифты в форме "ЗадачиМне"

UPD 2019/11/22 Исправил ошибку задвоения бизнес-процессов в истории

UPD 2020/01/30 Исправил ошибку В историю процесса не попадают задачи "Рассмотреть вопрос", "Ознакомиться с ответом на вопрос".

UPD 2020/01/31 Добавил улучшения:

+ для бизнес-процессов без истории выводим "<..>"
+ если процесс не завершен то пишем "Процесс выполняется:"
+ вывод заголовков бизнес-процессов в виде ссылок
+ вывод задач истории в виде ссылок(боольше ссылок, богу ссылок)

Документооборот История Задачи бизнес-процесс

См. также

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    5701    14    5    

24

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3947    12    0    

30

Адаптация типовых решений Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    5125    dimanich70    15    

21

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    5666    dimanich70    9    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. mifka186 9 20.11.19 14:40 Сейчас в теме
Картинка с результатом была бы очень уместна.
2. rmIvanT 71 20.11.19 14:43 Сейчас в теме
(1) к публикации прикреплён всего один скриншот с результатом работы кода, поправил статью для большей ясности
3. xKEEPERx 3 08.12.19 02:33 Сейчас в теме
Спасибо за доработку!
А цвет текста по результатам выполнения задачи не должен меняться?

Выполненные под задачи не выводятся?
4. rmIvanT 71 08.12.19 02:39 Сейчас в теме
(3)Цвет не меняется, заказа такого не было.
по идее должно быть результат вывод всех задач, всех поцессов.
если что-то не выводится, пишите поправим
5. rmIvanT 71 30.01.20 11:19 Сейчас в теме
(3)
А цвет текста по результатам выполнения задачи не должен меняться?


Можете подробнее описать, какой текст, в какие цвета, и по чьим результатам. покрасим, но это не точно.
8. xKEEPERx 3 12.02.20 13:27 Сейчас в теме
(5) Если Согласовано - жирный Зелёный, если не Согласовано - жирный красный
Аналогично Подписано/Не подписано, Утверждено/Не утверждено
9. rmIvanT 71 13.02.20 09:04 Сейчас в теме
(8) Сейчас всё ссылки, их сложно покрасить по разному
6. awe007 30.01.20 11:52 Сейчас в теме
В историю процесса не попадают задачи "Рассмотреть вопрос", "Ознакомиться с ответом на вопрос". Это специально так сделано:
7. rmIvanT 71 30.01.20 16:34 Сейчас в теме
10. Mellentin 26.02.20 08:05 Сейчас в теме
Спасибо за статью, очень полезная вещь!
11. solaru 72 17.06.20 18:29 Сейчас в теме
Работает, для благодарности можно выложить расширение за $M
12. rmIvanT 71 19.06.20 08:33 Сейчас в теме
(11) В виде благодарности принимаются лайки(+) и хвалебные комментарии ;-)
на расширение нет ни времени, ни сил, ни желания. К тому же маловато функционала для расширения.
13. Vasvas05 27 15.09.20 20:24 Сейчас в теме
(12
)Функция ПолучитьГлавнуюВедущуюЗадачу(ИскомыйПроцессСсылка)
	врИскомыйПроцесс = ИскомыйПроцессСсылка.ПолучитьОбъект();
	Если ЗначениеЗаполнено(врИскомыйПроцесс.ВедущаяЗадача) Тогда
		Возврат врИскомыйПроцесс.ВедущаяЗадача;
	КонецЕсли;
	Попытка
		Если ЗначениеЗаполнено(врИскомыйПроцесс.ГлавнаяЗадача) Тогда
			Возврат врИскомыйПроцесс.ГлавнаяЗадача;
		КонецЕсли;
	Исключение
	КонецПопытки;
	Возврат Неопределено;
КонецФункции
Показать


врИскомыйПроцесс = ИскомыйПроцессСсылка.ПолучитьОбъект();
почему сразу ИскомыйПроцессСсылка.ВедущаяЗадача не написать?
14. rmIvanT 71 16.09.20 20:29 Сейчас в теме
(13) точно не помню, видимо в каких-то случаях не работало.
15. ElisGrey 22.10.20 10:53 Сейчас в теме
(14)Добрый день!
Хотелось бы узнать, как сделать видимой задачу, которая находится на выполнении/согласовании и тд ?
У меня отображается пустота, если задача не выполнена
16. rmIvanT 71 22.10.20 11:05 Сейчас в теме
(15) Видимо нет истории, пока задача не будет завершена/выполнена. Нужно подумать, над Вашим предложением, подумаю когда будет время.
17. ElisGrey 22.10.20 13:20 Сейчас в теме
(16) спасибо большое
Хотела ещё уточнить, у Вас: реквизиты завершён, датаначала и датазавершения в Функции ПолучитьПодчиненныеБизнесПроцессы находятся в регистре сведений дочерниеБизнесПроцессы?
18. rmIvanT 71 22.10.20 13:35 Сейчас в теме
(17) пока не за что, учитывая мою текущую занятость, решение может появится не скоро :-(
Нет это реквизиты процесса в регистре хранится ссылка на процесс, а реквизиты берутся из процесса.
19. ElisGrey 22.10.20 13:39 Сейчас в теме
(18) благодарю Вас, поняла
Попробую ещё сама разобраться, если доработка будет, то дополню)
20. ElisGrey 29.10.20 13:17 Сейчас в теме
(18)Немного изменила фнк
Может кому-то полезно будет)

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

	ИсторияВыполненияHTML = СтрЗаменить(ИсторияВыполненияHTML, Символы.Таб, "   ");
	ИсторияВыполненияHTML = СтрЗаменить(ИсторияВыполненияHTML, Символы.ПС, "");

	Возврат ИсторияВыполненияHTML; 

КонецФункции
Показать
TigerS74; Svet_Serg; +2 Ответить
26. TigerS74 16.09.22 09:23 Сейчас в теме
(20)
ИсторияВыполнения = РегистрыСведений.ИсторияВыполненияЗадач.ДН_ИсторияПоБизнесПроцессу(БизнесПроцесс)

нет ДН_История....

По первой галочке, что Задача выполнена, "✅ Задача выполнена "
как сделать, что бы она зелёная была в 1С-ке ? у меня чёрная (
21. ElisGrey 29.10.20 13:19 Сейчас в теме
(18) Единственный вопрос остался: как добавить текущего исполнителя задачи, если задача отправлена нескольким пользователям одновременно)
22. Svet_Serg 26.02.21 10:27 Сейчас в теме
Огромное спасибо!
Не планируете ли вывести реквизит "Содержание" из основного предмета? Это было бы вообще огонь!
23. rmIvanT 71 26.02.21 10:39 Сейчас в теме
24. user1018141 03.03.21 23:49 Сейчас в теме
Отлично решение Спасибо!
Может кто-то знает как, в историю выполнения вывести выбранное значение доп. реквизита в задаче?
Пример : 03.03.2021 00:00, ФИО. Задача выполнена. [ЗначениеДопРеквизита]
25. TigerS74 16.09.22 08:55 Сейчас в теме
Кто подскажет, как сгруппировать эту полученную полную историю согласования, и по умолчанию её свернуть. Что бы пользователь сам, если нужно мог её раскрыть ?
27. ketr 128 10.11.22 11:38 Сейчас в теме
отлично, я бы ещё вот это добавил, чтобы таблица была поменьше в модуле ПолучитьОбзорЗадачиДляСпискаЗадачиМне:

| table {
| width: 100%; //таблица становится уже
| font-family: Arial;
| font-size: 8pt; //шрифт в таблице
| border: 0px solid;
Прикрепленные файлы:
28. Kontakt 109 10.02.23 07:35 Сейчас в теме
Есть возможность выложить в историю вложенные файлы, которые прикреплены при выполнение задачи?
29. Tatyana_012345 24 18.01.24 15:24 Сейчас в теме
Если много уровней не работает
Оставьте свое сообщение