Ограничение выбора вариантов шаблонов запуска процессов в Документообороте 2.1

Публикация № 1267546

Управление - Документоборот 2

документооборот

Столкнулся с проблемой, что Документооборот позволяет пользователю выбрать к запуску шаблоны процессов, которые напрямую не указаны в том виде документа, для которого производится запуск процесса.

 

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

Также шаблоны процессов, которые могут быть настроены пользователем, с припиской (Новое)

Я решил данный вопрос через расширение, добавил общий модуль "ПомощникОтправить" и сделал изменения в процедуре "ДобавитьВДеревоВариантыСозданияПроцессов":

 

&ИзменениеИКонтроль("ДобавитьВДеревоВариантыСозданияПроцессов")
Процедура НАДО_ДобавитьВДеревоВариантыСозданияПроцессов(Помощник)

	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьБизнесПроцессыИЗадачи") Тогда
		Возврат;
	КонецЕсли;

	// Очищаем основные варианты создания процессов.
	Помощник.ОсновныеВариантыСозданияПроцессов.Очистить();

	// Выполняем заполнение данных по предметам.
	ЗаполнитьДопустимыеТипыПредметовВПроцессах(Помощник);
	ЗаполнитьПредметыПроцесса(Помощник);

	Если ЗначениеЗаполнено(Помощник.ПредметыПроцесса)
		И Не ЕстьПредметыДопустимыеВПроцессах(Помощник) Тогда

		Возврат;
	КонецЕсли;

	ЗаполнитьДопустимыеТипыВариантовДляПредметов(Помощник);

	// Вначале определяем все возможные варианты создания процессов,
	// с учетом предметов процессов в помощнике.

#Вставка	
	ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
	Если Помощник.ПредметыПроцесса.Количество() = 0 
		Или Не ЗначениеЗаполнено(Помощник.ПредметыПроцесса[0].Ссылка) Тогда
		ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
		ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
		ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
	КонецЕсли; 
#КонецВставки
#Удаление	
	ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
	ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
	ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
	ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
#КонецУдаления
	
	// После добавляем в дерево основные варианты создания процессов,
	// в отдельной группе остальные доступные варианты.

	ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник);
	ДобавитьВДеревоОстальныеВариантыОтправки(Помощник);

КонецПроцедуры

 

В итоге окно для запуска процесса содержит только тот шаблон, который указан в данном типе документа:

p.s. Первый пост, строго не судите :)

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. gull22 87 22.07.20 09:35 Сейчас в теме
Понравилось с точки зрения облегчения мук пользователя. А можно оставить шаблоны процессов, которые могут быть настроены пользователем, с припиской (Новое) в отдельной папке (как на первом скриншоте в свернутой папке "Другие варианты"?
2. Maito 7 23.07.20 10:07 Сейчас в теме
(1)
Да, конечно возможно, нужно внести исправление в процедуру из статьи и еще две процедуры вывода:

&ИзменениеИКонтроль("ДобавитьВДеревоВариантыСозданияПроцессов")
Процедура НАДО_ДобавитьВДеревоВариантыСозданияПроцессов(Помощник)

	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьБизнесПроцессыИЗадачи") Тогда
		Возврат;
	КонецЕсли;

	// Очищаем основные варианты создания процессов.
	Помощник.ОсновныеВариантыСозданияПроцессов.Очистить();

	// Выполняем заполнение данных по предметам.
	ЗаполнитьДопустимыеТипыПредметовВПроцессах(Помощник);
	ЗаполнитьПредметыПроцесса(Помощник);

	Если ЗначениеЗаполнено(Помощник.ПредметыПроцесса)
		И Не ЕстьПредметыДопустимыеВПроцессах(Помощник) Тогда

		Возврат;
	КонецЕсли;

	ЗаполнитьДопустимыеТипыВариантовДляПредметов(Помощник);

	// Вначале определяем все возможные варианты создания процессов,
	// с учетом предметов процессов в помощнике.

	ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
#Удаление	
	ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
#КонецУдаления
	ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
#Удаление	
	ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
#КонецУдаления
	
	// После добавляем в дерево основные варианты создания процессов,
	// в отдельной группе остальные доступные варианты.

	ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник);
	ДобавитьВДеревоОстальныеВариантыОтправки(Помощник);

КонецПроцедуры

&ИзменениеИКонтроль("ДобавитьВДеревоОсновныеВариантыСозданияПроцесса")
Процедура НАДО_ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник)

	УстановитьПривилегированныйРежим(Истина);

	// Формируем общий список вариантов, добавляемых в корень дерева, из:
	// шаблонов по умолчанию, общих и рекомендуемых шаблонов.

	ВариантыСозданияПроцесса = Новый СписокЗначений;

	ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);

#Удаление	
	Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
		КлючЗначение.Ключ, Помощник);

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Представление);
	КонецЦикла;
#КонецУдаления

	Для Каждого КлючЗначение Из Помощник.ОбщиеВариантыСозданияПроцессов Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
	КонецЦикла;

	Для Каждого КлючЗначение Из Помощник.РекомендуемыеВариантыСозданияПроцессов Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
	КонецЦикла;

	ВариантыСозданияПроцесса.СортироватьПоПредставлению();

	Для Каждого ВариантСозданияПроцесса Из ВариантыСозданияПроцесса Цикл
		СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
		СтрокаВарианта.Вариант = ВариантСозданияПроцесса.Значение;
		СтрокаВарианта.Представление = ВариантСозданияПроцесса.Представление;
	КонецЦикла;

КонецПроцедуры

