Назначение прав доступа к задаче пользователю в сценарии

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

В сценарии используются следующие переменные:
task - переменная типа Базовый класс задачи, она содержит ту задачу, на которую назначаются права доступа для Заместителя;
nachalnik - переменная типа Пользователь, она содержит пользователя, занимающего должность начальника;
zamestitel - переменная типа Пользователь, она содержит пользователя, занимающего должность заместителя.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
Пространство имен:
using EleWise.ELMA.API;
Текст сценария:
//если Заместитель уже имеет права на задачу
if (task.Permissions.Any(p => p.User == zamestitel))
  //прекращаем выполнение сценария
  return; 
//получаем набор прав Начальника на задачу
var permissions = task.Permissions.Where(p => p.User == nachalnik).ToList();
//если права не найдены, то прекращаем выполнение сценария
if (permissions.Count == 0)
  return;
//для каждого элемента набора прав
foreach (var permission in permissions)
{
  //создаем новый элемент набора прав для Заместителя и передаем ему те же привилегии
     var newPermissin = PublicAPI.Portal.Objects.Tasks.TaskBasePermission.Create();
  newPermissin.Target = permission.Target;
  newPermissin.TypeRole = permission.TypeRole;
  newPermissin.AllowChief = permission.AllowChief; // можно установить false, чтобы не выдавать права доступа начальникам заместителя (всякие ситуации бывают)
  newPermissin.User = zamestitel;   
//добавляем созданный элемент в набор прав доступа к задаче   
task.Permissions.Add(newPermissin); 
} 
//сохраняем изменения для задачи 
task.Save();

Пример сценария без использования PublicAPI

Пространства имен:

using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Tasks.Models;

Текст сценария:

//если Заместитель уже имеет права на задачу
if (task.Permissions.Any(p => p.User == zamestitel))
  //прекращаем выполнение сценария
  return; 
//получаем набор прав Начальника на задачу
var permissions = task.Permissions.Where(p => p.User == nachalnik).ToList();
//если права не найдены, то прекращаем выполнение сценария
if (permissions.Count == 0)
  return;
//для каждого элемента набора прав
foreach (var permission in permissions)
{
  //создаем новый элемент набора прав для Заместителя и передаем ему те же привилегии
  var newPermissin = InterfaceActivator.Create<TaskBasePermission>();
  newPermissin.Target = permission.Target;
  newPermissin.TypeRole = permission.TypeRole;
  newPermissin.AllowChief = permission.AllowChief; // можно установить false, чтобы не выдавать права доступа начальникам заместителя (всякие ситуации бывают)
newPermissin.User = zamestitel; 
//добавляем созданный элемент в набор прав доступа к задаче 
task.Permissions.Add(newPermissin); 
} 
//сохраняем изменения для задачи 
task.Save();

В результате после выполнения сценария пользователь, содержащийся в переменной zamestitel, получит права доступа к той задаче, которая записана в переменную task.