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