Паттерны управления пользователями и группами¶
Организационная структура¶
Иерархия типов¶
Тип структуры = уровни иерархии. Стандартная конфигурация:
| Тип | Уровень |
|---|---|
| Компания | 0 |
| Департамент | 1 |
| Отдел | 2 |
| Должность | 3 |
Должность — конечный уровень иерархии в каждой ветке.
Создание оргструктуры — порядок¶
- Типы орг.структуры (Администрирование → Пользователи и группы → Типы орг.структуры)
- Дерево орг.единиц (сверху вниз: компания → департамент → отдел → должность)
- Пометить руководящие должности (галочка «Руководитель» в настройках орг.единицы)
- Создать пользователей (Фамилия, логин, псевдоним, Email — обязательные)
- Привязать пользователей к должностям
Множественные орг.единицы¶
Пользователю можно назначить несколько орг.единиц, но только одна — основная (галочка «Основная» в профиле, подсвечивается жирным).
Группы¶
Типы групп¶
| Тип | Описание | Управление составом |
|---|---|---|
| Связанная (организационная) | Привязана к орг.единице | Автоматически: участники = сотрудники орг.единицы. Ручное добавление невозможно |
| Обычная | Произвольный набор пользователей | Ручное добавление/удаление |
| Индивидуальная | Один пользователь | Для выдачи прав конкретному человеку |
Системные группы¶
- Все пользователи — все пользователи системы (автоматически)
- Administrators — доступ к разделу администрирования
Внимание: системные учётки
support,systemrobot,anonymous— не менять настройки, может привести к некорректной работе. Восстановление = сброс всех настроек.
Создание связанной группы¶
Администрирование → Пользователи и группы → Орг. структура → выбрать орг.единицу → «Связанная группа» = (Создать новую) → «Связать с группой».
Варианты: - Одна группа для одной орг.единицы - Одна группа для всей ветки (рекурсивно включает дочерние)
Актуализация связанной группы¶
Состав связанной группы обновляется автоматически при добавлении/удалении пользователей из связанной орг.единицы. Ручное редактирование состава — через орг.единицу, не через группу.
Из тестов: права доступа к категориям выдаются только группам (не пользователям, не орг.единицам).
Роли пользователей в задачах¶
| Роль | Описание | Кратность |
|---|---|---|
| Заказчик | Создал задачу | Один на задачу |
| Исполнитель | Назначен на исполнение | Несколько, но ответственный — один |
| Подписчик | Наблюдает, может комментировать, не исполняет | Без ограничений |
| Акцептант | Запрошена подпись | Без ограничений |
Изменение оргструктуры¶
Перемещение орг.единиц¶
При реорганизации (слияние отделов, переподчинение): - Перемещение орг.единицы = перемещение всех вложенных + связанных групп - Права, завязанные на связанную группу, сохраняются - После перемещения — проверить, что логика Smart-правил не сломалась (если привязаны к конкретным орг.единицам по ID)
Изменение команды¶
- Добавление нового сотрудника: создать пользователя → привязать к должности → автоматически попадёт в связанные группы → автоматически получит права
- Увольнение: деактивировать пользователя (не удалять — история задач сохраняется)
- Перевод между отделами: сменить орг.единицу → автоматически сменятся группы → автоматически сменятся права
Ограничения оргструктуры¶
Уникальность имён¶
По умолчанию название орг.единицы должно быть уникально в рамках одного родителя (Name + ParentId). При попытке создать дубликат система выбрасывает ошибку OrgStructureUnits_NotUnique.
Однако это поведение управляется кастомной настройкой OrgStructure_AllowNonUniqueOrgUnitNames (по умолчанию false). Если включить -- дубликаты разрешены.
На уровне БД UNIQUE-ограничения на Name+ParentId нет -- проверка только в application layer (OrgStructure.cs:468, OrgStructure.cs:562).
Тест Q17: «Можно ли создать две должности "Офис-менеджер" в отделе продаж?» Правильный ответ B: «Название орг.единицы в рамках одного уровня должно быть уникально» -- верно для дефолтной конфигурации.
Источники:
core/TCClassLib/OrgStructure.cs:257(настройка),:468и:562(проверки при создании и обновлении), DDLdbo.OrgStructureUnit(нет DB-constraint на имя).
Удаление орг.единиц¶
Удаление орг.единицы с активными (не уволенными) пользователями невозможно. Система выбрасывает TCLogicException: «Невозможно удалить организационную единицу, поскольку в ней есть сотрудники».
Порядок действий при удалении (OrgStructure.RemoveOrgStructureUnit):
1. Уволенные пользователи автоматически открепляются от орг.единицы
2. Если остались активные пользователи -- ошибка
3. Если пользователей нет -- удаляются дочерние элементы и связанная группа
При удалении родительской орг.единицы удаляются все дочерние элементы. Если нужно сохранить вложенные единицы -- сначала перенести их (изменить поле «Входит в»), потом удалять родителя.
Тест Q19: «Что произойдёт с пользователями при удалении орг.единицы?» Правильный ответ C: «Удаление орг.единицы с пользователями невозможно».
Источники:
core/TCClassLib/OrgStructure.cs:667-696(методRemoveOrgStructureUnit),docs/academy/admin-basic/01-basic-settings.md(Кейс 4).
Обязательные поля при создании пользователя¶
Безусловно обязательные поля: орг.единица, логин, пароль.
Дополнительные обязательные поля определяются в Общих настройках приложения (блок «Обязательные поля профиля пользователя»): фамилия, дата рождения, псевдоним на русском, e-mail. Набор зависит от конфигурации конкретной инсталляции.
Тест Q33 (финальный): «Какие параметры обязательны для создания пользователя?» Правильные ответы: A (орг.единица), C (логин), E (пароль), H (определяется в общих настройках).
Источники:
docs/academy/tests/basic-admin-final.md:366-378,docs/domains/users-and-groups/business.md:82(«обязательные поля: логин, фамилия, псевдоним, орг.единица, e-mail -- набор зависит от общих настроек»),docs/academy/admin-basic/09-system-support.md:81.