Свои автоподстановки в шаблонах процессов в 1С Документооборот

1. blandinko 05.12.18 13:47 Сейчас в теме
Всем добрый день!

Хочу настроить свои варианты автоподстановок в шаблонах процессов в 1С Документооборот.
Чтобы конфигурацию не снимать с замка, создала расширение (режим совместимости у основной конфигурации и у расширения - 8.3.9), куда перенесла общий модуль "ШаблоныБизнесПроцессовПереопределяемый" и там в соответствии с примером, указанным в общем модуле "ШаблоныБизнесПроцессовПереопределяемый", прописала функции своих автоподстановок:

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

// Возвращает список пользовательских функций для автоподстановки исполнителей в шаблонах бизнес-процессов
// Параметры:
//	ИменаПредметовДляФункций - массив - массив имен предметов для функций автоподстановки
//
&Вместо("ПолучитьСписокДоступныхФункций")
Функция Изм_ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
	
	ДоступныеФункции = Новый СписокЗначений;
	//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
	ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗДФПоНаправлениюАвтораДокумента(Объект, Предмет)", "ЗДФ по направлению автора документа");
	ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораДокументаБезДиректора(Объект, Предмет)", "Все руководители автора документа без директора");
	
	Возврат ДоступныеФункции;
	
КонецФункции


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



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




// Вызывается из ШаблоныБизнесПроцессов.ОбновитьДоступностьЗависимыхШаблонов при
// обновлении доступности зависимых шаблонов.
//
// Параметры:
//  Шаблон - Структура - 
//  СтандартнаяОбработка – Булево - В случае значения Истина обновление доступности
//                         будет выполнено способом по умолчанию.
&Вместо("ПриОбновленииДоступностиЗависимыхШаблонов")
Процедура СМЗ_ПриОбновленииДоступностиЗависимыхШаблонов(Шаблон, СтандартнаяОбработка) Экспорт
	
	
	
КонецПроцедуры


#КонецОбласти
Показать


Но при обновлении списка автоподстановок в шаблонах мои автоподстановки не появляются.

З.Ы. Автоподстановки появились после отключения у расширения галочки "Безопасный режим", спасибо user705522_constantin_h

Настроила процесс, содержащий данные автоподстановки. Но при попытке запуска документа по этому процессу выходит ошибка:
"Ошибка при выполнении автоподстановки <Название автоподстановки>
Ошибка компиляции при вычислении выражения или выполнении фрагмента кода"
Прикрепленные файлы:
+
По теме из базы знаний
Найденные решения
5. blandinko 06.12.18 09:06 Сейчас в теме
(4) спасибо, но мне нужно, чтобы автоподстановка из роли исполнителя бралась (не указала этого в теме, каюсь)

помог вот этот пост https://forum.infostart.ru/forum9/topic188789/
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user705522_constantin_h 35 05.12.18 13:50 Сейчас в теме
(1)В расширении снимите флажок Безопасный режим.
blandinko; +1
3. blandinko 05.12.18 14:27 Сейчас в теме
(2)
Спасибо, появились автоподстановки!

Но теперь не запускаются процессы с ними, выходит ошибка
"Ошибка при выполнении автоподстановки <Название автоподстановки>
Ошибка компиляции при вычислении выражения или выполнении фрагмента кода"
видимо, что-то неправильно с предметом процесса...

Попробовала создать автоподстановку без предмета, используя автора процесса, ошибка не появляется, но и роль исполнителя не подставляется, пустая строка... :((
+
4. user705522_constantin_h 35 05.12.18 15:31 Сейчас в теме
(3)Вообще-то в должно быть так:
// Возвращает список значений доступных функций автоподстановки исполнителей процессов
//
// Параметры:
//   ИменаПредметовДляФункций - массив - массив имен предметов для функций автоподстановки
//   ВключатьНедоступные - булево - признак добавления в список недоступных функций автоподстановки
//
// Возвращаемое значение:
//   СписокЗначений
//
//Добавлен параметр ВключатьНедоступные
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций = Неопределено, ВключатьНедоступные = Истина) Экспорт
	
	ДоступныеФункции = Новый СписокЗначений;

	Если ИменаПредметовДляФункций <> Неопределено Тогда
		Если ИменаПредметовДляФункций.Количество() > 0 Тогда
			Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
				
					
				//( Добавлена автоподстановка Руководитель проекта
				ДоступныеФункции.Добавить("ШаблоныБизнесПроцессов.РуководительПроекта(Объект, ИмяПредмета)",
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Руководитель проекта'"),Строка(ИмяПредмета)));
					
				//) Добавлена автоподстановка Руководитель проекта
			КонецЦикла;
		ИначеЕсли ВключатьНедоступные Тогда
			СтрокаИмениПредмета = НСтр("ru='Предмет'");
			
			//( Добавлена автоподстановка Руководитель проекта
			ДоступныеФункции.Добавить("ШаблоныБизнесПроцессов.РуководительПроекта(Объект, ИмяПредмета)",
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Руководитель проекта'"),Строка(ИмяПредмета)));
				
			//) Добавлена автоподстановка Руководитель проекта
		КонецЕсли;
	КонецЕсли;
	
	Возврат ДоступныеФункции;
	
КонецФункции

//( Добавлена автоподстановка Руководитель проекта
// Возвращает автора документа
//
// Параметры:
//   БизнесПроцессОбъект - БизнесПроцессОбъект.<Тип бизнес процесса> - процесс, для которого
//                         вычисляется автоподстановка
//   ИмяПредмета - СправочникСсылка.ИменаПредметов - имя предмета в процессе
//
// Возвращаемое значение:
//   СправочникСсылка.Пользователи
//
Функция РуководительПроекта(БизнесПроцессОбъект, ИмяПредмета) Экспорт
	
	СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");
	
	Если СтрокаПредмета <> Неопределено Тогда
		
		Если Не ЗначениеЗаполнено(СтрокаПредмета.Предмет) Тогда 
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Автоподстановка не может быть выполнена, так как не указан предмет ""%1"" процесса.'"),
				Строка(ИмяПредмета));
		КонецЕсли;
		
		Если ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ИсходящиеДокументы") И
			ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ВнутренниеДокументы") И
			ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ВходящиеДокументы") Тогда 
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Автоподстановка не может быть выполнена для предмета ""%1"" процесса.'"),
				Строка(ИмяПредмета));
		КонецЕсли;
		
		Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПредмета.Предмет.Проект, "Руководитель");
		
	Иначе
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не найден предмет ""%1"" процесса.'"),
			Строка(ИмяПредмета));
			
	КонецЕсли;
		
КонецФункции
Показать
+
5. blandinko 06.12.18 09:06 Сейчас в теме
(4) спасибо, но мне нужно, чтобы автоподстановка из роли исполнителя бралась (не указала этого в теме, каюсь)

помог вот этот пост https://forum.infostart.ru/forum9/topic188789/
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот