Предлагаемое решение выполнено на версии 1С:Документооборот 2.1.27.1
Список процессов разделен на группы:
- Рекомендованные (назначенные для документа)
- Произвольные (без шаблонов)
- Общие (все остальные, доступные пользователю)
Есть 2 места, которые нужно учесть при внесении изменений:
- Работа непосредственно в 1С:Документооборот
- Работа с 1С:Документооборот через бесшовную интеграцию (проверено на интеграции с ЗУП и УПП)
1. Работа в 1С:Документооборот
Для исправления списка предлагаю группировку шаблонов процессов по логике разработчиков, но с явным разделением по настройкам (назначенные для запуска по документу, произвольные и все остальные).
Чтобы вывести группировку нужно в общий модуль ПомощникОтправить внести изменения.
Добавить Новую процедуру и заменить вызов типовой процедуры ДобавитьВДеревоОсновныеВариантыСозданияПроцесса на новую процедуру
//ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник);
рвк_ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник);
Процедура рвк_ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник)
УстановитьПривилегированныйРежим(Истина);
// Формируем общий список вариантов, добавляемых в корень дерева, из:
// шаблонов по умолчанию, общих и рекомендуемых шаблонов.
ВариантыСозданияПроцессаТ = Новый ТаблицаЗначений;
ВариантыСозданияПроцессаТ.Колонки.Добавить("Представление");
ВариантыСозданияПроцессаТ.Колонки.Добавить("Значение");
ВариантыСозданияПроцессаТ.Колонки.Добавить("Группа");
ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);
Для Каждого КлючЗначение Из Помощник.РекомендуемыеВариантыСозданияПроцессов Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
Строка = ВариантыСозданияПроцессаТ.Добавить();
Строка.Значение = КлючЗначение.Ключ;
Строка.Представление = Строка(КлючЗначение.Ключ);
Строка.Группа = "!Рекомендуемые";
КонецЦикла;
Для Каждого КлючЗначение Из Помощник.ОбщиеВариантыСозданияПроцессов Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
Строка = ВариантыСозданияПроцессаТ.Добавить();
Строка.Значение = КлючЗначение.Ключ;
Строка.Представление = Строка(КлючЗначение.Ключ);
Строка.Группа = "Общие";
КонецЦикла;
Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
КлючЗначение.Ключ, Помощник);
Строка = ВариантыСозданияПроцессаТ.Добавить();
Строка.Значение = КлючЗначение.Ключ;
Строка.Представление = Представление;
Строка.Группа = "Произвольные";
КонецЦикла;
ВариантыСозданияПроцессаТ.Сортировать("Группа, Представление");
Группа = "";
Для Каждого ВариантСозданияПроцесса Из ВариантыСозданияПроцессаТ Цикл
Если Группа <> ВариантСозданияПроцесса.Группа Тогда
Группа = ВариантСозданияПроцесса.Группа;
СтрокаГруппы = Помощник.ДеревоВариантов.Строки.Добавить();
СтрокаГруппы.Представление = Группа;
СтрокаГруппы.Вариант = Группа;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаГруппы) Тогда
СтрокаВарианта = СтрокаГруппы.Строки.Добавить();
Иначе
СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
КонецЕсли;
СтрокаВарианта.Вариант = ВариантСозданияПроцесса.Значение;
СтрокаВарианта.Представление = ВариантСозданияПроцесса.Представление;
КонецЦикла;
КонецПроцедуры
2. Для изменения вывода в рамках бесшовной интеграции необходимо внести изменения в общий модуль ОбработкаЗапросовXDTOБизнесПроцессыИЗадачи в функцию ПолучитьДеревоШаблоновБизнесПроцессов
Есть один нюанс в реализации. При большом количестве процессов бесшовная интеграция не успевал формироваться список процессов за отведенное время и по таймауту отваливался. Поэтому в данном решении будут выводиться только Произвольные (без шаблона) и Рекомендованные процессы (назначенные для документа)
Полный текст функции ПолучитьДеревоШаблоновБизнесПроцессов ниже
// Получает дерево шаблонов бизнес-процессов, удовлетворяющих условиям отбора
//
// Параметры:
// Сообщение - ОбъектXDTO типа DMGetBusinessProcessTemplatesTreeRequest
// Возвращаемое значение:
// ОбъектXDTO типа DMGetBusinessProcessTemplatesTreeResponse
//
Функция ПолучитьДеревоШаблоновБизнесПроцессов(Сообщение) Экспорт
Ответ = СоздатьОбъектXDTO("DMGetBusinessProcessTemplatesTreeResponse");
ПредметБП = Неопределено;
Если Сообщение.Установлено("businessProcessTargetId") Тогда
ПредметБП = ОбработкаЗапросовXDTO.ПолучитьСсылкуПоObjectID(Сообщение.businessProcessTargetId);
КонецЕсли;
Объекты = Новый Массив;
Если ЗначениеЗаполнено(ПредметБП) Тогда
Объекты.Добавить(ПредметБП);
КонецЕсли;
ВариантыОтправки = ВариантыОтправки(Объекты, Ответ);
ГруппаРекомендованныеШаблоны = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeGroup");
ГруппаРекомендованныеШаблоны.name = НСтр("ru = 'Рекомендованные шаблоны'");
ГруппаРекомендованныеШаблоны.hint =
СформироватьСводкуПоГруппеЭлементов(ГруппаРекомендованныеШаблоны.name, Неопределено);
ОстальныеГруппыШаблонов = Новый Массив;
//rvk eryabova upd+ Было
//Для Каждого Строка Из ВариантыОтправки.Строки Цикл
// Если Строка.Недоступен = Истина Тогда
// ГруппаДругиеВарианты = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeGroup");
// ГруппаДругиеВарианты.name = Строка.Представление;
// ГруппаДругиеВарианты.hint = НСтр("ru = 'Группа шаблонов процессов.'");
// ГруппаДругиеВарианты.hintHTML = ПомощникОтправить.ОписаниеВарианта(Строка.Вариант);
// Для Каждого Подстрока Из Строка.Строки Цикл
// СтрокаШаблонов = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeElement");
// СтрокаШаблонов.name = Подстрока.Представление;
// СтрокаШаблонов.hint = СформироватьСводкуПоШаблону(Подстрока.Вариант);
// СтрокаШаблонов.hintHTML = ПомощникОтправить.ОписаниеВарианта(Подстрока.Вариант);
// СтрокаШаблонов.businessProcessType = ПолучитьТипПроцессаXDTOПоШаблону(Подстрока.Вариант);
//
// ОбъектШаблонXDTO = СоздатьОбъектXDTO("DMBusinessProcessTemplate");
// ОбъектШаблонXDTO.name = Подстрока.Представление;
// ОбъектШаблонXDTO.objectId = ОбработкаЗапросовXDTO.ПолучитьObjectIDПоСсылке(Подстрока.Вариант);
// СтрокаШаблонов.template = ОбъектШаблонXDTO;
//
// ГруппаДругиеВарианты.elements.Добавить(СтрокаШаблонов);
// КонецЦикла;
// ОстальныеГруппыШаблонов.Добавить(ГруппаДругиеВарианты);
// ИначеЕсли ТипЗнч(Строка.Вариант) <> Тип("Строка") Тогда
// СтрокаШаблонов = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeElement");
// СтрокаШаблонов.name = Строка.Представление;
// СтрокаШаблонов.hint = СформироватьСводкуПоШаблону(Строка.Вариант);
// СтрокаШаблонов.hintHTML = ПомощникОтправить.ОписаниеВарианта(Строка.Вариант);
// СтрокаШаблонов.businessProcessType = ПолучитьТипПроцессаXDTOПоШаблону(Строка.Вариант);
//
// ОбъектШаблонXDTO = СоздатьОбъектXDTO("DMBusinessProcessTemplate");
// ОбъектШаблонXDTO.name = Строка.Представление;
// ОбъектШаблонXDTO.objectId = ОбработкаЗапросовXDTO.ПолучитьObjectIDПоСсылке(Строка.Вариант);
// СтрокаШаблонов.template = ОбъектШаблонXDTO;
//
// ГруппаРекомендованныеШаблоны.elements.Добавить(СтрокаШаблонов);
// КонецЕсли;
//КонецЦикла;
//Ответ.businessProcessTemplatesTree.Добавить(ГруппаРекомендованныеШаблоны);
//Для Каждого Группа Из ОстальныеГруппыШаблонов Цикл
// Ответ.businessProcessTemplatesTree.Добавить(Группа);
//КонецЦикла;
////rvk eryabova upd- Было
////rvk eryabova upd+ Стало
Группа = "";
ГруппаВарианты = Неопределено;
Отбор = Новый Структура("Вариант","!Рекомендуемые");
Для Каждого Строка Из ВариантыОтправки.Строки Цикл
Если Строка.Уровень() = 0 и ТипЗнч(Строка.Вариант) = Тип("Строка") Тогда
Если Строка.Вариант = "!Рекомендуемые" или Строка.Вариант = "Произвольные" Тогда
Иначе
Если ПредметБП <> Неопределено Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ГруппаВарианты = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeGroup");
ГруппаВарианты.name = Строка.Представление;
ГруппаВарианты.hint = НСтр("ru = '"+ Строка.Представление + "'");
Ответ.businessProcessTemplatesTree.Добавить(ГруппаВарианты);
Для Каждого Подстрока Из Строка.Строки Цикл
СтрокаШаблонов = СоздатьОбъектXDTO("DMBusinessProcessTemplatesTreeElement");
СтрокаШаблонов.name = Подстрока.Представление;
СтрокаШаблонов.hint = СформироватьСводкуПоШаблону(Подстрока.Вариант);
СтрокаШаблонов.hintHTML = ПомощникОтправить.ОписаниеВарианта(Подстрока.Вариант);
СтрокаШаблонов.businessProcessType = ПолучитьТипПроцессаXDTOПоШаблону(Подстрока.Вариант);
ОбъектШаблонXDTO = СоздатьОбъектXDTO("DMBusinessProcessTemplate");
ОбъектШаблонXDTO.name = Подстрока.Представление;
ОбъектШаблонXDTO.objectId = ОбработкаЗапросовXDTO.ПолучитьObjectIDПоСсылке(Подстрока.Вариант);
СтрокаШаблонов.template = ОбъектШаблонXDTO;
Если ТипЗнч(ГруппаВарианты) = Тип("ОбъектXDTO") Тогда
ГруппаВарианты.elements.Добавить(СтрокаШаблонов);
КонецЕсли;
КонецЦикла;
//ГруппаДругиеВарианты.hintHTML = ПомощникОтправить.ОписаниеВарианта(Строка.Вариант);
КонецЕсли;
КонецЦикла;
////rvk eryabova upd- Стало
Возврат Ответ;
КонецФункции