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

Программирование - Практика программирования

Автоподстановка Документооборот Шаблон процесса Ролевая адресация

28
Примеры реализации функций автоподстановок для использования в шаблонах процессов в 1С:Документооборот.

Добрый день, уважаемые коллеги!

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

Первое место в моем рейтинге занимает группа вопросов, касающихся настройки маршрута в зависимости от реквизита предмета процесса. Например:

  • Как сделать так, чтобы договоры организации А попадали на согласование бухгалтеру Петрову, а договоры организации Б - бухгалтеру Сидорову?
  • Как эскалировать задачу руководителю проекта?
  • Как настроить адресацию входящего документа на роль "Руководитель подразделения документа"?

Конечно, всегда можно сделать разные шаблоны для разных организаций/подразделений или прямо в шаблоне процесса прописать условия ветвления. Но, согласитесь, это крайне неудобно: а если организаций не один десяток? а если орг. структура поменяется? Все шаблоны переделывать?

Казалось бы, вот тут и нужно задействовать механизм объектов адресации: сделать роль "Бухгалтер", включить для этой роли флаг "Используется с объектами адресации" и указать тип объекта адресации (Организация). Но все не так просто: коробочное решение не умеет автоматически подставлять объект адресации. То есть, нужно руками прямо в шаблоне выбирать и роль (Бухгалтер), и объект адресации (Организация). 

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

Итак, нам понадобится:

1. Включить возможность изменения конфигурации:

Для этого открываем конфигуратор, переходим в меню Конфигурация --> Поддержка --> Настройка поддержки и нажимаем Включить возможность изменения. Все объекты поставщика при этом оставляем нередактируемыми.

 

2. Снимаем с замка корень конфигурации и общий модуль ШаблоныБизнесПроцессовПереопределяемый.

3. Добавляем общий модуль АвтоподстановкиПереопределяемый с флагами СерверВнешнее соединение и Вызов сервера

Нужные нам функции автоподстановок будем включать в программный интерфейс добавленного модуля и вызывать из метода ШаблоныБизнесПроцессовПереопределяемый.ПолучитьСписокДоступныхФункций(). Кроме того, нам понадобится несколько служебных универсальных методов:

Функция, возвращающая ссылку на предмет процесса по его имени:

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

 

Функция, возвращающая значение реквизита предмета процесса:

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

Для получения ссылок на нужные нам роли будем описывать функции следующего вида:

Функция НайтиСоздатьРоль_БухгалтерОрганизации()
	
	ИдентификаторСсылки = Новый УникальныйИдентификатор("11d8bbbe-1fd6-11e5-926b-d485646b0d9a");
	РольСсылка = Справочники.РолиИсполнителей.ПолучитьСсылку(ИдентификаторСсылки);
	
	Если Не ОбщегоНазначения.СсылкаСуществует(РольСсылка) Тогда 
		
		РольОбъект = Справочники.РолиИсполнителей.СоздатьЭлемент();
		РольОбъект.УстановитьСсылкуНового(РольСсылка);
		
		РольОбъект.Наименование = НСтр("ru = 'Бухгалтер организации'");
		РольОбъект.КраткоеПредставление = НСтр("ru = 'Бух'");
		РольОбъект.ИспользуетсяСОбъектамиАдресации = Истина;
		РольОбъект.ТипыОсновногоОбъектаАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.Организация;
		
		РольОбъект.УстановитьНовыйКод();
		
		РольОбъект.Записать();
		
	КонецЕсли;
	
	Возврат РольСсылка;
	
КонецФункции

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

 

Примеры автоподстановок, возвращающих полные роли с нужными объектами адресации:

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

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

 

Осталось только включить эти автоподстановки в список доступных функций. Для этого нужно немного подправить модуль ШаблоныБизнесПроцессовПереопределяемый:

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

	Возврат ДоступныеФункции;
	
КонецФункции

 

В общем-то, это все: можно обновить конфигурацию и в пользовательском режиме обновить данные в справочнике Адресная книга. Лайфхак: можно обновить не всю адресную книгу целиком, а только автоподстановки. Для этого нужно открыть любой шаблон любого процесса и перейти к выбору исполнителя задачи. Тогда откроется форма "Выбор исполнителя", в контекстном меню которой есть отдельный пункт "Обновить автоподстановки".

Дальше, думаю, все понятно: при настройке шаблонов процессов вместо указания ролей с объектами адресации используем наши автоподстановки. Профит!

28

См. также

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

Комментарии
Избранное Подписка Сортировка: Древо
1. DEG156 24 26.06.18 17:54 Сейчас в теме
Здравствуйте !

А где ответ на вопрос - Как настроить адресацию входящего документа на роль "Руководитель подразделения документа"?
2. TimurrReznik 31.07.18 12:43 Сейчас в теме
Не знаю, что насчет конфигурации - я ничего толком не понял. В кабинете documentoved.ru намного удобнее синхронизирована работа входящих и исходящих документов. В программе 1С я посмотрел настройки, полазил и по вашему скрипту не смог настроить...
3. TimurrReznik 31.07.18 12:46 Сейчас в теме
Не знаю, что насчет конфигурации - я ничего толком не понял. В кабинете documentoved.ru намного удобнее синхронизирована работа входящих и исходящих документов. В программе 1С я посмотрел настройки, полазил и по вашему скрипту не смог настроить...
4. Katty_K 06.12.18 08:54 Сейчас в теме
Здравствуйте! Спасибо большое за пост, очень помог.

Сейчас функция
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитОбъекта(Предмет, ИмяРеквизита)
стала называться
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Предмет, ИмяРеквизита)
5. Katty_K 06.12.18 09:29 Сейчас в теме
Единственное, у меня проблема возникла, которую я не знаю как решить (я новичок совсем):
У меня есть Роль исполнителя под названием "Зам. директора по направлению", и некоторые (не все) подразделения подчиняются своим замам директора. Создала автоподстановку для этой роли (зависит от подразделения автора документа), и шаблон процесса, содержащий эту автоподстановку.

Если в документе указать в качестве автора документа пользователя, подразделение которого подчиняется одному из замов, то есть соответствующая запись есть в Роли исполнителя (надеюсь, понятно объясняю), то все хорошо, автоподстановка работает, задача приходит указанному в Роли исполнителя заму директора по направлению.

Однако если в документе в качестве автора документа указать пользователя, подразделение которого НЕ подчиняется ни одному из замов (нет соответствующей записи в Роли исполнителя "Зам. директора по направлению"), то задача все равно создается, получается, "в никуда".

Можно ли сделать так, чтобы при отсутствии соответствущей роли исполнителя для подразделения автора документа задача бы вообще не создавалась?
Оставьте свое сообщение