# Пользователи и группы

Администрирование пользователей и групп охватывает полный жизненный цикл учётных записей, групп, оргструктуры, ролей и прав доступа. Раздел собирает пошаговые процедуры — от создания пользователя до синхронизации с AD/LDAP, — а также настройку рабочих мест групп, типичные ошибки конфигурации и SQL-диагностику.

## Обзор

**Видимость профиля и контактов.** Видимость чужих профилей и адресов управляется специальными правами: запрет информации о пользователях убирает недоступные профили из пакетных выдач (ответ остаётся успешным, записи просто отсутствуют), а показ адреса контролируется отдельным правилом. Права действуют и в мобильных выдачах.

Раздел «Пользователи и группы» в администрировании отвечает за учётные записи сотрудников, группы и их права, а также за организационную структуру компании. Здесь настраивается:

- жизненный цикл пользователя (создание, профиль, увольнение, восстановление, экспорт);
- структуру и типы групп, вложенность и доменные ограничения;
- организационную структуру (подразделения, должности, связи с группами);
- рабочие места групп (`UserGroupSettings`) и дефолты для новых пользователей;
- роль-модель (`roles` / `rolePowers` / `roleUser`).

Домен использует **все три механизма администрирования**:

1. автоадминка (`dbadmin`) для конфигурационных таблиц;
2. EntityEditor (JSON-схемы) для ролей/типов/настроек;
3. специализированные Admin API контроллеры для операций, где CRUD-формы недостаточно.



В этом документе фокус только на настройках и диагностике мисконфигураций.

## Как открыть администрирование

Режим администрирования открывается из персонального меню — клик по аватару в панели навигации → пункт **«Админ»**. Пункт доступен только участникам группы администраторов. Настройки этого домена находятся в разделах административного меню **«Пользователи и группы»**, **«Группы»** и **«Рабочее место»**.

**Что администратор делает сам, а что — через поддержку 1Ф.** Через интерфейс администратор управляет пользователями, группами и правами, оргструктурой, рабочими местами групп, синхронизацией с AD/LDAP и импортом. Правки на уровне платформы (код, смарт-логика ядра) и операции с БД, не описанные в этом руководстве, выполняются через поддержку 1Формы.

К настройкам конкретного пользователя можно перейти и из пользовательского режима — по кнопке-шестерёнке «Перейти в администрирование пользователя» рядом с его именем в профиле.