&ИзменениеИКонтроль("ДобавитьВДеревоОстальныеВариантыОтправки")
Процедура НАДО_ДобавитьВДеревоОстальныеВариантыОтправки(Помощник)

	ВариантыСозданияПроцесса = Новый СписокЗначений;

	ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);

#Вставка
	Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
		КлючЗначение.Ключ, Помощник);

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Представление);
	КонецЦикла;
#КонецВставки
	Для Каждого КлючЗначение Из Помощник.ДругиеВариантыСозданияПроцессов Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
	КонецЦикла;

	ВариантыСозданияПроцесса.СортироватьПоПредставлению();

	Если ВариантыСозданияПроцесса.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
	СтрокаВарианта.Вариант = ПомощникОтправитьКлиентСервер.ГруппаДругихВариантовСозданияПроцессов();
	СтрокаВарианта.Представление = НСтр("ru = 'Другие варианты'");
	Помощник.НедоступныеВарианты[СтрокаВарианта.Вариант] = Истина;

	Для Каждого ВариантСоздания Из ВариантыСозданияПроцесса Цикл
		ПодчиненнаяСтрокаВариант = СтрокаВарианта.Строки.Добавить();
		ПодчиненнаяСтрокаВариант.Вариант = ВариантСоздания.Значение;
		ПодчиненнаяСтрокаВариант.Представление = ВариантСоздания.Представление;
	КонецЦикла;

КонецПроцедуры
Показать


Результат:
Прикрепленные файлы:
3. Maito 7 23.07.20 14:20 Сейчас в теме
(1) Можно создать для них отдельную группу, тогда код будет выглядеть вот так:

&ИзменениеИКонтроль("ДобавитьВДеревоВариантыСозданияПроцессов")
Процедура НАДО_ДобавитьВДеревоВариантыСозданияПроцессов(Помощник)

	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьБизнесПроцессыИЗадачи") Тогда
		Возврат;
	КонецЕсли;

	// Очищаем основные варианты создания процессов.
	Помощник.ОсновныеВариантыСозданияПроцессов.Очистить();

	// Выполняем заполнение данных по предметам.
	ЗаполнитьДопустимыеТипыПредметовВПроцессах(Помощник);
	ЗаполнитьПредметыПроцесса(Помощник);

	Если ЗначениеЗаполнено(Помощник.ПредметыПроцесса)
		И Не ЕстьПредметыДопустимыеВПроцессах(Помощник) Тогда

		Возврат;
	КонецЕсли;

	ЗаполнитьДопустимыеТипыВариантовДляПредметов(Помощник);

	// Вначале определяем все возможные варианты создания процессов,
	// с учетом предметов процессов в помощнике.

#Вставка	
	ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
	ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
	Если Помощник.ПредметыПроцесса.Количество() = 0 
		Или Не ЗначениеЗаполнено(Помощник.ПредметыПроцесса[0].Ссылка) Тогда
		ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
		ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
	КонецЕсли; 
#КонецВставки
#Удаление	
	ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
	ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
	ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
	ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
#КонецУдаления
	
	// После добавляем в дерево основные варианты создания процессов,
	// в отдельной группе остальные доступные варианты.

	ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник);
	ДобавитьВДеревоОстальныеВариантыОтправки(Помощник);

КонецПроцедуры

&ИзменениеИКонтроль("ДобавитьВДеревоОсновныеВариантыСозданияПроцесса")
Процедура НАДО_ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник)

	УстановитьПривилегированныйРежим(Истина);

	// Формируем общий список вариантов, добавляемых в корень дерева, из:
	// шаблонов по умолчанию, общих и рекомендуемых шаблонов.

	ВариантыСозданияПроцесса = Новый СписокЗначений;

	ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);

#Удаление	
	Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
		КлючЗначение.Ключ, Помощник);

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Представление);
	КонецЦикла;
#КонецУдаления

	Для Каждого КлючЗначение Из Помощник.ОбщиеВариантыСозданияПроцессов Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
	КонецЦикла;

	Для Каждого КлючЗначение Из Помощник.РекомендуемыеВариантыСозданияПроцессов Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
	КонецЦикла;

	ВариантыСозданияПроцесса.СортироватьПоПредставлению();

	Для Каждого ВариантСозданияПроцесса Из ВариантыСозданияПроцесса Цикл
		СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
		СтрокаВарианта.Вариант = ВариантСозданияПроцесса.Значение;
		СтрокаВарианта.Представление = ВариантСозданияПроцесса.Представление;
	КонецЦикла;
	
#Вставка
	ВариантыСозданияПроцесса.Очистить();
	
	Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл

		Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
			И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда

			Продолжить;
		КонецЕсли;

		Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
			КлючЗначение.Значение] = Неопределено Тогда

			Продолжить;
		КонецЕсли;

		Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
			И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокумент­ов(Помощник) Тогда

			Продолжить;
		КонецЕсли;

		Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
		КлючЗначение.Ключ, Помощник);

		ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Представление);
	КонецЦикла;
	
	ВариантыСозданияПроцесса.СортироватьПоПредставлению();

	СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
	СтрокаВарианта.Вариант = "По умолчанию";
	СтрокаВарианта.Представление = НСтр("ru = 'По умолчанию'");
	Помощник.НедоступныеВарианты[СтрокаВарианта.Вариант] = Истина;
	
    Для Каждого ВариантСоздания Из ВариантыСозданияПроцесса Цикл
        ПодчиненнаяСтрокаВариант = СтрокаВарианта.Строки.Добавить();
        ПодчиненнаяСтрокаВариант.Вариант = ВариантСоздания.Значение;
        ПодчиненнаяСтрокаВариант.Представление = ВариантСоздания.Представление;
    КонецЦикла;
#КонецВставки
КонецПроцедуры
Показать
Оставьте свое сообщение