Перейти к содержанию

Кнопка «Перейти к активной задаче пользователя». Настройка на C#

Здесь представлен пример С#-скрипта для кнопки на форме записи, связанной с процессом. Нажав эту кнопку пользователь может перейти к своей активной задаче, связанной с этой записью.

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

Активная задача пользователя

Приведённый здесь скрипт осуществляет переход к активной задаче пользователя:

  • если задаче назначен только один исполнитель, то она считается активной для этого пользователя.
  • если задаче назначено несколько возможных исполнителей, пользователь должен принять задачу в работу. Только принятая в работу задача будет назначена пользователю как активная. См. «Кнопка «Принять в работу» для задачи. Настройка на C#»

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

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

При нажатии кнопки «Перейти к задаче» скрипт должен выполнять следующие действия:

  • проверить наличие задач, связанных с открытой записью;
  • найти первую задачу, назначенную текущему пользователю;
  • открыть найденную задачу;
  • подходящая задача не найдена, показать пользователю соответствующее сообщение.

Логика работы скрипта

Представленный здесь скрипт работает следующим образом:

  1. Получает ID текущего пользователя из контекста операции кнопки.
  2. Получает ID записи из контекста операции кнопки.
  3. Получает словарь ссылок на объекты, связанные с текущей записью.
  4. Проверяет наличие в словаре ссылок на задачи по ключу cmw.task.objectId.
  5. Получает коллекцию ID задач, связанных с текущей записью.
  6. Перебирает найденные задачи и ищет первую, назначенную текущему пользователю.
  7. Выполняет переход к найденной задаче или возвращает сообщение об ошибке.
  1. В шаблоне записи, связанном с шаблоном процесса, создайте кнопку со следующими свойствами:

    • Отображаемое название: Перейти к задаче
    • Контекст операции: запись
    • Операция: C#-скрипт
    • Результат выполнения: навигация
  2. На вкладке «Скрипт» введите следующий код:

    Важно: подстановка ID процесса

    Обязательно замените в коде значение pa.1 в строке ContainerId = "pa.1" на фактический ID процесса, связанного с шаблоном записей, из которых пользователь должен переходить к задачам.

    ID процесса отображается в списке шаблонов процессов и в URL при настройке процесса.

    Скрипт для перехода к активной задаче пользователя
    // Импорт базовых типов и функций .NET Framework для работы с данными. 
    using System;
    // Импорт классов коллекций и словарей для хранения данных.
    using System.Collections.Generic;
    // Импорт классов для работы с LINQ-запросами.
    using System.Linq;
    // Импорт классов для работы с сущностями данных.
    using Comindware.Data.Entity;
    // Импорт классов для обработки нажатий кнопок
    // и возврата результатов выполнения скрипта.
    using Comindware.TeamNetwork.Api.Data.UserCommands;
    // Импорт основных классов для работы с данными в {{ productName }}.
    using Comindware.TeamNetwork.Api.Data;

    class Script
    {
    // userCommandContext содержит данные контекста при нажатии кнопки.
    public static UserCommandResult Main(UserCommandContext userCommandContext, Comindware.Entities entities)
    {
    // Получаем ID текущего пользователя, нажавшего кнопку.
    var currentUser = userCommandContext.CurrentUserId;
    // Получаем ID записи из контекста операции кнопки.
    var objectId = userCommandContext.ObjectIds[0];

    // Получаем словарь ссылок на все объекты, связанные с записью:
    // ключи — типы ссылок,
    // значения — коллекции ID связанных объектов.
    var refData = Api.Base.OntologyService.GetReferences(objectId);

    // Проверяем в словаре наличие ссылок на задачи
    // по ключу cmw.task.objectId
    // и получаем коллекцию ID задач, связанных с текущей записью.
    if (refData.ContainsKey("cmw.task.objectId") && refData["cmw.task.objectId"].Any())
    {
    var taskRefs = refData["cmw.task.objectId"];

    string idTask = null;

    // Ищем первую задачу, назначенную текущему пользователю.
    foreach (var taskRef in taskRefs)
    {
    var taskId = taskRef.ToString();
    var task = Api.TeamNetwork.UserTaskService.Get(taskId);

    if (task.Assignee == currentUser)
    {
    idTask = taskId;
    break;
    }
    }

    if (idTask != null)
    {
    // Переходим к найденной задаче.
    return new UserCommandResult()
    {
    Success = true,
    Commited = true,
    ResultType = UserCommandResultType.Navigate,
    NavigationResult = new UserCommandNavigationResult
    {
    // Обязательно замените значение `pa.1`
    // на фактический ID процесса.
    ContainerId = "pa.1",
    ObjectId = idTask,
    Context = ContextType.Task
    }
    };
    }
    else
    {
    // Подходящая задача не найдена.
    return new UserCommandResult()
    {
    Success = false,
    ResultType = UserCommandResultType.Notificate,
    Messages = new[]
    {
    new UserCommandMessage
    {
    Severity = SeverityLevel.Normal,
    Text = "У пользователя нет активной задачи по данной записи"
    }
    }
    };
    }
    }
    else
    {
    // Поле cmw.task.objectId отсутствует или пусто.
    return new UserCommandResult()
    {
    Success = false,
    ResultType = UserCommandResultType.Notificate,
    Messages = new[]
    {
    new UserCommandMessage
    {
    Severity = SeverityLevel.Normal,
    Text = "Нет задач, связанных с данной записью."
    }
    }
    };
    }
    }
    }
  3. Сохраните кнопку.

  4. Поместите кнопку «Перейти к задаче» на форму в шаблоне записи, связанном с шаблоном процесса.
  1. Запустите процесс с пользовательской задачей, назначенной текущему пользователю.
  2. Откройте запись, связанную с процессом.
  3. Нажмите кнопку «Перейти к задаче».
  4. Убедитесь, что открылась задача, назначенная текущему пользователю.
  5. Проверьте работу скрипта в следующих случаях:

    • когда у пользователя нет активной задачи по текущей записи, должно отобразиться сообщение «У пользователя нет активной задачи по данной записи»;
    • когда с записью не связаны никакие задачи (например, она не связана с процессом или связана с другим процессом), должно отобразиться сообщение «Нет задач, связанных с данной записью».
К началу