INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Снитковский Алексей | Исполнительный директор | 1С-Румыния

«Есть ли 1С:Жизнь за пределами Садового Кольца?»

В контексте данного доклада - "Садовое Кольцо" это метафора, охватывающая довольно-таки обширные географические пространства, на которых говорят по-русски (кое где - всё ещё говорят...) Для многих 1С:Наблюдателей "с Земли" всё, что находится за пределами этих территорий, по-прежнему видится бесконечно далёким и непонятным. И хотя многие из них уже серьёзно интересуются вопросом "есть ли жизнь на Марсе", для большинства наших коллег уход с привычной орбиты и полёт к этим неизведанным мирам остаётся несбыточной мечтой. Вашему вниманию будет предложен очередной репортаж о работе небольшой опытной экспедиции, отправленной в дальний космос с миссией распространения 1С:Культуры.

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

18

См. также

Комментарии
Сортировка: Древо
1. DEG156 23 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С я посмотрел настройки, полазил и по вашему скрипту не смог настроить...
Оставьте свое сообщение