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

9 4

Этой разработке уже много лет, она писалась еще под DIRECTUM 4.5 и кочует из проекта в проект с минимальными дополнениями. Практически в каждой новой версии DIRECTUM рассматривается вопрос – не включить ли этот функционал в стандартную поставку, но каждый раз что-то останавливает. Тем не менее, решение этой задачи очень востребовано, поэтому выкладываю тут.

При настройке типовых маршрутов постоянно возникают вопросы вида – «по процессу нужно отправить задание директору департамента инициатора, но как понять – кто директор департамента?» Вычислить такого человека в общем случае не возможно, потому что организационная структура может быть какой угодно, эти директора могут находиться на совершенно разном уровне и даже вообще не быть иерархическим начальством.

Другой случай – секретари руководителей. Их тоже надо как-то вычислять, чтобы отправить им задания.

Для этого был разработан функционал «Специальных ролей» (название странноватое, но исторически к нему уже все привыкли, поэтому так и живет). При помощи справочника специальных ролей можно настроить соответствие подразделений, работников и наших организаций исполнителям роли.

Т.е. можно сделать роль «Секретарь руководителя» и настроить для каждого работника (руководителя) соответствующего исполнителя роли (секретаря). Или роль «Делопроизводитель подразделения», в котором могут быть указаны делопроизводители для целых департаментов, но при этом еще и уточняться, что для такого-то подразделения из департамента исполнитель роли другой.

Как это работает? Например, мы имеем «Департамент информационных технологий» и в нем подразделения «Отдел общего технического обеспечения», «Отдел сопровождения клиентов», «Отдел информационных систем» и еще несколько (чур за названия ногами не пинать, придумал сходу). При этом у департамента есть делопроизводитель, но вот отдел сопровождения клиентов имеет своего. Настройка справочника при этом проста – вовсе не обязательно указывать одного и того же делопроизводителя для всех отделов кроме сопровождения. Достаточно настроить так:

Теперь как будет вычисляться роль? Допустим, нам надо найти делопроизводителя для текущего пользователя. Мы получаем его подразделение и передаем его в функцию вычисления роли с параметром, говорящим о том, что нам надо искать не только по указанным в справочнике подразделениям, но по всей иерархии. Тогда, если пользователь входит в отдел сопровождения, тогда он сразу и найдется и по нему вычислится Петров. А если пользователь входит в другое из подразделений департамента, то функция вычисления будет искать вверх по иерархии до тех пор, пока не дойдет до департамента и тогда она найдет соответствие, выдав в результате Прокофьева.

Смотрите так же справку по функции, там описано достаточно подробно, на мой взгляд. Чтобы механизм заработал, нужно создать в справочнике «Роли» вычисляемую роль, настроить для нее запись справочника «Специальные роли» и написать в вычислениях роли минимальный код, подготавливающий параметры для функции вычисления (т.к. нет общего случая как нужно вычислять – по текущему пользователю, или по его подразделению, или вообще по какому-то параметру маршрута или реквизиту вложения – это зависит от задачи).

И наконец, вычисления в роли для нашего примера:

  // Имя роли нельзя получить из вычислений самой роли, поэтому нужно использовать переменную
  RoleName = 'Делопроизводитель_подразделения'
  
  // Получить список работников текущего пользователя
  WorkerCodeList = GetEmployeesByUserID(EDocuments.CurrentUser.ID)
  if WorkerCodeList.Count > 0
    // Взять первого работника из списка и вычислить для него исполнителей роли
    // по его подразделению с учетом иерархии
    Department = GetRequisiteValueAsString('РАБ'; WorkerCodeList.Value; 'Подразделение'; FALSE; TRUE)       
    RoleMembers = BRDGetSpecialRoleMembers(RoleName;; Department;; TRUE; TRUE)
    foreach RoleMember in RoleMembers
      Result.Add(RoleMember)
    endforeach
  endif

 

Этот механизм позволяет вынести все изменения в настройку и не залезать в код вычислений каждый раз когда меняются исполнители.

Выложена разработка для DIRECTUM 4.8, но она должна заработать и в предыдущих версиях, т.к. использует самый базовый функционал.

Специальные роли.zip (15,68 Кб)

 

Валентина Писанова

Очень и очень жаль, что данный функционал так и не включается в стандартную поставку. Неоднократно на проектах придумывали похожие паллиативы.

Любовь Иглина

Здравствуйте Денис! Воспользовалась Вашей разработкой. Я не разработчик, поэтому все полностью сделала как есть у Вас. Внесла в специальные роли подразделения и исполнителя, у нас несколько служб в состав которых входят подразделения. Эти службы поделены между тремя делопроизводителями.  Выбирается всегда один и тот же делопроизводитель. Вы не подскажите, что нужно исправить в Вашей разработке для нашего случая, чтобы делопроизводитель_подразделения выбирался по инициатору задания?

Денис Баранов

Любовь, попробуйте для начала одну догадку - замените EDocuments.CurrentUser на Task.Info.Author.

А вообще, для того, чтобы это использовать, надо хотя бы немного, но все же быть программистом. smiley Я так понял, что код вы 1:1 взяли из статьи? И где вы его написали? Если в роли, то как эта роль используется? В том смысле, что указана ли она где-то как исполнитель в блоке, или вычисляется на старте и записывается в параметр?

Любовь Иглина

Денис, я создала вычисляемую роль делопроизводитель_подразделения, куда собственно  и вставила Ваш код. В блоке исполнитель - роль делопроизводитель_подразделения. Догадку Вашу я попробовала, ошибка блока- "значение переменной Task не определено".

Авторизуйтесь, чтобы написать комментарий