1. Katty_K 05.12.18 13:47 Сейчас в теме

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

Всем добрый день!

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

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

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


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



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




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


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


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

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

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

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

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

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

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

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

помог вот этот пост https://forum.infostart.ru/forum9/topic188789/
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Старший Программист 1С НОВОСИБИРСК
Новосибирск
зарплата до 130 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 75 000 руб.
Полный день



Руководитель проектов 1С
Санкт-Петербург
По совместительству