Введение в подсистему умных ролей¶
В данном разделе представлена основная информация о работе подсистемы умных ролей, её настройках и возможностях.
Умные роли¶
Умная роль - тип роли в системе, состав которой рассчитывается и обновляется автоматически, и может содержать в себе не только сотрудников, но и другие роли, имеющие состав (т.е. все типы ролей, кроме контекстных и временных). В этом случае её состав формируется из сотрудников всех ролей, входящих в умную роль.
Для создания умных ролей в системе существует генератор умных ролей.
При создании каждой умной роли для нее указывается владелец - это идентификатор (может быть идентификатором карточки в системе, строки в таблице или просто генерироваться неким образом), который позволяет идентифицировать ту или иную умную роль в рамках одного генератора умных ролей. Таким образом, несколько умных ролей могут иметь один и тот же идентификатор владельца, если они были созданы различными генераторами умных ролей.
Генератор умных ролей¶
Генератор умных ролей - это объект системы, с помощью которого создаются умные роли, а также определяются моменты, когда (при срабатывании каких триггеров) умные роли должны быть перерасчитаны.
Генератор умных ролей определяет список владельцев умных ролей, по идентификаторам которых уже может быть определен состав каждой умной роли.
Генераторы умных ролей в системе могут быть реализованы следующими способами:
- С помощью карточки типа “Генератор умных ролей”, в которую включены настройки, необходимые для создания и своевременного обновления умных ролей.
- Программно путем реализации методов генератора на языке C#.
Карточка “Генератор умных ролей”¶
Данный тип карточки используется для определения правил создания и обновления умных ролей.
Основная вкладка¶
Данная карточка имеет следующий настройки:
- Название - название генератора умных ролей.
- Описание - описание генератора умных ролей.
- Отключить генератор - флаг, отключающий данный генератор. По отключенным генераторам не производится обновление умных ролей, а уже существующие умные роли будут удалены, или, в случае невозможности удаления, их состав будет очищен.
-
Запрос SQL для получения ролей - запрос к базе данных, который должен возвращать набор ролей по идентификатору владельца умной роли. Может работать как в режиме выборки по одному владельцу, так и в режиме выборки по нескольким владельцам умных ролей. Для того, чтобы запрос работал в режиме выборки по нескольким владельцам, в нём должны использоваться плейсхолдеры в режиме множественной выборки.
Список плейсхолдеров:
#with_id(<text>)
- используется для получения идентификатора владельца умной роли. В режиме множественной выборки заменяется на<text>
. Не используется в режиме выборки по одному владельцу умной роли.#when_id(<text>)
- используется для сравнения идентификатора владельца умной роли. В режиме множественной выборки заменяется на<text> in <список_идентификаторов>
. В режиме выборки по одному владельцу умной роли заменяется на<text> = @CardID
.#order_by_id(<text>)
- используется для сортировки результата по идентификатору владельца умной роли. В режиме множественной выборки заменяется наORDER BY <text>
. Не используется в режиме выборки по одному владельцу умной роли.
Example
Пример запроса с выборкой по множеству карточек для формирования умной роли с руководителями подразделений в качестве состава роли:
SELECT [HeadUserID] #with_id([ID]) FROM [DepartmentRoles] WITH(NOLOCK) WHERE #when_id([ID]) AND [HeadUserID] is not NULL #order_by_id([ID])
-
Шаблон имени роли - шаблон, по которому определяется имя умной роли. В качестве значения
{0}
подставляется имя владельца умной роли. Может быть использована строка локализации. -
Запрос SQL на получение всех владельцев умных ролей - запрос к базе данных, который должен возвращать набор всех владельцев умных ролей, созданных указанным генератором умных ролей. Если не задан, то в качестве единственного владельца умной роли будет сам генератор умных ролей.
Запрос должен возвращать следующие колонки:
- Идентификатор владельца умной роли (тип
Guid
). - Имя владельца умной роли (тип
string
). - Идентификатор календаря для умной роли (тип
Guid
). Если возвращаетnull
, то используется календарь по умолчанию. - Идентификатор временной зоны для умной роли (тип
int
). Если возвращаетnull
, то используется временная зона по умолчанию.
Example
Пример запроса для формирования умной роли по подразделениям:
SELECT [ID], [Name], [CalendarID], [TimeZoneID] FROM [Roles] WITH(NOLOCK) WHERE [TypeID] = 2
- Идентификатор владельца умной роли (тип
-
Запрос SQL на получение данных владельца умной роли - запрос к базе данных, который должен возвращать данные о владельце умной роли по его идентификатору.
Запрос должен возвращать следующие колонки:
- Имя владельца умной роли (тип
string
). - Идентификатор календаря для умной роли (тип
Guid
). Если возвращаетnull
, то используется календарь по умолчанию. - Идентификатор временной зоны для умной роли (тип
int
). Если возвращаетnull
, то используется временная зона по умолчанию.
Запрос имеет следующие параметры:
@CardID
- идентификатор владельца умной роли.
Example
Пример запроса для формирования умной роли по подразделениям:
SELECT [Name], [CalendarID], [TimeZoneID] FROM [Roles] WITH(NOLOCK) WHERE [TypeID] = 2 AND @CardID = [ID]
- Имя владельца умной роли (тип
-
Скрыть роли - флаг, скрывающий созданные данным генератором умные роли.
- Инициализировать роли - флаг, позволяющий создать умные роли в момент сохранения генератора умных ролей. Если флаг не проставлен, умные роли будут создаваться при срабатывании триггеров по мере необходимости.
- Отключить замещения - флаг, отключающий замещения у создаваемых умных ролей.
-
Триггеры - таблица с настройками триггеров, при срабатывании которых система производит обновление списка умных ролей и их состава для определённого набора владельцев умных ролей. Проверка триггеров производится системой при изменении карточек.
Каждый триггер имеет следующие настройки:
-
Название - название триггера.
-
Типы - типы карточек и типы документов, для которых проверка данного триггера выполняется. Наравне с одиночными значениями для выбора доступны группы ссылок с типами “Тип карточки” и “Тип документа”.
-
Обновлять асинхронно - флаг определяет, что при срабатывании триггера обновление ACL должно производиться асинхронно с использованием Chronos. Следует устанавливать, когда ожидается, что запрос на получение карточек для обновления может возвращать большое количество карточек (например, больше 100), или долго выполняться.
-
Обновлять умную роль только проверяемой карточки - флаг определяет, что при срабатывании триггера обновление умной роли должно быть выполнено только для владельца умной роли с идентификатором карточки, запустившей проверку триггера. При установке флага поле Запрос SQL для получения обновляемых карточек недоступно.
-
Запрос SQL для получения обновляемых карточек - запрос к базе данных, который используется для определения списка владельцев умных ролей для обновления при срабатывании триггера. Если запрос не задан, то используется запрос из поля Запрос SQL на получение всех владельцев умных ролей.
Запрос имеет следующие параметры:
@CardID
- идентификатор карточки, запустившей выполнение триггера.
-
Проверять условия через оператор “И” - флаг определяет, что для срабатывания триггера необходимо, чтобы каждое условие из списка было выполнено. Иначе достаточно выполнения хотя бы одного условия.
-
Список условий - набор условий, которые проверяются при проверке триггера. Если выполнены одно или все условия, в зависимости от настроек триггера, то система производит запуск обновления умных ролей для набора владельцев умных ролей, определённого данным триггером. Про подсистему условий можно прочитать в разделе Типы условий.
-
Вкладка Валидация¶
На данной вкладке можно произвести проверку одного или всех генераторов умных ролей с помощью соответствующих кнопок.
В блоке Ошибки отображаются ошибки, возникшие при обновлении умных ролей для данного генератора. Ошибки записываются в виде карточек с типом Ошибка
, при удалении карточек также будут удалены строки из таблицы. При двойном нажатии на строку в представлении откроется карточка ошибки.
Note
Ошибки записываются только при установке флага Включить логирование ошибок. В противном случае ошибки записываются только в серверный лог при расчёте на сервере или в лог Chronos при расчёте в плагине.
Программный генератор умных ролей¶
Чтобы создать программный генератор умных ролей, нужно:
- Реализовать класс с интерфейсом
ISmartRoleGenerator
. Для удобства разработки в качестве основы можно использовать базовый классSmartRoleGeneratorBase
. В нём реализуется логика расчёта списка владельцев умных ролей и списка ролей для каждой умной роли. - Реализовать класс с интерфейсом
ISmartRoleGeneratorProvider
и зарегистрировать его в контейнере зависимостей с уникальным именем. Данный объект должен вернуть одно или несколько программных генераторов умных ролей, реализованных в пункте 1.
Генерация умных ролей¶
Система может производить создание и обновление умных ролей следующими способами:
- Синхронно - обновление умных ролей производится в момент непосредственного сохранения объекта, вызвавшего это обновление. Срабатывает, когда изменение затрагивает обновление небольшого количества умных ролей при срабатывании триггера.
- Асинхронно - обновление умных ролей производится в плагине сервиса Chronos, который выполняет логику обновления. При выполнении асинхронного обновления создается операция в таблице операций. Срабатывает, если в триггере установлен флаг Обновлять асинхронно или изменение затрагивает обновление большого количества умных ролей.
- Полный перерасчёт - расчёт производится асинхронно в отдельном плагине, который запускает полный перерасчёт умных ролей для генератора. Данный режим актуален только для карточек генераторов умных ролей, для программных генераторов его можно реализовать отдельно при необходимости. Срабатывает при изменении или удалении карточки генератора умных ролей, а также при отключении/включении генератора.
Создание и обновление умных ролей может быть запущено следующими способами:
- При создании/изменении/удалении генератора умных ролей. В этом случае расчёт запускается в режиме Полный перерасчёт.
- При срабатывании триггера на создание/изменение/удаление карточки.
- При срабатывании триггера правила расчёта ACL, использующего умные роли, когда обновляемая карточка запрашивает умную роль с идентификатором владельца, для которого умной роли ещё не было создано.
- При изменении состава для роли, входящей в список ролей для умной роли, когда вызывается обновление списка сотрудников этой умной роли.
- С помощью расширений можно самостоятельно запускать перерасчёт одного или нескольких генераторов умных ролей для набора владельцев умных ролей или по триггерам. Для этого следует использовать объект
ISmartRoleUpdateManager
. - Запустить перерасчёт умных ролей для данного генератора умных ролей можно с помощью пункта меню системы Перерасчитать генератор умных ролей в карточке генератора. Перерасчёт выполняется синхронно и переходит в асинхронный режим автоматически при необходимости. Пункт доступен администраторам системы.
- Запустить перерасчёт умной роли по её генератору можно в карточке этой роли с помощью пункта меню системы Пересчитать умную роль. Перерасчёт выполняется синхронно. Пункт доступен администраторам системы.
Note
Во всех случаях, где не указано явно, расчёт запускается синхронно, но переводится в асинхронный режим автоматически в случае большого количества изменений.