![Переход к настройкам пользователя из профиля в пользовательском режиме](https://help.1forma.ru/help-images/users-and-groups/user_profile_admin_settings.png)

> ⚠️ Не меняйте настройки системных учётных записей `support`, `systemrobot`, `anonymous` — это может нарушить работу системы. Восстановление такой записи сбрасывает все её настройки.

## Механизмы администрирования

Настройки домена доступны через три механизма: автоадминку (формы над таблицами БД), EntityEditor (редактирование справочников по JSON-схемам) и специализированные Admin API контроллеры. Ниже — карта форм, схем и контроллеров.

### Автоадминка (dbadmin)

Перечень форм автоадминки с указанием целевой таблицы БД, числа полей и зависимостей.

| Alias формы | Название | Таблица БД | Полей | Секций | Deps |
|---|---|---|---:|---:|---|
| `users` | Пользователи | `dbo.Users` | 150 | 4 | см. `AdminFormSectionColumnsDeps` |
| `groups` | Группы | `dbo.Groups` | 10 | 1 | см. `AdminFormSectionColumnsDeps` |
| `workplaces` | Рабочие места | `dbo.UserGroupSettings` | 45 | 5 | см. `AdminFormSectionColumnsDeps` |
| `users-new-default-settings` | Настройки по умолчанию¹ | `dbo.UsersNewDefaultSettings` | 38 | 5 | см. `AdminFormSectionColumnsDeps` |
| `org-structure` | Орг.структура | `dbo.OrgStructureUnit` | 19 | 2 | см. `AdminFormSectionColumnsDeps` |
| `org-structure-type` | Типы орг.структуры | `dbo.OrgStructureType` | 8 | 1 | см. `AdminFormSectionColumnsDeps` |
| `org-structure-appointment` | Должности | `dbo.OrgStructureAppointment` | 4 | 1 | см. `AdminFormSectionColumnsDeps` |
| `rooms` | Список комнат | `dbo.Rooms` | 3 | 1 | — |
| `group-parents` | Состав группы | `dbo.GroupParents` | 4 | 1 | — |
| `group-domain-access` | Доступ к доменам | `dbo.GroupDomainAccess` | 6 | 1 | — |
| `group-users-membership` | История членства | `dbo.GroupUsersMembership` | 5 | 1 | — |
| `special-permissions` | Специальные права | `dbo.GroupSpecialPermissions` | 4 | 1 | — |
| `user-info-ext-values` | Расширенные свойства пользователя | `dbo.UserInfoExtValues` | 7 | 1 | — |
| `add-user` | Создать пользователя | `dbo.SummaryCategories` | 5 | 1 | — |

¹ Форма `users-new-default-settings` заменена на пользовательскую: позволяет выбирать группы пользователей в поле «Применить к группам» и массово применять настройки в трёх режимах (Notifications / Settings / All). Кнопка «Применить» неактивна без выбранной группы.

**Поиск в шапке формы.** Поле поиска выводится в шапке табличного представления только у трёх форм, и его смысл зависит от формы: у `subcategories` это поиск категории по идентификатору задачи, у `groups` и `workplaces` — поиск по пользователю, по ФИО или идентификатору. У остальных форм поля поиска в шапке нет, их таблица сужается обычными фильтрами по колонкам.

### EntityEditor

Справочники домена, редактируемые через EntityEditor по JSON-схемам.

| Схема JSON | Таблица | Handler/контур |
|---|---|---|
| `roles.json` | `dbo.Roles` | EntityModel + `api/admin/entityModel` |
| `rolePowers.json` | (связи полномочий ролей) | EntityModel + `api/admin/entityModel` |
| `roleUser.json` | (связи ролей и пользователей) | EntityModel + `api/admin/entityModel` |
| `groupType.json` | `dbo.GroupTypes` | EntityModel + `api/admin/entityModel` |
| `userSettings.json` | `dbo.UserSettings` | EntityModel + `api/admin/entityModel` |
| `userInfoExt.json` | (расширенные свойства пользователя) | EntityModel + `api/admin/entityModel` |

### Admin API контроллеры

Специализированные контроллеры Admin API, обеспечивающие операции, недоступные через автоадминку.

| Контроллер | Маршрут | Методы (укрупненно) | Назначение |
|---|---|---|---|
| `/api/admin/users` | `/api/admin/users` | `POST`, `GET`, `POST /{id}/fire`, `POST /{id}/unfire`, `POST /{id}/sync-with-ad` | создание/удаление/увольнение, перенос задач, синхронизация; в 1F Certificate Edition маршрут `sync-with-ad` отсутствует (404) |
| `UsersExportController` | `/api/admin/users/export` | `POST /excel` | выгрузка пользователей |
| `UsersProfilesController` | `/api/admin/users/{userId}/profile` | `POST` | обновление профиля |
| `UserAssistantsSettingsController` | `/api/admin/userassistants/settngs` | `GET`, `POST /save` | настройки заместителей |
| `UserNewDefaultSettingsController` | `/api/admin/users/default` | `GET/POST notifications`, `GET/POST settings`, `POST apply-to-groups` | дефолты новых пользователей; `apply-to-groups` — массовое применение настроек к выбранным группам (режимы All / Settings / Notifications) |
| `GroupsController` | `/api/admin/groups/` | `GET/POST`, `update`, `delete`, membership операции | CRUD групп, состав, иерархия, AD sync; маршрут `domains` в 1F Certificate Edition отсутствует (404) |
| `UserGroupSettingsController` | `/api/admin/user-group-settings` | `my-tasks-config`, `user-ui-settings`, `includes`, `reset` | управление РМГ (`UserGroupSettings`) |
| `GroupOnEntityPermissionsController` | `/api/admin/permissions` | `actions`, `get/set permissions`, `tsql-access-function` | матрица прав групп по сущностям |
| `EntityAccessController` | `/api/admin/entity-access` | `get/save`, `subcategory`, `allowedValueGroups` | тонкая матрица доступов |
| `/api/admin/org-structure` | `/api/admin/org-structure/` | дерево, CRUD оргюнитов, связи с группами, sync | оргструктура и привязки |

## Ключевые настройки

### 1. Создание пользователя

**В интерфейсе:** Администрирование → Пользователи → «Создать пользователя». Безусловно обязательные поля — **орг.единица, логин, пароль**; дополнительный набор (фамилия, псевдоним, e-mail, дата рождения) задаётся в Общих настройках приложения, блок «Обязательные поля профиля пользователя».

**Где настраивается:**

- автоадминка → форма `add-user`;
- Admin API → `POST /api/admin/users`;
- defaults → маршрут `/api/admin/users/default`.

![Форма «Создать пользователя» в админ-панели](https://help.1forma.ru/help-images/users-and-groups/admin_user_create.png)

**Таблицы:**

- `dbo.Users`;
- `dbo.UsersNewDefaultSettings`;
- связанные настройки в `dbo.UserSettings`.

**Что контролируется:**

- обязательный набор атрибутов карточки пользователя;
- применение дефолтов уведомлений/интерфейса;
- первичные связи с группой/оргструктурой.

**Критичные зависимости:**

- дефолты читаются из `users-new-default-settings` и API `/api/admin/users/default/*`;
- в набор дефолтов интерфейса входит настройка «Отображать вчера/сегодня/завтра в датах»: новый пользователь получает значение, заданное администратором в дефолтах, а если дефолт не задан — настройка включена; на странице «Настройки по умолчанию для новых пользователей» незаданный дефолт показывается включённым флажком, поэтому, чтобы новые пользователи получали настройку выключенной, достаточно снять флажок и сохранить;
- после создания часто требуется отдельная настройка ролей (`roleUser`) и расширенных свойств (`userInfoExt`).

**SQL-диагностика:**
```sql
select top (50) *
from dbo.Users;

select top (50) *
from dbo.UsersNewDefaultSettings;
```

### 2. Профиль пользователя

**В интерфейсе:** Администрирование → Пользователи → выбрать пользователя → карточка «Редактирование пользователя» (блоки Лицензии, Рабочее, География, Фото, Личное, Контакты, Прочее).

![Админ-форма редактирования пользователя: блоки Лицензии, Рабочее, География, Фото, Личное](https://help.1forma.ru/help-images/users-and-groups/admin_user_edit.png)

**Где настраивается:**

- автоадминка → `users`, `user-info-ext-values`;
- EntityEditor → `userInfoExt.json`;
- Admin API → `POST /api/admin/users/{userId}/profile`.

**Таблицы:**

- `dbo.Users`;
- `dbo.UserInfoExtValues`;
- `dbo.UserSettings`.

**Что контролируется:**

- ФИО и контактные поля;
- доп. атрибуты карточки (в т.ч. пользовательскые);
- профильные/персональные параметры UI.

**Критичные зависимости:**

- набор отображаемых полей зависит от конфигурации схемы EntityEditor;
- при массовом обновлении через формы и API важна согласованность типов и required-логики.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.UserInfoExtValues;

select top (100) *
from dbo.UserSettings;
```

**Приватность даты рождения и активность:**

| Ключ / объект | Назначение |
|---|---|
| `HideBirthYear` | Скрывает от других пользователей только год рождения |
| `HideBirthDate` | Полностью скрывает дату рождения для других. Доступен пользователю для изменения **всегда**, даже если администратор запретил редактирование блока «Личное» (`CanEditPrivateInfo = false`). Для администраторов дата рождения остаётся видна |
| `dbo.UserActivityInSystem`, `Users.LastOnlineTime` | Фиксация активности пользователя (время последнего входа в систему) |

**Действие «Запросить согласие на обработку персональных данных повторно» (с 2.268.339).** В карточке пользователя AdminSPA (вкладка профиля, блок служебных действий) доступна кнопка, сбрасывающая флаг принятого согласия у выбранного пользователя — `Users.IsAgreeToStorePersonalData` → `0`. При следующем входе пользователь снова увидит блокирующее окно подтверждения согласия. Действие вызывает `POST /api/admin/users/{userId}/personal-data-consent/reset`. Подробное описание самого окна согласия — в [auth/business.md](https://help.1forma.ru/domains/auth/business.md), раздел «Согласие на обработку персональных данных».

#### Вкладки карточки пользователя

Карточка пользователя открывается с набором вкладок: «Профиль», «Перс. настройки», «Группы», «Расширенные свойства», «Журнал», «Сервис» и «Прочее».

Над содержимым карточки выводится одна цепочка хлебных крошек: значок «домой», «Пользователи» и имя пользователя с идентификатором в скобках. «Пользователи» ведёт в реестр пользователей, имя — на саму карточку. Переключение вкладок цепочку не меняет: третьего уровня в ней нет.

Над вкладками выводится заголовок сотрудника: аватар и имя с идентификатором в скобках. Аватар компактный, скруглённый квадрат; если фото не загружено, показываются инициалы. Подробности — в разделе «Аватар пользователя» в frontend.md.

Переключение вкладки и уход с карточки при несохранённых изменениях перехватываются окном «Сохранить / Не сохранять / Отмена»; то же окно появляется, когда вкладка меняется извне — переходом по ссылке с параметром вкладки. Состав кнопок и поведение каждой — в [business.md](https://help.1forma.ru/domains/users-and-groups/business.md).

Третий уровень появляется на отдельных страницах настроек пользователя, которые открываются по прямому адресу вида `/administration/user-edit/{идентификатор}/{страница}`. На странице «Сервис» он так и называется — «Сервис», совпадает с заголовком страницы и переводится на язык интерфейса. На остальных таких страницах третьим уровнем выводится название соответствующей формы администрирования, поэтому при переименовании формы меняется и текст крошки.

Вкладка «Группы» показывает все группы, в которых состоит пользователь, с переключателем членства; рядом — кнопки «Синхронизировать группы с AD», «История» и «Добавить». В 1F Certificate Edition синхронизация членства с каталогом не выполняется: кнопка «Синхронизировать группы с AD» остаётся в интерфейсе и возвращает ошибку 404, состав групп задаётся вручную.

![Вкладка «Группы» карточки пользователя со списком групп и переключателями членства](https://help.1forma.ru/help-images/users-and-groups/user_group001.png)

В диалоге «Добавить группы» в поле выбирается одна или несколько групп для добавления пользователю.

<img src="https://help.1forma.ru/help-images/users-and-groups/user_group-3.png" alt="Диалог «Добавить группы» для добавления пользователя в группы" width="820">

Кнопка «История» открывает журнал членства: по каждой группе указан период «С … По …», включая завершённые членства.

![Журнал членства пользователя в группах с периодами «С … По …»](https://help.1forma.ru/help-images/users-and-groups/user_group-2.png)

Вкладка «Расширенные свойства» отображает значения дополнительных атрибутов пользователя: свойство, значение, порядок, числовое и логическое представление.

![Вкладка «Расширенные свойства» со значениями дополнительных атрибутов пользователя](https://help.1forma.ru/help-images/users-and-groups/user_extra-1.png)

Вкладка «Прочее» сводит источники прав пользователя — доступ к доменам, специальные права и подписи — и показывает, через какие группы они назначены.

![Вкладка «Прочее» карточки пользователя: доступ к доменам, специальные права и подписи](https://help.1forma.ru/help-images/users-and-groups/user_others.png)

### 3. Увольнение пользователя (`fire`)

**Где настраивается:**

- Admin API → `POST /api/admin/users/{userId}/fire`;
- Admin API → `POST /api/admin/users/{userId}/firenow`;
- Admin API → `POST /api/admin/users/{userId}/unfire`.

![Реестр «Пользователи» в админ-панели — отсюда открывают карточку и увольняют](https://help.1forma.ru/help-images/users-and-groups/admin_users_registry.png)

**Таблицы/контур:**

- `dbo.Users`;
- история членства: `dbo.GroupUsersMembership`;
- сопутствующие таблицы задач/подписок (по сценарию переназначения).

**Что контролируется:**

- queued/sync увольнение;
- переназначение задач;
- восстановление пользователя.

**Критичные зависимости:**

- увольнение и удаление пользователя — разные операции;
- при `fire` важно корректно задать правила по задачам и группам.

- увольнение единственного неуволенного участника группы администраторов со снятием его членства отклоняется: отказ `errCantDeleteLastUser` — «Из данной группы нельзя удалить последнего пользователя» — приходит и от кнопки «Уволить немедленно», и при постановке в очередь кнопкой «Уволить», остальные записи очереди обрабатываются; пользователь остаётся неуволенным и в своих группах.

**Открытые вопросы уволенного (с 2.268.336).** При увольнении `UserFireService` для каждого открытого входящего вопроса, где уволенный был реальным адресатом (`cr.NeedsAnswer = 1, cr.HasToAnswer = 1`), снимает только его флаг `cr.HasToAnswer = false`. Остальные реальные адресаты того же `commentId` сохраняют `cr.NeedsAnswer = 1, cr.IsAnswered = 0, cr.HasToAnswer = 1` — для них вопрос остаётся открытым. `Comments.IsAnswered = true` ставится только если ни у одного другого адресата не осталось `HasToAnswer = 1`. Дополнительно служебный reply «адресат уволен» теперь публикуется **во всех** входящих уволенного, а не только в тех, где он был единственным адресатом, как было до 2.268.336. До 2.268.336 из-за рассинхрона `CommentRecipients` фоновая процедура архивации через 30 дней могла переносить целые группы получателей в архив — фикс закрыл потерю открытых вопросов у коллег уволенного.

**Групповые чаты, накопленные до текущего обновления.** Одноразовая обработка при обновлении платформы снимает подписки уволенных с **незакрытых** групповых чатов и меняет владельца чата, если владелец уволен. Она выполняется сама и не зависит от галок в диалоге увольнения; повторяется при следующих запусках, пока не отработает весь объём. Личные чаты и закрытые задачи-чаты не затрагиваются. Правила — в [chat/business.md](https://help.1forma.ru/domains/chat/business.md), техническое описание и отчёт в журнале административных действий — в chat/backend.md.

**Персональные настройки уведомлений, ленты и мобильного приложения.** При увольнении очищаются строки пользователя в `dbo.UserNotifications` (флаги уведомлений по типам событий), `dbo.UserLentaCommentTypes` (подписки на типы комментариев в ленте) и `dbo.UserMobileAppsSettings` (настройки мобильного приложения). Очистка выполняется **только при реальном увольнении** — когда установлен признак «пометить как уволенного». У операции есть второй режим, снятие обязательств без увольнения: учётная запись остаётся активной и через восстановление не проходит, поэтому её настройки не трогаются. При восстановлении эти три набора заполняются заново значениями по умолчанию (`SetDefaultUserNotificationSettings`), а не прежними персональными значениями.

Очистка выполняется по трём таблицам, и все три восстанавливаются из настроек по умолчанию: `dbo.UserNotifications` — из `dbo.DefaultNotifications`, `dbo.UserLentaCommentTypes` — из `dbo.DefaultUserLentaCommentTypes`, `dbo.UserMobileAppsSettings` — из `dbo.DefaultUserMobileAppsSettings`. Дефолты администрируются на странице настроек по умолчанию для новых пользователей и применяются одинаково — и при заведении нового пользователя, и при восстановлении уволенного.

У этой очистки есть тонкость, которую стоит знать при разборе жалоб «пропали уведомления». Строка настройки существует не для каждого типа: если у типа комментария и значение по умолчанию «выключено», приложение такую строку не создаёт и не хранит. Поэтому у здорового активного пользователя строк в `dbo.UserNotifications` меньше, чем типов уведомлений, и это норма, а не пропуск. Пробел — когда строк нет вообще или нет строк по типам, у которых в `dbo.DefaultNotifications` включён конверт или push: по таким типам уведомления не приходят.

Проверить набор строк по пользователю:

```sql
-- Какие типы настроены у пользователя
select CommentTypeId, Roles, Envelope, Push
from dbo.UserNotifications
where UserId = @userId
order by CommentTypeId;

-- Чего не хватает из типов, у которых дефолт включён
select d.CommentTypeId, d.Envelope, d.Push
from dbo.DefaultNotifications d
where (d.Envelope = 1 or d.Push = 1)
  and not exists (select 1 from dbo.UserNotifications un
                  where un.UserId = @userId and un.CommentTypeId = d.CommentTypeId);
```

В диалоге увольнения выбирают, что сделать с группами, уведомлениями, ролями, подписями и активными задачами уволенного, и сразу переназначают исполнителя или заказчика. Кнопка «Уволить» ставит задание в очередь, «Уволить немедленно» выполняет операцию сразу.

![Диалог увольнения пользователя: флаги обработки групп, уведомлений, ролей, подписей и переназначение задач](https://help.1forma.ru/help-images/users-and-groups/user_profile_edit-03-0.png)

**SQL-диагностика:**
```sql
select top (100) *
from dbo.GroupUsersMembership;

select top (100) *
from dbo.Users;
```

### Вкладка «Сервис»: операции над учётной записью

На вкладке «Сервис» карточки пользователя собраны действия над учётной записью: копирование прав, подписание на задачи, перенос задач, назначение исполнителем, настройка заместителей, синхронизация с AD, а также увольнение и удаление.

![Вкладка «Сервис» карточки пользователя с действиями над учётной записью](https://help.1forma.ru/help-images/users-and-groups/user_service-00.png)

«Копировать права» переносит на текущего пользователя выбранные настройки другого: автоподписку, уведомление о новых задачах, автоназначение исполнителем, активные подписи и орг. единицы.

![Диалог «Копирование прав от другого пользователя»](https://help.1forma.ru/help-images/users-and-groups/user_service-02.png)

«Подписать пользователя» массово подписывает выбранного пользователя или группу на задачи указанной категории — где он исполнитель, заказчик или подписчик.

![Диалог «Подписать пользователя на задачи»](https://help.1forma.ru/help-images/users-and-groups/user_service-03.png)

«Перенос задач на другого пользователя» переназначает исполнителя и/или заказчика во всех задачах пользователя; при необходимости отписывает его от задач.

![Диалог «Перенос задач на другого пользователя»](https://help.1forma.ru/help-images/users-and-groups/user_service-04.png)

«Назначить исполнителем» добавляет выбранного пользователя или группу соисполнителем в задачи, где исполнителем является текущий пользователь.

![Диалог «Назначить исполнителем в задачи другого пользователя»](https://help.1forma.ru/help-images/users-and-groups/user_service-05.png)

«Заместители» задаёт пользователей, замещающих сотрудника в задачах на время его отсутствия.

![Диалог «Заместители» в настройках пользователя](https://help.1forma.ru/help-images/users-and-groups/user_service-06.png)

«Удалить пользователя» требует подтверждения в диалоге и удаляет учётную запись безвозвратно. После успешного удаления карточка не остаётся открытой: интерфейс переходит на грид реестра «Пользователи» — в обычном режиме и в режиме без фрейма (`noframe`) используется соответствующий маршрут грида.

Удалить собственную учётную запись нельзя: попытка отклоняется с сообщением об ошибке, и ни одна строка членства не удаляется. После удаления учётной записи кеш администраторов перезаливается, поэтому снятые у неё права пропадают сразу.

**Очистка индивидуальных групп при удалении пользователя.** Вместе с удалением учётной записи в одной транзакции выполняется автоматическая очистка индивидуальных групп:

- группы, в которых удаляемый пользователь был **единственным участником**, удаляются из системы безвозвратно вместе со своими связями;
- группы, где помимо удаляемого пользователя состоят другие сотрудники, **не удаляются**: из них исключается только удаляемый пользователь, а состав и права остальных участников сохраняются;
- если у индивидуальной группы настроено рабочее место, срабатывает защита от удаления такой группы: удаление учётной записи прерывается с ошибкой и откатывается целиком. Чтобы удалить такую учётную запись, сначала снимите рабочее место группы.

### 4. Группы и иерархия

**В интерфейсе:** Администрирование → Группы. Здесь создаются группы, задаётся тип, состав участников и вложенность (вкладка состава / «Входит в»). Права на категории и межгрупповые права настраиваются на вкладках самой группы.

В шапке списка есть поиск по пользователю: он оставляет только группы, где этот пользователь состоит. Правила ввода — в §14.

**Где настраивается:**

- автоадминка → `groups`, `group-parents`;
- EntityEditor → `groupType.json`;
- Admin API → `/api/admin/groups/*`.

![Реестр «Группы» в админ-панели](https://help.1forma.ru/help-images/users-and-groups/admin_groups_registry.png)

**Таблицы:**

- `dbo.Groups`;
- `dbo.GroupParents`;
- `dbo.GroupTypes`.

**Что контролируется:**

- свойства группы;
- тип группы (поведение в интерфейсе/получателях);
- вложенность и наследование прав.

![Вкладка «Свойства» группы: название, тип, домен, SID в AD и связь с орг. единицей](https://help.1forma.ru/help-images/users-and-groups/groups_properties-04.png)

**Несохранённые изменения и связь с орг. единицей.** К несохранённым изменениям на вкладке «Свойства» относится и выбор орг. единицы для связи с группой: после выбора форма считается изменённой, и переключение вкладки, возврат к списку групп или уход со страницы перехватываются окном «Сохранить изменения». «Сохранить» передаёт выбранную орг. единицу на сервер и выполняет переход только после успешной записи, «Не сохранять» переходит без записи, «Отмена» оставляет на вкладке. Кнопка «Разорвать связь» отвязывает орг. единицу сразу и этого окна не вызывает.

**Критичные зависимости:**

- вложенные группы расширяют effective-permissions;
- невалидная иерархия приводит к избыточному или недостаточному доступу.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.Groups;

select top (100) *
from dbo.GroupParents;
```

#### Управление составом и копиями группы

Вкладка «Состав» группы показывает её участников — пользователей и вложенные группы.

![Вкладка «Состав» группы со списком участников и вложенных групп](https://help.1forma.ru/help-images/users-and-groups/groups_control02.png)

Отмеченные строки удаляют кнопкой «Удалить выбранное».

![Удаление отмеченных участников из группы](https://help.1forma.ru/help-images/users-and-groups/groups_control03.png)

«Скопировать права и связи» переносит на текущую группу права и связи другой группы — источник указывается по названию или ID.

![Диалог «Скопировать права и связи» с выбором группы-источника по названию или ID](https://help.1forma.ru/help-images/users-and-groups/groups_control07.png)

«Создать дубль группы» создаёт копию группы со всеми настройками и правами под новым названием.

![Диалог «Создать дубль группы»](https://help.1forma.ru/help-images/users-and-groups/groups_control08.png)

Кнопка «История» на вкладке «Состав» открывает журнал членства группы: по каждому участнику показан период членства «С … По …», включая завершённые членства. Это та же история членства, что доступна на вкладке «Группы» карточки пользователя, но в разрезе выбранной группы.

Кнопка «Добавить» на вкладке открывает окно «Добавить участников»: в поле «Участники» выбираются и пользователи, и группы — вложенная группа добавляется единым объектом.

**Самовложение и цикл в иерархии.** Группу нельзя вложить в саму себя или в группу, которая уже входит в неё — прямо или через другие группы: в иерархии образовался бы цикл. В списке кандидатов окна такие варианты не предлагаются — сервер отдаёт его уже без текущей группы и всех её предков. Проверка на сервере остаётся обязательной и выполняется для каждой новой связи «дочерняя группа — родительская группа»: недопустимая пара отклоняется сообщением «Невозможно вложить группу: обнаружена циклическая ссылка», связь не создаётся. Если в одном добавлении выбрано несколько групп и недопустима хотя бы одна пара, не вкладывается ни одна из них. Повторное добавление уже вложенной группы ошибкой не считается. Пользователи и группы из окна уходят на сервер двумя вызовами, поэтому при отказе по группам отмеченные пользователи уже добавлены.

То же правило действует в смарт-действии «Вложить группы в группы» — см. [справочник смарт-действий](https://help.1forma.ru/domains/smart-actions/actions-reference-people.md). Проверка срабатывает при добавлении связи: уже существующие циклы она не пересчитывает.

Синхронизация с AD проверку теперь проходит — недопустимая пара не записывается:

- Самовложение или цикл через предка пропускается с предупреждением в журнал ADSync, остальные связи той же группы синхронизируются, исключение не бросается.
- Проверка вынесена в общее правило `AdminGroups.IsCircularGroupReference` — рекурсивный обход предков по `dbo.GroupParents` без искусственного лимита глубины, защищённый от зацикливания, на MSSQL и PostgreSQL; закрыты обе точки вставки в `ADSync.cs` (путь по `member` и путь по `memberOf`).
- На иерархии глубже 25 уровней поведение изменилось: ручное «добавить группу в группу» раньше проходило (обход предков был ограничен глубиной 25), теперь отклоняется той же ошибкой «Невозможно вложить группу: обнаружена циклическая ссылка».
- Диагностика: в журнале ADSync искать предупреждение «Связь вложенности групп (ParentId=…, ChildId=…) пропущена».
- Утилита переноса (`DBProvider.cs`) остаётся без проверки на вставке — это принятый остаток решения, а не дефект правки.
- Защита обхода в процедуре пересчёта состава `dbo.tc_UpdateGroupMembership` пришла отдельным сценарием. Пересчёт состава обходит `dbo.GroupParents` рекурсивно, и цикл в иерархии делал этот обход незавершаемым: на MSSQL с `option (maxrecursion 0)`, на PostgreSQL — рекурсивным запросом без защиты пути. Теперь в рекурсивной части обеих версий процедуры накапливается пройденный путь и повтор узла отсекается: на MSSQL — строка `PPath` с проверкой `charindex(...) = 0`, на PostgreSQL — массив `integer[]` с `not (ChildId = any(PPath))`. Ограничение `maxrecursion 0` сохранено, глубина корректной иерархии не ограничена: состав групп на работающих площадках считается как раньше.

**Цикл в иерархии на площадке.** Если цикл в `dbo.GroupParents` уже есть — например, связь попала вставкой в обход окон «Добавить участников», так как утилита переноса проверку не выполняет, — пересчёт состава группы завершается, а не считает бесконечно. Новые циклы по-прежнему не создаются при ручном добавлении, в смарт-действии «Вложить группы в группы» и при синхронизации с AD. Уже существующий цикл эта проверка не устраняет: она защищает обход, а саму циклическую связь нужно удалить на вкладке «Состав».

**Диагностика цикла.** Если пересчёт состава группы не завершается или загружает СУБД, проверьте иерархию: `select top (100) * from dbo.GroupParents;`. Запуск, который раньше «висел» на цикле, теперь завершается — обход не повторяет уже пройденный узел.

#### Удаление группы

Удаляет только администратор системы. Удаление отклоняется, если у группы настроены рабочие места (сначала удаляют РМ), а также для группы администраторов, системной группы всех пользователей и групп, помеченных нередактируемыми.

В остальных случаях группа и её связи удаляются одной транзакцией: членство и вложенность, права на категории, ДП и другие группы, роли, доступ к сводным категориям, видимость календаря и портальных блоков, избранное и папки избранного, подписки на рассылки, права на теги и аннотации отчётов. Ссылки на группу в чужих настройках обнуляются: у категории снимается ответственная группа, у шага маршрута — группа, из которой берутся исполнители, у орг.единицы — связь с группой. Событие пишется в журнал администрирования.

Правило одно и то же независимо от точки входа — и на странице групп, и в форме автоадминки `groups`.

### 5. Рабочие места группы (`UserGroupSettings`)

**В интерфейсе:** Администрирование → Рабочее место. Рабочее место задаёт интерфейс и стартовую страницу для участников группы; полный набор параметров — в разделе 13.

В шапке списка есть поиск по пользователю: он оставляет только рабочие места групп, где этот пользователь состоит. Правила ввода — в §14.

**Где настраивается:**

- автоадминка → `workplaces`;
- Admin API → `/api/admin/user-group-settings/*`.

![Групповые настройки пользователей (рабочее место) в админ-панели](https://help.1forma.ru/help-images/users-and-groups/admin_workplace.png)

**Таблица:**

- `dbo.UserGroupSettings` (45 полей, 5 секций).

**Что контролируется:**

- UI/UX для группы;
- `my-tasks-config` и `user-ui-settings`;
- includes (CSS/JS) и chat-subcategories.

**Критичные зависимости:**

- группа может переопределять пользовательские настройки;
- конфликт РМГ при членстве в нескольких группах влияет на итоговый UI.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.UserGroupSettings;

select count(*) as Cnt
from dbo.UserGroupSettings;
```

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

**Где настраивается:**

- автоадминка → `users-new-default-settings`;
- Admin API → `/api/admin/users/default/notifications` и `/settings`.

![Настройки по умолчанию для новых пользователей (редактирование уведомлений)](https://help.1forma.ru/help-images/users-and-groups/admin_default_settings.png)

**Таблица:**

- `dbo.UsersNewDefaultSettings`.

**Что контролируется:**

- стартовые уведомления;
- стартовые пользовательские settings;
- поведение при восстановлении уволенного пользователя.

**Критичные зависимости:**

- изменения не мигрируют автоматически старых пользователей;
- несогласованные дефолты создают дрейф конфигурации между «старыми» и «новыми» пользователями.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.UsersNewDefaultSettings;
```

### 7. Оргструктура и должности

> Выделено в отдельный домен: **domains/org-structure/** — полная документация по слоям (business, admin, backend, database, data-flow, frontend, sync, ext-param-integration).

**В интерфейсе:** Администрирование → Пользователи и группы → **Типы орг.структуры** (уровни иерархии) и **Орг. структура** (дерево подразделений и должностей). Сначала настраивают типы, затем строят дерево.

![Админ-форма «Редактирование орг структуры»: вкладки «Настройки» и «Состав»](https://help.1forma.ru/help-images/users-and-groups/admin_orgstructure.png)

**Где настраивается:**

- автоадминка → `org-structure`, `org-structure-type`, `org-structure-appointment`;
- Admin API → `/api/admin/org-structure/*`.

**Таблицы:**

- `dbo.OrgStructureUnit`;
- `dbo.OrgStructureType`;
- `dbo.OrgStructureAppointment`.

**Что контролируется:**

- дерево подразделений;
- типизация узлов;
- должности и связи с группами;
- sync group-membership из оргструктуры.

**Критичные зависимости:**

- ошибки связей unit↔group влияют на членство пользователей;
- смена типа/родителя узла может менять доступность потомков в UI.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.OrgStructureUnit;

select top (100) *
from dbo.OrgStructureType;

select top (100) *
from dbo.OrgStructureAppointment;
```

### 8. Роли (roles / powers / users)

**Где настраивается:**

- EntityEditor → `roles.json`, `rolePowers.json`, `roleUser.json`;
- дополнительная проверка через API прав (`/api/admin/permissions`, `/api/admin/entity-access`).

**Таблицы/контур:**

- `dbo.Roles`;
- таблицы связей ролей и полномочий;
- таблицы связей ролей и пользователей.

**Что контролируется:**

- справочник ролей;
- набор полномочий роли;
- назначение ролей пользователям.

**Критичные зависимости:**

- назначение роли без набора powers не дает ожидаемого эффекта;
- роль может конфликтовать/дополняться групповыми правами.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.Roles;
```

**Журналирование операций с ролями.**

Сохранение карточки роли в редакторе сущностей оставляет ровно одну запись в общем журнале административных действий (`ActionLog`): структурированный YAML-дифф с идентификатором роли и текстовый комментарий. Состав записи зависит от того, что изменили:

- создание и удаление роли — тип операции `role_create` и `role_delete`;
- правка полей роли — по каждому изменённому полю пара значений до и после (`before` / `after`);
- изменение набора полномочий — блок `role_power` с перечнем добавленных, изменённых и снятых прав (`items_added` / `items_updated` / `items_deleted`), каждое право названо своим именем;
- изменение состава «Пользователи и группы» — блок `role_user` с добавленными, изменёнными и снятыми связками, каждая подписана идентификаторами пользователя и группы.

За одно сохранение пишется одна запись, даже если изменилось несколько назначений: идентификаторы пользователя и группы в самой записи (`UserID` / `GroupID`) заполняются по первому добавленному назначению, а если добавлений не было — по первому снятому. Полный список изменённых связок остаётся в YAML-диффе; эти поля не дублируют каждое назначение. Сохранение карточки без фактических изменений записи в журнал не создаёт.

### 9. Доступ к доменам

**Где настраивается:**

- автоадминка → `group-domain-access`;
- групповой контур API (`/api/admin/groups/domains`).

![Доступ группы к доменам в админ-панели](https://help.1forma.ru/help-images/users-and-groups/admin_group_domains.png)

**Таблица:**

- `dbo.GroupDomainAccess`.

**Что контролируется:**

- привязка групп к доменам (в т.ч. AD/LDAP-контур);
- разрешенная область аутентификации/синхронизации.

**Критичные зависимости:**

- некорректный domain mapping ломает ожидания по входу/синхронизации;
- требуется проверка настроек синхропрофилей.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.GroupDomainAccess;
```

### 10. Специальные права

**В интерфейсе:** Администрирование → Группы → выбранная группа → вкладка **«Специальные права»**. Спецправа выдаются группе и действуют на всех её участников.

Вкладка показывает связь «группа — специальное право» в двух срезах, переключатель — в шапке: «Спецправа по группам» (слева группы, справа их права) и «Группы по спецправам» (слева права, справа группы, у которых право есть). В обоих срезах есть поиск по списку, право выдаётся и снимается тумблером, изменение уходит на сервер сразу.

Та же форма умеет работать с фильтром по конкретному пользователю: она показывает его действующие спецправа и группы, из которых они пришли, а тумблеры в этом режиме недоступны — только просмотр.

**Где настраивается:**

- автоадминка → `special-permissions`;
- API прав → `/api/admin/permissions`.

**Таблица:**

- `dbo.GroupSpecialPermissions`.

**Что контролируется:**

- точечные special-actions для групп;
- исключения из стандартной ролевой модели.

**Критичные зависимости:**

- спецправо может обходить базовые ожидания UI/доступа;
- проверять в связке с membership группы и entity-access.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.GroupSpecialPermissions;
```

**Известные спецдействия (мнемоники):**

| Мнемоника | Описание |
|---|---|
| `VIEWORGSTRUCTITEMSINCONTACTS` | Видеть оргструктуру (должность/подразделение) в карточке/справочнике сотрудников |
| `PROHIBITIONVIEWMOBILEPHONES` | Запрет на просмотр мобильных телефонов (инвертированное право). Сильнее права «видеть скрытый мобильный» и флага «Скрыть мобильный»: номер не отдаётся ни в одном месте выдачи, даже если владелец номер не скрывал. На собственный номер смотрящего не действует. Правило целиком — [business.md «Видимость мобильного телефона»](https://help.1forma.ru/domains/users-and-groups/business.md#видимость-мобильного-телефона) |
| `NOTVIEWUSERINFO` | Запрет на просмотр общей информации о пользователе (инвертированное право) |
| `VIEWEMPLOYEESHIDDENINFOCELLPHONE` | Видеть скрытый мобильный телефон — пробивает флаг `Users.RestrictCellPhoneView = 1`. Применяется во всех местах выдачи мобильного номера: карточка пользователя, профиль, списки и контакты, коллеги, мобильный поиск и справочник сотрудников. Полное название в UI: «Видеть скрытую информацию пользователей/сотрудников в контактах (ФИО, кабинет, компьютер, поиск уволенных)». Введено в задаче #2080210 (v2.267) |
| `VIEWGENERALINFORMATION` | Видеть общую информацию пользователей. Используется в каскадных фильтрах справочника (см. `@CanViewUserInfoF`) и в API поиска контактов `/app/v1.0/api/mobile/users/search` — пользователи без `IsEmployee` видят в результатах только тех, на чьи группы у них есть это межгрупповое право (см. [groups-visibility-auto-creation.md § Видимость в API поиска контактов](https://help.1forma.ru/domains/users-and-groups/groups-visibility-auto-creation.md#видимость-в-api-поиска-контактов-mobileuserssearch)) |

**Резолв спецдействия в коде:**
```sql
-- через функцию dbo.HasUserSpecialAction(@UserId, 'MNEMO')
declare @HasViewHiddenCellPhoneF bit;
select @HasViewHiddenCellPhoneF = ViewHiddenCellPhone.HasActionF
from dbo.HasUserSpecialAction(@UserID, 'VIEWEMPLOYEESHIDDENINFOCELLPHONE') ViewHiddenCellPhone;
```

Подробнее о правиле видимости мобильного номера — [business.md «Видимость мобильного телефона»](https://help.1forma.ru/domains/users-and-groups/business.md#видимость-мобильного-телефона).

### 11. Синхронизация с AD/LDAP

**Где настраивается:**

- маршруты `/api/admin/groups/ad/sync-all-groups`, `/api/admin/groups/domains`;
- `/api/admin/users`: `/api/admin/users/{userId}/sync-with-ad`;
- профильные настройки групп/пользователей в админ-формах.

**Контур данных:**

- групповые и пользовательские записи;
- доменные привязки;
- sync-профили интеграции.

**Что контролируется:**

- наполнение пользователей/групп из внешнего каталога;
- согласованность membership в локальной БД.

**Критичные зависимости:**

- без корректной конфигурации домена и профиля синхронизация частично успешна;
- после sync требуется сверка фактического состава групп.
- ручная синхронизация всех групп обходит все активные профили Active Directory и OpenLDAP; сбой одного профиля не прерывает остальные, номера упавших профилей перечисляются в сообщении об ошибке, подробности — в журнале ошибок.

**Автосинхронизация при создании пользователя.** Созданный администратором пользователь, связанный с каталогом, синхронизируется с профилем сразу, не дожидаясь планового прогона. Профиль выбирается по полю «Домен пользователя»: у пользователя OpenLDAP там имя службы каталога, у пользователя Active Directory — домен. Для профиля OpenLDAP автосинхронизация выполняется только при создании из административного интерфейса; при импорте и создании смарт-действием она не запускается. Если имя службы не заполнено или активных профилей OpenLDAP с таким именем несколько, пользователь создаётся, а синхронизация пропускается.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.Groups;

select top (100) *
from dbo.GroupUsersMembership;
```

**Автоматическое увольнение при деактивации в AD** — три способа:

1. **Перемещение в OU уволенных** (`distinguishedName`): пользователь переносится в подразделение уволенных (например, `OU=Dismissed Users`). Расширенное свойство `distinguishedName` маппится из AD; публикация + задание по таймеру увольняет по SQL-условию `UserInfoExtValues.Value LIKE '%OU=Dismissed Users%'`.
2. **Группа деактивации**: в 1Ф создаётся группа, синхронизированная с AD-группой уволенных; циклическое смарт-расписание увольняет её членов.
3. **Признак отключённой записи** (`userAccountControl`): параметр синхронизируется в расширенное свойство. Битовая маска: `514` = NORMAL + DISABLE, `66050` = NORMAL + DONT_EXPIRE + DISABLE. Смарт-расписание увольняет пользователей с `UserInfoExtValues.IntValue IN (514, 66050)`. Используется при отсутствии групп уволенных в AD.

### 12. Комнаты (Rooms)

**Где настраивается:**

- автоадминка → `rooms`.

![Список комнат в админ-панели](https://help.1forma.ru/help-images/users-and-groups/admin_rooms.png)

**Таблица:**

- `dbo.Rooms`.

**Что контролируется:**

- справочник переговорных/комнат;
- использование в календарных и бронировочных сценариях.

![Форма редактирования комнаты: идентификатор, название и признак «Актуальная»](https://help.1forma.ru/help-images/users-and-groups/org_structure_rooms2.png)

**Критичные зависимости:**

- дубликаты/неактивные записи приводят к ошибкам выбора комнаты в UI.

**SQL-диагностика:**
```sql
select top (100) *
from dbo.Rooms;
```

### 13. Рабочие места групп — детальная настройка

> Базовая архитектура и таблицы описаны в [разделе 5](#5-рабочие-места-группы-usergroupsettings). Здесь — полный набор параметров и правила их взаимодействия.

**Приоритет:** каждое рабочее место имеет целочисленный приоритет. При членстве пользователя в нескольких группах с разными настройками применяется рабочее место с **наибольшим приоритетом**. Личные настройки пользователя (профиль → вкладка «Вид» → блок «Стартовая страница») имеют **наивысший приоритет**.

#### Стартовая страница

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

| Тип | Описание | Поле «Значение» |
|-----|----------|-----------------|
| Портал | Открывается портальная страница | Номер портала |
| Лента | Лента задач и комментариев | — |
| Ссылка | Открывается указанная страница (только HTTPS; во фрейме с сохранением меню) | URL |

#### Основная панель — 7 элементов

Каждый элемент: Показывать / Не показывать / Не задано (наследуется от более приоритетного РМ). Управляет иконкой на основной панели и вкладкой в общем поиске.

| Элемент | При скрытии |
|---------|-------------|
| Кнопка создания | Скрыта кнопка «Создать» |
| Календарь | Скрыта вкладка календаря в поиске |
| Лента | Скрыта вкладка ленты в поиске |
| Сотрудники | Скрыта вкладка сотрудников в поиске, результаты по профилям отсутствуют |
| Поиск | Скрыта иконка поиска |
| Выбор языка | Скрыт переключатель языка |
| Чаты | Скрыта иконка чатов |

#### Панель навигации

Параметры управляют расположением, цветовым оформлением и режимом отображения панели навигации.

| Параметр | Значения |
|----------|----------|
| Положение | Сверху / Справа / Слева |
| Цвет | 15 вариантов: Нет / Бренд / Белый / Чёрный / Всегда белый / Всегда чёрный / Красный / Розовый / Фиолетовый / Синий / Голубой / Зелёный / Жёлтый / Оранжевый / Серый |
| Отображать всегда | Принудительно показывает панель навигации |

⚠️ **Настройки положения, цвета и «Отображать всегда» применяются только для новых пользователей.** Для существующих — использовать кнопки «Сбросить Положение», «Сбросить Цвет», «Сбросить Отображать всегда» после сохранения РМ.

#### Боковое меню — 6 блоков

Каждый блок: Показывать / Не показывать / Не задано.

| Блок | Спецправо с высшим приоритетом |
|------|-------------------------------|
| Категории | «Не видеть блок Категории в левом меню» |
| Избранное | — |
| Отчёты | «Не видеть блок Отчеты в левом меню» |
| Почта | «Не видеть блок Почта в левом меню» |
| Пространства | — |
| Лента корп. сети | — |

⚠️ **Специальные права группы имеют высший приоритет** над настройками РМ для блоков Категории, Почта, Отчёты.

**Критичный эффект скрытия Избранного и Категорий:**

- Избранное скрыто, Категории доступны → заголовок «Избранное» заменяется на «Категории», кнопка добавления избранного недоступна;
- Скрыты оба блока → остаются только блоки ссылок РМ, заголовок «Избранное», кнопка добавления отсутствует;
- Если в РМ не настроено ссылок → только папка «Мои задачи».

#### Просмотр задачи

Снизу справа / Во всплывающем окне. ⚠️ Только для новых пользователей; для существующих — кнопка «Сбросить Просмотр задачи».

#### Функции Диска

Один флаг управляет: пунктом «Диск» в меню сервисов, пунктом «Диск» в меню «Файлы» карточки задачи, **и** действиями с ДП «Файл», связанными с Диском.

#### Приоритет режима редактирования

Включает инлайн-редактирование в табличном представлении (double-click → редактирование ячейки). Пользователь может переключить режим для отдельной категории через панель инструментов табличного вида. Точечное управление — опция «Приоритетный режим таблицы» в настройках таблицы БИ.

#### Разрешить кастомизировать UI

При отключении блокируется 7 настроек интерфейса: положение/цвет шапки, формат дат, режим комментариев, блочные сообщения, режим задач, отображение имён. Остаётся только выбор темы. ⚠️ Только для новых пользователей; для существующих — кнопка «Сбросить UI-настройки».

#### Персональное меню

Видимость пункта «Табель трудозатрат»: Не задано / Показывать / Не показывать.

#### Профиль пользователя — 7 вкладок

Каждая вкладка: Не задано / Показывать / Не показывать. Вкладки: Заказчик, Исполнитель, Комментарии, Календарь, Журнал, Трудозатраты, Отчёт.

#### Настройки интерфейса

Детальный контроль — какие опции настроек интерфейса видны пользователю. При отключении всех — пункт «Настройки интерфейса» скрывается из персонального меню.

#### Мои задачи в избранном

Детальный контроль содержимого блока «Мои задачи». При отключении всех — блок скрывается.

#### JS/CSS вставки

Групповые JS/CSS-вставки применяются ко всей площадке включая навигацию. При нескольких рабочих местах применяются вставки РМ с **наибольшим приоритетом**.

#### Дополнительные категории чатов

Добавляет вкладки в разделе чатов для конкретных категорий. Располагаются после стандартных системных разделов.

#### Удаление РМ

Запрещено для групп с настроенными рабочими местами. Сначала удалить РМ, потом группу.

### 14. Избранное группы (UserLinks)

> Форма автоадминки `favourites` (таблица `dbo.UserLinks`) описана в **[../spaces/admin.md](https://help.1forma.ru/domains/spaces/admin.md)** — там же конфигурация SPA-страницы `/administration/favorites-groups`. Здесь — административные правила и типы ссылок.

**В интерфейсе:** Администрирование → «Избранное группы». На странице — список групп с их наборами избранного; по кнопке «+ Добавить» настраивается избранное для выбранной группы.

**Поиск групп по пользователю.** В шапке списка есть поле поиска: оно сужает список до групп, в которых состоит указанный пользователь. Ввести можно идентификатор пользователя — тогда он берётся как есть, — либо часть имени: по ней выполняется поиск сотрудников, и берётся первый найденный, поэтому при совпадении имён для точного выбора вводят идентификатор. Пустое поле возвращает полный список: на этой странице отбор идёт по уже загруженным группам, без повторного запроса. Если пользователь не найден или не состоит ни в одной группе списка, список пуст — без ошибки. То же поле есть в списках «Группы» (§4) и «Рабочее место» (§5).

![Страница «Избранное группы»: список групп с наборами избранного](https://help.1forma.ru/help-images/users-and-groups/admin_favorites_groups.png)

**Общие правила:**

- Один набор избранного на группу; пользователь в нескольких группах видит все наборы;
- **Папки с одинаковым именем из разных групп объединяются** (без дублирования ссылок);
- Допускается только **1 уровень вложенности** — папки + ссылки в них;
- Пустые папки не отображаются в UI.
- Если у группы задано имя избранного, оно становится корневой папкой: новые папки создаются внутри неё, а перенос папки на верхний уровень помещает её туда же — второй папки на корневом уровне не появляется.

#### Блок кнопок

Максимум 4 кнопки. Типы объектов — те же, что у блока ссылок. Порядок отображения задаётся полем `Order` (int) в DTO создания/обновления кнопки (`CreateFavoriteButtonRequestDto.Order`, задача #2089245) — кнопки сортируются по возрастанию.

**Приоритет иконок:** имя иконки из `spa/content-icons` → иконка аватара категории → стандартная.

#### Блок ссылок — 14 типов

Каждая ссылка в блоке настраивается на один из следующих типов объектов.

| Тип | Параметры |
|-----|-----------|
| Категория | ID категории + представление: Лента, Таблица, Календарь, Сводка, Ганта, Переписка, Иерархия, Канбан, Чаты, Канал, Ресурсы, Галерея, Соц. сети (14 представлений) |
| Раздел | ID раздела + те же 14 представлений; тип отображения «Содержимое» — папка с веткой вложенных разделов и категорий (см. ниже) |
| Новая задача | ID категории → карточка создания задачи |
| Отчёт | ID отчёта |
| Сводный раздел | ID сводного раздела |
| Портал | ID портала |
| Ссылка | Произвольный URL |
| Смарт-отбор | ID категории (с преднастроенными смарт-выражениями) |
| Пространство | Главная страница / конкретное пространство / страница пространства |
| Диск | Главная страница / папка диска |
| Календарь | Мой календарь / Мои события / Календарь другого пользователя |
| Чат | Раздел чатов / конкретный чат |

#### Тип отображения «Содержимое» для ссылки на раздел

У ссылки на раздел, кроме представлений, есть тип отображения «Содержимое». В избранном такая ссылка показывается папкой; при её открытии разворачивается ветка вложенных разделов и категорий, доступных пользователю для просмотра. Состав ветки соответствует видимой пользователю структуре раздела и обновляется вместе с ней; статистика и счётчики в узлах не считаются. Вложенные пространства открываются как пространства, обычные категории — в представлении по умолчанию, настроенном для категории. В форме ссылки тип выбирается и при добавлении, и при редактировании: указывается раздел, а в типе отображения — «Содержимое». Тип доступен и для раздела категорий, и для раздела пространств; в контрактах он называется `CategoryContent` (код 29).

**Специальный тип «Все разделы»:** `linkedObjectId = null` — показывает полный каталог разделов внутри блока Избранного. Позволяет разместить каталог выше личного избранного без перехода в пункт «Категории». После добавления каталог доступен прямо в блоке избранного группы, поэтому отдельный блок «Категории» в конце боковой панели для него не нужен. Пункт «Раздел+Все» доступен в выпадающем списке всегда, независимо от того, выбрано представление или нет; при его выборе поле «Представление» очищается, и представление для такой ссылки не задаётся. На открытие объектов это не влияет: клик по разделу открывает его, а по категории — представление по умолчанию, настроенное для неё. Ссылка сохраняется с пустым `linkedObjectId`, и при повторном редактировании вариант «Раздел+Все» восстанавливается. Тип выбирается и при добавлении, и при редактировании ссылки.

#### Предзаполнение дополнительных параметров (тип «Новая задача»)

Для ссылки/кнопки типа «Новая задача» в форме её добавления и редактирования доступно поле «Значения дополнительных параметров». Заданные значения подставляются в карточку создания задачи при клике по ссылке (в том числе при открытии в новой вкладке через Ctrl+клик). Значение хранится в каноническом виде `&ExtParamString=…` и передаётся в URL создания задачи. Формат строки `ExtParamString` (скаляр, multilookup, таблица) и правила применения — в [user-ui/admin.md](https://help.1forma.ru/domains/user-ui/admin.md) § 7.3 «Карточка задачи и создание».

> ⚠️ Значение применяется только к дополнительным параметрам, которые **выведены на форму создания задачи**. Если параметр на форме не отображается, значение из ссылки не передаётся на сервер и не сохраняется.

#### Имя группы избранного

Заданное имя становится заголовком группы в панели «Избранное». Группы с именами разделяются полоской толщиной 2 пикселя цветом фона панели, идущей на всю ширину блока; избранное без имени выводится единым блоком без разделителей.

Все созданные ссылки оборачиваются в именованную папку под «Мои задачи». Задаётся через меню действий группы избранного. Локализация названия папки — 10 языков (ru/en/fr/de/zh/da/ja/es/it/uz).

#### Пользовательскые счётчики

Таблица `UserLinksCustomCounters`: поля `allTasksCount`, `newTasksCount`, `overdueTasksCount`. Заполняются вручную (смарт-выражение/расписание). При значении 0 счётчик не отображается.

#### Доступ из UI

Администратор может перейти к настройке избранного через ПКМ на блок кнопок в пользовательском интерфейсе.

⚠️ **При добавлении ссылки на категорию** право «Просмотр всех задач» должно быть и у группы, и у настраивающего администратора.

### 15. Синхронизация AD/LDAP — параметры профиля

> **В 1F Certificate Edition синхронизация с каталогом не выполняется:** задача ежедневного запуска не зарегистрирована, маршруты `api/sync-ad`, `api/admin/ldap`, `POST api/admin/users/{id}/sync-with-ad` и `GET api/admin/groups/domains` отвечают 404. Кнопка «Синхронизировать группы с AD» и пункт синхронизации в карточке пользователя остаются в интерфейсе (фронт по решению владельца не менялся) и приводят к ошибке 404 — это ожидаемое поведение. Учётные записи и группы заводятся и правятся вручную; заполненный `Users.SID` остаётся и сам по себе ничего не запускает.

> Техническая реализация синхронизации (архитектура, классы, точки входа, SID-линковка, фильтры, инвалидация токенов) описана в **../auth/ad-sync-technical-reference.md**. Здесь — административные параметры профиля синхронизации.

⚠️ **КРИТИЧНО: для каждого сервиса AD/LDAP — только одна активная настройка синхронизации.**

Для профиля OpenLDAP плановое задание синхронизирует группы обоих видов членства из схемы каталога сервиса: по различительному имени (по умолчанию `groupOfNames`) и по логину (по умолчанию `posixGroup`). Пользователи и группы читаются с учётом этой схемы: группы всех классов — одним запросом, идентификатор записи запрашивается явно.

#### Флаги синхронизации (10+ параметров)

Флаги определяют, какие данные синхронизируются из AD/LDAP и в каком режиме.

| Параметр | Назначение |
|----------|------------|
| Синхронизация с AD | Включает синхронизацию по расписанию ADSyncJob |
| Данные пользователей | Синхронизация данных пользователей по маппингу |
| Названия групп | Синхронизация названий групп |
| Создание новых групп | Автосоздание групп из AD |
| Членство пользователей | Синхронизация состава групп |
| Вложенность групп | Синхронизация связей групп. У OpenLDAP — только для групп с членством по различительному имени (по умолчанию `groupOfNames`) |
| Создавать пользователей из AD | Автосоздание новых пользователей |
| Создавать по расписанию | Автосоздание по ADSyncJob (требует указания OU) |

⚠️ **Создание по расписанию** возможно только при указании орг. единиц в «Организационные единицы для синхронизации из AD». Без OU — проверяются пользователи по всей оргструктуре.

#### Формат логинов и оргструктура

Параметры задают формат логинов и режим обработки орг. единиц при синхронизации.

| Параметр | Описание |
|----------|----------|
| Логины в формате Domain\Nick | Необходим при нескольких доменах с совпадающими никами |
| Только орг. единиц из AD | Вкл: затираются только AD-единицы, ручные сохраняются. Выкл: все орг. единицы перезаписываются |

#### LDAP-фильтры

LDAP-фильтры позволяют ограничить набор пользователей и групп, попадающих в синхронизацию.

| Параметр | Ограничение |
|----------|-------------|
| AD фильтр пользователей | Синтаксис LDAP-фильтров; **макс. 1000 символов** |
| AD фильтр групп | Синтаксис LDAP-фильтров |

Пример фильтра пользователей: `(|(company=1Forma)(city=Moscow))`

#### Защита от массовых обновлений

**Максимально допустимое количество обновлений** — при превышении синхронизация не выполняется. Можно запустить вручную.

#### Маппинг полей

Встроенные поля уже вшиты. Пользовательскые добавляются вручную.

⚠️ **Имена атрибутов AD регистрозависимые:** `displayname` ≠ `DisplayName`.

Пример маппинга: Компания=`company`, Отдел=`department`, Имя=`givenName`, Псевдоним=`displayName`, E-mail=`mail`.

**Аватар:** атрибут AD = `thumbnailPhoto`.

**Часовой пояс:** требуется отдельное поле в AD специального формата (см. `TimeZones.txt`); привязать в настройках маппинга.

Расширенные свойства пользователя маппируются отдельной вкладкой.

> **Служебное свойство `ADSyncAvatarHash`.** В списке расширенных свойств пользователя присутствует системное свойство `ADSyncAvatarHash` — платформа хранит в нём контрольную сумму фото из AD, чтобы не перезаливать аватар при каждом прогоне. **Не назначайте этому свойству атрибут AD:** иначе значение будет затираться синхронизацией расширенных свойств, и аватары снова начнут перезаливаться на каждом прогоне. В профиле пользователя и в мобильном приложении свойство не отображается.

#### Оптимизация

Пользовательская настройка `LDAP_AdGlobalCatalogHosts` (sys_user) — для ускорения загрузки дерева AD при медленном Global Catalog. Предел ожидания операций с каталогом (раскрытие дерева подразделений, получение корневых папок, обход доменов леса) настраивается ключами площадки `LDAP_OperationTimeoutSeconds` и `DirectoryServices_OperationTimeoutSeconds`; без них действует значение 25 секунд. При превышении приложение возвращает свою ошибку и пишет запись в журнал — вместо `504` от прокси.

### 16. Типы групп

> Полное описание в бизнес-слое: **[business.md](https://help.1forma.ru/domains/users-and-groups/business.md#типы-групп)**. Здесь — административные параметры.

Флаг типа **«Можно добавлять в адресаты»** решает, попадает ли группа в списки выбора там, где выбор групп вообще разрешён: без него группа в таких списках не показывается, даже если права на объект у неё есть.

Тип группы задаёт её поведение в интерфейсе:

| Тип | Назначение |
|-----|------------|
| Организационная | Отображается в профилях и меню «Контакты» |
| Служебная | Скрыта от пользователей, для администрирования |
| Индивидуальная | Аналог служебной, состоит из одного пользователя |
| Auto managed membership | Служебная для миграции; нельзя редактировать состав, удалить, связать с орг.единицей |

![Список типов групп в админ-панели](https://help.1forma.ru/help-images/users-and-groups/groups_types_list.png)

Системные служебные группы: **Administrators**, **Users**, **External** — нельзя удалять и переименовывать.

**Настраиваемые свойства типа:**

- Можно добавлять в адресаты
- Отображать в карточке пользователя
- Отображать в дереве сотрудников
- Разрешить ставить отсутствие членам своей группы
- Не копировать членство при копировании прав пользователя

### 17. Связи групп

Связи расширяют сферу поиска контактов и доступа к календарям. Пользователь видит во вкладке «Сотрудники» членов своих неслужебных групп + членов связанных групп.

⚠️ Связываемая группа должна быть **организационной**.

Администраторы и пользователи с ролью «HR-менеджер» видят всех пользователей.

### 18. Импорт пользователей из Excel

**Минимальный набор полей:**

| Поле Excel | Столбец `Users` | Обязательность |
|------------|-----------------|----------------|
| Логин | `Nick` | Да |
| Отображаемое имя | `DisplayName` | Да |
| Полное имя (ФИО) | `FullName` | Да |
| Фамилия | `LastName` | Да |
| Имя | `FirstName` | Да |
| Телефон | `Phone` | Да (формат: `7xxxxxxxxxx`) |
| Отчество | `MiddleName` | Нет |
| Дата рождения | `BirthDate` | Зависит от настроек |
| Почта | `Email` | Зависит от настроек |

Полный список импортируемых полей — таблица `Users`.

**Процедура:** импорт через SQL Server Import Data Wizard → вставка из временной таблицы в `Users`. После импорта требуется генерация временных паролей и добавление в группы.

Обратная операция — выгрузка: над реестром «Пользователи» доступна кнопка «Выгрузить в Excel»; флажок «Показать только неуволенных пользователей» исключает из выгрузки уволенных.

![Выгрузка пользователей в Excel с флажком «Показать только неуволенных пользователей»](https://help.1forma.ru/help-images/users-and-groups/users_list_excel.png)

### 19. Обновление имён

Кнопка «Обновить имена» в интерфейсе администрирования — применяется после изменения настроек отображения имён (форматов, полей) для применения ко всем пользователям. Смена фамилии, имени или отчества в карточке — отдельный путь: отображаемые имена хранятся по языкам, и сохранение карточки обновляет локализованные ФИО для языка оператора и для языков, где значение совпадало с прежними данными пользователя — правило и его границы описаны в [Локализация — Business Rules](https://help.1forma.ru/domains/localization/business.md), раздел «Локализованные ФИО пользователя: автокопия и ручной перевод». Если отображаемое имя разошлось с данными карточки, разбор начинают со сверки локализованных ФИО и `dbo.UserNameModes` по SQL из [Локализация — Администрирование](https://help.1forma.ru/domains/localization/admin.md), раздел «Диагностика локализации».

### 20. Журнал событий пользователя

Вкладка «Журнал» в карточке пользователя. Фиксируются:

- Вход в систему и выход;
- Изменение пароля;
- Изменение профиля;
- Изменение расширенных свойств;
- Изменение персональных настроек отображения;
- Изменение состава групп — добавление пользователя в группу и удаление из неё, с вкладки «Группы» карточки пользователя или из карточки самой группы.
- Изменение периода членства пользователя в группе — установка, изменение и снятие дат «действует с» и «действует по».

Каждая запись: дата/время, текст события, User Agent. ⚠️ Пустой User Agent — браузер не распознан или мобильное приложение без идентификатора.

Массовое добавление или удаление нескольких участников пишет отдельную запись на каждого: строка о смене состава есть у каждого затронутого пользователя, сводной записи на группу нет. Смена периода членства (даты начала и окончания) фиксируется и в журнале пользователя, и в общем журнале административных действий; кнопка «История» на вкладке «Группы» по-прежнему открывает аудит членства, он записи журнала не заменяет. Запись об изменении состава группы или периода членства адресована тому пользователю, чьи данные меняли, — она появляется во вкладке «Журнал» его карточки независимо от того, откуда выполнялась операция, а выполнивший её администратор указан в записи отдельно. Те же события без привязки к пользователю видны в общем журнале административных действий.

По умолчанию отображается ограниченный период. Фильтр по дате — в поле над таблицей.

### 21. Права группы на группу

> Полный список прав с описанием и бизнес-правила: **[business.md](https://help.1forma.ru/domains/users-and-groups/business.md#межгрупповые-права-права-группы-на-группу)**.

6 типов прав: перевоплощение, просмотр журналов, просмотр календарных событий, просмотр профилей, установка фото пользователя, запрет ставить маркер «вопрос» членам группы (с v2.268).

![Вкладка «Права на группы»: перевоплощение и дополнительные права на членов выбранной группы](https://help.1forma.ru/help-images/users-and-groups/groups_rights_groups-02.png)

В режиме «По правам» тот же экран показывает, каким группам выдано выбранное право.

![Вкладка «Права на группы» в режиме «По правам»: группы с выданным правом](https://help.1forma.ru/help-images/users-and-groups/groups_rights_groups-04.png)

### 22. Профиль пользователя — поля карточки

> Бизнес-логика полей и вкладок: **[business.md](https://help.1forma.ru/domains/users-and-groups/business.md#карточка-пользователя)**. Здесь — административный справочник полей.

**Блок «Личное»:** Логин, Пароль, ФИО, Псевдонимы (рус/англ), Язык интерфейса, Пол, Декретный отпуск, «О себе».

**Блок «Рабочее»:** Орг.единицы (должности, одна основная), Дата «В компании с».

**Блок «География»:** Часовой пояс, Страна, Город, Комната, Геолокация.

**Блок «Контакты»:** Мобильный (с верификацией по SMS), Рабочие телефоны (до 3), Дополнительный, Факс, IP-телефония, E-mail, Внешний e-mail, Внешнее имя, Telegram ID и ник, Facebook, WhatsApp.

**Блок «Прочее»:** SID (из AD), Провайдер аутентификации, Заметки, Домен пользователя, 1С GUID.

**«Домен пользователя» (`Users.DomainController`).** У пользователя Active Directory в поле хранится домен, у пользователя OpenLDAP — имя службы каталога. По этому значению платформа находит профиль синхронизации: при одиночной синхронизации, при создании пользователя администратором и при смарт-действии синхронизации с каталогом. Для пользователя OpenLDAP имя службы проставляется автоматически, когда выбран провайдер аутентификации OpenLDAP, а при сохранении карточки уже записанное значение не стирается: форма перечисляет только провайдеры Active Directory, и непереданный провайдер при неизменном идентификаторе записи каталога сбросом привязки не считается.

**Поле «Провайдеры» и сохранение SID.** Список в поле «Провайдеры» содержит только активные провайдеры ActiveDirectory. Если провайдер деактивирован, у доменного пользователя поле пустое, и сохранение карточки очищает у записи `Users.SID` вместе с доменом пользователя: учётная запись теряет привязку к каталогу, а следующая синхронизация заводит того же сотрудника заново — уже с SID, то есть дублем. Привязку возвращают так: провайдер делают активным, затем в карточке выбирают его и указывают SID. Пользователя OpenLDAP это не касается — при сохранении карточки его привязка сохраняется.

**Пользовательскые поля:** через ключ `userProfileInfoExts` — `JobTitle`, `Zoom` и др.

**Флаги доступа к редактированию профиля:** Может редактировать аватар/пароль/Личное/Рабочее/География/Контакты, Разрешить кастомизировать UI, Разрешить менять режим отображения имён, Требовать акцепта всех своих задач, Доступ к почте.

### Признак «Сотрудник компании» (`IsEmployee`)

Битовый флаг в `Users.IsEmployee`. Делит пользователей на **сотрудников компании** (`IsEmployee = 1`, полный доступ) и **внешних пользователей** (`IsEmployee = 0`, ограниченный доступ — клиенты, партнёры, контрагенты, экспедиторы). Переключается в карточке пользователя в блоке «Прочее».

![Блок «Прочее» карточки пользователя с установленной галкой «Сотрудник компании»](https://help.1forma.ru/help-images/users-and-groups/users_new-03.png)

Признак широко используется в коде — влияет на видимость, права, поиск, рассылки, синхронизацию и UI. Сводный реестр влияния:

| Область | Эффект для пользователя без `IsEmployee` | Детали |
|---|---|---|
| Блок «Сотрудники» в навигации | Физически не попадает в выдачу блока (вне зависимости от прав) | [groups-visibility-auto-creation.md § Флаг Users.IsEmployee](https://help.1forma.ru/domains/users-and-groups/groups-visibility-auto-creation.md#флаг-usersisemployee--физический-фильтр) |
| Поиск контактов `/mobile/users/search` | Результат фильтруется по межгрупповому `ViewGeneralInformation` запрашивающего | [groups-visibility-auto-creation.md § Видимость в API поиска контактов](https://help.1forma.ru/domains/users-and-groups/groups-visibility-auto-creation.md#видимость-в-api-поиска-контактов-mobileuserssearch) |
| Профили коллег (`AccessToOtherUserProfiles`) | Доступ к чужому профилю — только при наличии межгруппового `ViewGeneralInformation` (для сотрудника — управляется спецправами) |  |
| Tooltip пользователя | Не отображается (`ShowUserTooltip` принудительно `false`) |  |
| Чаты | Ряд действий запрещён (создание, управление участниками); уволенные ведут себя аналогично | |
| Комментарии — фильтр «только по/для несотрудников» | Используется в специальных лентах задач для разделения видимости |  [business.md § видимость комментариев](https://help.1forma.ru/domains/users-and-groups/business.md) |
| Customer Zone | Дополнительная фильтрация комментариев в карточке клиента |  |
| Подписи к задачам | Подписывать может любой пользователь независимо от флага | [business.md строка 402](https://help.1forma.ru/domains/users-and-groups/business.md) |
| Подписчики (smart-критерий) | Доступен `UserIsEmployeeCriteria` для отбора в SmartFilter / правилах подписки на лентах |  |
| Массовая рассылка опросов | Пропускает: рассылка идёт только пользователям с `IsEmployee = 1 AND IsFired = 0` |  |
| Уведомления о просрочке | Пропускает: уведомления отправляются только сотрудникам с `NotNotifyAboutOverdueTasks = 0` |  |
| Email-уведомления | Если пользователь без `IsEmployee` ни разу не заходил — рассылается упрощённый шаблон без ссылок на задачу/комментарий |  |
| Вложения файлов в e-mail | Файлы всегда отправляются как `attachment` (`EmailFilesAsAttachments = !IsEmployee`) |  |
| Exchange / Calendar Sync | Не синхронизируется с Exchange/EWS | |
| Видимость групп | Видит только разрешённые группы; сотрудник — все, кроме служебных |  |
| Поиск с группами-подписчиками | Опция «искать по группам-подписчикам категории» работает только для сотрудников |  |
| Мобильное API (`MobileUserInfo`) | Возвращается урезанный объём полей о коллегах (отсутствия, профильная инфо, аватары); собственный профиль и сотрудники возвращаются с другим набором |  |
| Спецдействия | Поведение спецдействий `NOTVIEWUSERINFO`, `VIEWGENERALINFORMATION`, `VIEWALLSEARCHRESULTS` зависит от связки с `IsEmployee` (см. реестр спецдействий выше в этом файле) | Раздел «Спецдействия» |

Признак работает **поверх** прав групп и рабочих мест: если у внешнего пользователя в коде есть отдельная ветка для `IsEmployee = 0`, она применяется независимо от наличия групповых разрешений. Поэтому при настройке прав для группы внешних пользователей важно отдельно проверять, не отсекает ли их ветвь `!IsEmployee` от целевой функциональности.

## Пошаговые процедуры

### Создать пользователя

Пошаговая процедура создания нового пользователя и добавления его в систему.

1. Администрирование → Пользователи → «Создать пользователя».
2. Заполните обязательные поля: **орг.единицу** (должность), **логин**, **пароль**. Остальные обязательные поля зависят от Общих настроек приложения (фамилия, псевдоним, e-mail, дата рождения).

3. При необходимости сразу добавьте пользователя в группу, получите данные из AD/1С или создайте индивидуальную группу.
4. Сохраните. Новый пользователь получает стартовые настройки из «Настроек по умолчанию для новых пользователей» (раздел 6).

### Настроить группу и выдать права

Пошаговая процедура создания группы и назначения прав доступа её участникам.

1. Администрирование → Группы → «Создать» → укажите наименование и тип.
2. На вкладке состава добавьте участников. Для **связанной** группы состав берётся из орг.единицы автоматически — вручную не редактируется. Поле **«Название»** у связанной группы тоже заблокировано (с 2.268.348): чтобы переименовать такую группу, измените имя соответствующей орг.единицы — название связанной группы обновится автоматически при сохранении орг.единицы.
3. Назначьте права: вкладка **«Права на категории»** (доступ к задачам), **«Права на группы»** (межгрупповые), **«Специальные права»** (системные полномочия).

На вкладке «Права на категории» по каждой категории отмечаются конкретные действия: основные (исполнять, просмотр всех задач, создавать задачи) и дополнительные (администратор задач, пакетная обработка, перенос срока и др.).

![Вкладка «Права на категории»: основные и дополнительные права группы по категории](https://help.1forma.ru/help-images/users-and-groups/groups_rights_cats-02.png)

> Права доступа к категориям выдаются **только группам** — не отдельным пользователям и не орг.единицам.

![Добавление участников в группу на вкладке «Состав»](https://help.1forma.ru/help-images/users-and-groups/groups_control04.png)

### Связать оргструктуру с группами (автоматическое членство)

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

1. Постройте оргструктуру: Администрирование → Пользователи и группы → **Типы орг.структуры**, затем **Орг. структура** (дерево сверху вниз: компания → департамент → отдел → должность).
2. Пометьте руководящие должности (галочка «Руководитель» в орг.единице).
3. Привяжите пользователей к должностям (одна должность — основная).
4. Свяжите орг.единицу с группой: выбрать орг.единицу → «Связанная группа» → «Создать новую» → «Связать с группой». Вариант «для всей ветки» включает дочерние элементы рекурсивно.

Дальше членство обновляется автоматически: добавили или убрали пользователя в орг.единице — состав связанной группы пересчитался, права применились.

### Изменения в команде

Типовые кадровые события и соответствующие действия в системе.

- **Новый сотрудник:** создать пользователя → привязать к должности → автоматически попадает в связанные группы и получает права.
- **Перевод между отделами:** сменить орг.единицу → группы и права сменятся автоматически.
- **Увольнение:** уволить (не удалять — история задач сохраняется); при необходимости передать права и задачи (раздел 3).

Синхронизация с AD/LDAP описана в разделах 11 и 15, импорт из Excel — в разделе 18.

## Рекомендации

Практические рекомендации по организации прав доступа и управлению пользователями в системе.

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

## Типичные ошибки настройки

Частые проблемы конфигурации, их вероятные причины и способ проверки:

| Симптом | Вероятная причина | Где проверить | SQL-диагностика |
|---|---|---|---|
| Новый пользователь создается без ожидаемых стартовых параметров | Неактуальны `users-new-default-settings` | форма `users-new-default-settings`, API `/api/admin/users/default/*` | `select top (50) * from dbo.UsersNewDefaultSettings;` |
| Пользователь не видит часть интерфейса после входа | Конфликт/ошибка в `UserGroupSettings` | форма `workplaces`, API `/api/admin/user-group-settings/*` | `select top (50) * from dbo.UserGroupSettings;` |
| После добавления в группу права не применяются | Ошибка в типе группы/вложенности | формы `groups`, `group-parents`, `groupType.json` | `select top (100) * from dbo.GroupParents;` |
| Пользователь получил «лишние» права | Нежелательное наследование через вложенные группы | `group-parents`, API `/api/admin/groups/{id}/users` | `select top (100) * from dbo.GroupParents;` |
| Увольнение не дало ожидаемого эффекта по задачам | Неверные параметры `fire` / не проверен перенос | `/api/admin/users` (`fire`, `firenow`, `move-tasks`) | `select top (100) * from dbo.GroupUsersMembership;` |
| Восстановленный пользователь «не как новый» | Дефолты изменились после изначального создания | `users-new-default-settings`, `/api/admin/users/default/settings` | `select top (50) * from dbo.UsersNewDefaultSettings;` |
| Оргструктура отображается, но состав групп не совпадает | Не выполнен `syncgroups` или некорректные связи unit↔group | `/api/admin/org-structure/syncgroups`, `link-with-group` | `select top (100) * from dbo.OrgStructureUnit;` |
| Пользователь не видит карточку коллег в оргструктуре | Спецправа ограничивают просмотр | `special-permissions`, проверки в `/api/admin/org-structure` | `select top (100) * from dbo.GroupSpecialPermissions;` |
| Роль назначена, но полномочия не работают | Не заполнены `rolePowers` или некорректная привязка `roleUser` | EntityEditor `rolePowers.json`, `roleUser.json` | `select top (100) * from dbo.Roles;` |
| AD sync групп проходит частично | Неверные доменные/профильные настройки | `/api/admin/groups/domains`, `/ad/sync-all-groups` | `select top (100) * from dbo.GroupDomainAccess;` |
| Матрица прав на сущность не применяет изменения | Изменения внесены не в тот `entityType`/`entityId` | `/api/admin/permissions/*`, `/api/admin/entity-access/*` | `select top (100) * from dbo.Groups;` |
| Комната не появляется в выборе бронирования | Запись есть в `Rooms`, но справочник заполнен некорректно | форма `rooms` | `select top (100) * from dbo.Rooms;` |

## Минимальный SQL-чеклист L2/L3

Набор SQL-запросов для быстрой проверки состояния ключевых таблиц домена при разборе инцидентов.

```sql
select 'Users' as [table_name], count(*) as [cnt] from dbo.Users
union all
select 'Groups', count(*) from dbo.Groups
union all
select 'UserGroupSettings', count(*) from dbo.UserGroupSettings
union all
select 'UsersNewDefaultSettings', count(*) from dbo.UsersNewDefaultSettings
union all
select 'OrgStructureUnit', count(*) from dbo.OrgStructureUnit
union all
select 'GroupParents', count(*) from dbo.GroupParents
union all
select 'GroupDomainAccess', count(*) from dbo.GroupDomainAccess
union all
select 'GroupSpecialPermissions', count(*) from dbo.GroupSpecialPermissions
union all
select 'UserInfoExtValues', count(*) from dbo.UserInfoExtValues
union all
select 'Rooms', count(*) from dbo.Rooms;

select
    c.table_schema,
    c.table_name,
    c.column_name,
    c.data_type
from information_schema.columns c
where c.table_schema = 'dbo' and
      c.table_name in (
          'Users',
          'Groups',
          'UserGroupSettings',
          'UsersNewDefaultSettings',
          'OrgStructureUnit',
          'OrgStructureType',
          'OrgStructureAppointment',
          'GroupParents',
          'GroupDomainAccess',
          'GroupUsersMembership',
          'GroupSpecialPermissions',
          'UserInfoExtValues',
          'Rooms'
      )
order by
    c.table_name,
    c.ordinal_position;
```

### Лицензии пользователей

Лицензия «Первая Форма» назначается пользователю индивидуально — в карточке пользователя, вкладка «Профиль», блок «Лицензии»: тип лицензии выбирается из выпадающего списка.

Сводные счётчики лицензий (сколько приобретено и использовано по типам — «Первая Форма», конкурентные, личные кабинеты, почтовые ящики) отображаются на главной странице администрирования. Счётчик «Используется» — это число пользователей, которым лицензия **назначена**, а не занятых в текущий момент: занятость конкурентных лицензий на этих страницах не показывается. Подробнее — [Учёт конкурентных лицензий](https://help.1forma.ru/domains/auth/admin.md#8-учёт-конкурентных-лицензий).

Массово лицензии выдаются и отзываются на странице «Лицензии пользователей» в администрировании. Список показывает логин, ФИО, email, тип лицензии и статус пользователя; есть поиск, сортировка и фильтры по типу лицензии, по её наличию («Любая» / «С лицензией» / «Без лицензии») и включение уволенных. Лицензию можно выдать, отозвать или сменить как у одного пользователя, так и у всех отмеченных сразу. В шапке страницы выводятся счётчики «Приобретено» и «Используется» по каждому типу.

**Поиск в списке.** Строка поиска отбирает пользователей по подстроке логина, ФИО или адреса электронной почты — совпадение достаточно в одном из трёх полей. Регистр не важен: «хазов» находит и «Хазов». Знаки «%» и «_» ищутся как обычные символы. Пустая строка и строка из одних пробелов равнозначны отсутствию поиска, а запрос длиннее 200 символов обрезается без ошибки. Отбор идёт на сервере по всей выборке, а не по открытой странице: счётчик найденного, постраничная навигация и сортировка считаются уже по результату поиска. Поиск складывается с остальными фильтрами по «И». Счётчики «Приобретено» и «Используется» в шапке от поиска не зависят и остаются общими.

**Выгрузка в Excel.** Кнопка «Выгрузить в Excel» на странице сохраняет список в файл `.xlsx`. В файл попадает вся отфильтрованная выборка в текущем порядке сортировки: поиск, фильтры и сортировка учитываются, а постраничная навигация и отметки строк на состав файла не влияют; счётчики из шапки в файл не идут. Колонок семь: ID, логин, ФИО, email, лицензии, статус («Работает» или «Уволен») и признак учётной записи поддержки. Выгрузка ограничена 50 000 строк — если выборка больше, файл не формируется и выводится предложение сузить фильтр.
