Добрый день, уважаемые коллеги!
Часто сталкиваюсь с вопросами, неизбежно возникающими на внедрениях 1С:Документооборот. Большое количество вопросов связано с настройкой маршрутов процессов обработки документов (согласование, утверждение, рассмотрение и т.д.).
Первое место в моем рейтинге занимает группа вопросов, касающихся настройки маршрута в зависимости от реквизита предмета процесса. Например:
- Как сделать так, чтобы договоры организации А попадали на согласование бухгалтеру Петрову, а договоры организации Б - бухгалтеру Сидорову?
- Как эскалировать задачу руководителю проекта?
- Как настроить адресацию входящего документа на роль "Руководитель подразделения документа"?
Конечно, всегда можно сделать разные шаблоны для разных организаций/подразделений или прямо в шаблоне процесса прописать условия ветвления. Но, согласитесь, это крайне неудобно: а если организаций не один десяток? а если орг. структура поменяется? Все шаблоны переделывать?
Казалось бы, вот тут и нужно задействовать механизм объектов адресации: сделать роль "Бухгалтер", включить для этой роли флаг "Используется с объектами адресации" и указать тип объекта адресации (Организация). Но все не так просто: коробочное решение не умеет автоматически подставлять объект адресации. То есть, нужно руками прямо в шаблоне выбирать и роль (Бухгалтер), и объект адресации (Организация).
Тут то нас и выручит механизм автоподстановок (при условии, что вы готовы "снять с замка" корень конфигурации и один общий модуль).
Итак, нам понадобится:
1. Включить возможность изменения конфигурации:
Для этого открываем конфигуратор, переходим в меню Конфигурация --> Поддержка --> Настройка поддержки и нажимаем Включить возможность изменения. Все объекты поставщика при этом оставляем нередактируемыми.
2. Снимаем с замка корень конфигурации и общий модуль ШаблоныБизнесПроцессовПереопределяемый.
3. Добавляем общий модуль АвтоподстановкиПереопределяемый с флагами Сервер, Внешнее соединение и Вызов сервера
Нужные нам функции автоподстановок будем включать в программный интерфейс добавленного модуля и вызывать из метода ШаблоныБизнесПроцессовПереопределяемый.ПолучитьСписокДоступныхФункций(). Кроме того, нам понадобится несколько служебных универсальных методов:
Функция, возвращающая ссылку на предмет процесса по его имени:
Функция ПредметПоИмени(БизнесПроцессОбъект, ИмяПредмета)
СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");
Если СтрокаПредмета = Неопределено Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена, так как не найден предмет ""%1"" процесса.'")
, Строка(ИмяПредмета)
);
ИначеЕсли Не ЗначениеЗаполнено(СтрокаПредмета.Предмет) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена, так как не указан предмет ""%1"" процесса.'")
, Строка(ИмяПредмета)
);
КонецЕсли;
Возврат СтрокаПредмета.Предмет;
КонецФункции
Функция, возвращающая значение реквизита предмета процесса:
Функция ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, ИмяРеквизита)
Предмет = ПредметПоИмени(БизнесПроцессОбъект, ИмяПредмета);
Если Не ОбщегоНазначенияКлиентСервер.ЕстьРеквизитОбъекта(Предмет, ИмяРеквизита) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена, так как предмет ""%1"" процесса имеет неверный тип (%2).'")
, Строка(ИмяПредмета)
, ТипЗнч(Предмет)
);
КонецЕсли;
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Предмет, ИмяРеквизита);
КонецФункции
Для получения ссылок на нужные нам роли будем описывать функции следующего вида:
Функция НайтиСоздатьРоль_БухгалтерОрганизации()
ИдентификаторСсылки = Новый УникальныйИдентификатор("11d8bbbe-1fd6-11e5-926b-d485646b0d9a");
РольСсылка = Справочники.РолиИсполнителей.ПолучитьСсылку(ИдентификаторСсылки);
Если Не ОбщегоНазначения.СсылкаСуществует(РольСсылка) Тогда
РольОбъект = Справочники.РолиИсполнителей.СоздатьЭлемент();
РольОбъект.УстановитьСсылкуНового(РольСсылка);
РольОбъект.Наименование = НСтр("ru = 'Бухгалтер организации'");
РольОбъект.КраткоеПредставление = НСтр("ru = 'Бух'");
РольОбъект.ИспользуетсяСОбъектамиАдресации = Истина;
РольОбъект.ТипыОсновногоОбъектаАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.Организация;
РольОбъект.УстановитьНовыйКод();
РольОбъект.Записать();
КонецЕсли;
Возврат РольСсылка;
КонецФункции
То есть мы прямо в коде указываем идентификатор нужной нам ссылки, а случае, если роль с заданным идентификатором отсутствует, она будет создана автоматически при первом вызове функции. Естественно, для каждой роли следует указывать собственный идентификатор (сгенерировать новый или указать идентификатор роли, созданной вручную в пользовательском режиме).
Примеры автоподстановок, возвращающих полные роли с нужными объектами адресации:
Функция БухгалтерОрганизации(БизнесПроцессОбъект, ИмяПредмета) Экспорт
РольИсполнителя = НайтиСоздатьРоль_БухгалтерОрганизации();
ОсновнойОбъектАдресации = ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, "Организация");
ДополнительныйОбъектАдресации = Неопределено;
ПолнаяРоль = Справочники.ПолныеРоли.НайтиСоздатьПолнуюРоль(РольИсполнителя
, ОсновнойОбъектАдресации
, ДополнительныйОбъектАдресации
);
Возврат ПолнаяРоль;
КонецФункции
Функция РуководительПроекта(БизнесПроцессОбъект, ИмяПредмета) Экспорт
РольИсполнителя = НайтиСоздатьРоль_РуководительПроекта();
ОсновнойОбъектАдресации = ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, "Проект");
ДополнительныйОбъектАдресации = Неопределено;
ПолнаяРоль = Справочники.ПолныеРоли.НайтиСоздатьПолнуюРоль(РольИсполнителя
, ОсновнойОбъектАдресации
, ДополнительныйОбъектАдресации
);
Возврат ПолнаяРоль;
КонецФункции
Осталось только включить эти автоподстановки в список доступных функций. Для этого нужно немного подправить модуль ШаблоныБизнесПроцессовПереопределяемый:
// Возвращает список пользовательских функций для автоподстановки исполнителей в шаблонах бизнес-процессов
// Параметры:
// ИменаПредметовДляФункций - массив - массив имен предметов для функций автоподстановки
//
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
ДоступныеФункции = Новый СписокЗначений;
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
#Область МодификацияКонфигурации
Если ИменаПредметовДляФункций <> Неопределено И ИменаПредметовДляФункций.Количество() > 0 Тогда
Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
ДоступныеФункции.Добавить("АвтоподстановкиПереопределяемый.БухгалтерОрганизации(Объект, ИмяПредмета)" ,
СтрШаблон(НСтр("ru = '%1.Бухгалтер организации документа'" ), Строка(ИмяПредмета)));
ДоступныеФункции.Добавить("АвтоподстановкиПереопределяемый.РуководительПроекта(Объект, ИмяПредмета)",
СтрШаблон(НСтр("ru = '%1.Руководитель проекта документа'" ), Строка(ИмяПредмета)));
КонецЦикла;
КонецЕсли;
#КонецОбласти
Возврат ДоступныеФункции;
КонецФункции
В общем-то, это все: можно обновить конфигурацию и в пользовательском режиме обновить данные в справочнике Адресная книга. Лайфхак: можно обновить не всю адресную книгу целиком, а только автоподстановки. Для этого нужно открыть любой шаблон любого процесса и перейти к выбору исполнителя задачи. Тогда откроется форма "Выбор исполнителя", в контекстном меню которой есть отдельный пункт "Обновить автоподстановки".
Дальше, думаю, все понятно: при настройке шаблонов процессов вместо указания ролей с объектами адресации используем наши автоподстановки. Профит!