# ДП «Выбор пользователя» — справочник настроек

Полный перечень настроек ДП «Выбор пользователя»: где хранится каждая настройка, что она делает и какие есть ограничения. Для администраторов и разработчиков при настройке фильтрации, денормализации и смарт-событий `BeforeSelectUsersOpen`.

## Основные настройки (ExtParamSelectUserSettings)

Настройки хранятся в таблице `ExtParamSelectUserSettings` (1:1 с ExtParams через PK = ExtParamID). Большинство задаётся на вкладке «Дополнительные настройки» карточки ДП.

![Вкладка «Дополнительные настройки» ДП «Выбор пользователя»: режим выбора, разрешённые подсистемы (пользователи/группы/орг. единицы), фильтры и уровни оргструктуры](https://help.1forma.ru/help-images/ext-params/selectuser_settings.png)

### Режим выбора и три подсистемы

Одиночный или множественный выбор элементов:

| Настройка | Поле БД | Тип | Описание | Ограничения |
|----------------|---------|-----|----------|-------------|
| Разрешить сохранять не более одного элемента | `SingleUserMode` | bit, по умолчанию 0 | Режим одиночного выбора | При сохранении удаляются все предыдущие значения, затем добавляется максимум один элемент |

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

| Настройка | Поле БД | Тип | По умолчанию | Описание |
|----------------|---------|-----|---------|----------|
| Разрешить выбирать пользователей | `AllowUsers` | bit | 1 | Выбор конкретных пользователей |
| Разрешить выбирать группы | `AllowGroups` | bit | 1 | Выбор групп пользователей |
| Разрешить выбирать орг. единицы | `AllowOrgUnits` | bit | 0 | Выбор подразделений оргструктуры |

### Фильтрация групп

При включённой настройке «Разрешить выбирать группы» в списке для выбора отображаются только те группы, тип которых имеет активный флаг «Можно добавлять в адресаты» (`GroupTypes.CanBeAddedAsRecipient`). Типы групп настраиваются в справочнике «Типы групп».

Синхронизированные с Active Directory группы (`Groups.EnableADSync = 1`, заполненный `ADSID`) отображаются по тому же правилу — наравне с обычными, при условии что их тип допускает добавление в адресаты.

Ограничение действует на все режимы фильтрации (`TypeFiltration` = 0/1/2 — без ограничений, по группе, по смарт-выражению), поскольку все они наследуют общий критерий поиска групп.

См. также: [Пользователи и группы → Типы групп](https://help.1forma.ru/domains/users-and-groups/admin.md).

### Фильтрация пользователей

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

| Настройка | Поле БД | Тип | Описание |
|----------------|---------|-----|----------|
| Ограничить выбор пользователей | `TypeFiltration` | tinyint, по умолчанию 0 | 0=Без ограничений, 1=По группе, 2=Смарт-фильтр |
| Ограничить список членами группы | `GroupID` | int FK → Groups | Группа для ограничения (при TypeFiltration=1) |
| Ограничить смарт-выражением | `SmartFilterId` | int FK → SmartExpressions | Смарт-фильтр для пользователей (при TypeFiltration=2) |


> **Контекст строки в ДП Таблица.** При использовании ДП «Выбор пользователей» как столбца ДП Таблица с TypeFiltration=2 (смарт-фильтр пользователей) или OrgUnitTypeFiltration=2 (смарт-фильтр орг. единиц), в смарт-выражение передаётся JSON текущей строки таблицы (`otherValuesTableJson`) через переменную `@EventParam3`. Это позволяет фильтровать список пользователей, групп и орг. единиц на основе значений других столбцов этой же строки. Работает аналогично колонке типа Lookup.

### Фильтрация оргструктуры

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

| Настройка | Поле БД | Тип | Описание |
|----------------|---------|-----|----------|
| Ограничить выбор орг. единиц | `OrgUnitTypeFiltration` | tinyint, по умолчанию 0 | 0=Без ограничений, 1=По подразделению, 2=Смарт-фильтр |
| Ограничить список из подразделения | `OrgUnitID` | int FK → OrgStructureUnit | Корневое подразделение (при OrgUnitTypeFiltration=1) |
| Ограничить смарт-выражением | `OrgUnitSmartFilterId` | int FK → SmartExpressions | Смарт-фильтр для орг. единиц (при OrgUnitTypeFiltration=2) |
| Ограничить выбор типами | Таблица `ExtParamSelectUserSettingsOrgUnitTypes` | N:1 | Разрешённые типы подразделений оргструктуры |
| Разрешить выбор только листовых узлов | `AllowOnlyOrgUnitTreeLeafs` | bit, по умолчанию 0 | Только конечные элементы дерева оргструктуры |

> **Контекст строки в ДП Таблица** применим и для смарт-фильтра орг. единиц (`OrgUnitSmartFilterId`) — JSON текущей строки передаётся через `@EventParam3`. См. полное описание выше (раздел «Фильтрация пользователей»).

### Уровень отображения оргструктуры

Сколько уровней иерархии показывать в имени выбранного подразделения:

| Настройка | Поле БД | Тип | Описание |
|----------------|---------|-----|----------|
| Отображать уровни орг. единиц | `OrgUnitsLevel` | int, по умолчанию 0 | Определяет количество уровней в имени элемента при выводе в печатный шаблон |

Допустимые значения:

| Значение | Код | Описание |
|----------|------|----------|
| 0 | `LowerAndItsParent` | Нижний + родитель |
| 1 | `Lower` | Только нижний |
| 2 | `All` | Все уровни |
| 3 | `WithoutTop` | Все кроме верхнего |
| 4 | `WithoutTwoTop` | Все кроме двух верхних |

Значение формируется в момент сохранения ДП (метод `RenderOrgUnitName`). Для изменения вывода в ранее созданных задачах — пересохранить значение ДП.

### Текстовые ресурсы

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

![Вкладка «Текстовые ресурсы» ДП «Выбор пользователя»: заголовок кнопки, пункты контекстного меню, подсказка и заголовок списка](https://help.1forma.ru/help-images/ext-params/selectuser_text_resources.png)

| Ресурс | FK на LocalizedBusinessObjects | Описание |
|-------------|-------------------------------|----------|
| Заголовок кнопки | `LocalizedButtonTitleId` | Текст кнопки выбора |
| Только этому пользователю | `LocalizedOnlyCurrentUserId` | Текст ограничения |
| Удалить пользователя | `LocalizedRemoveUserId` | Текст удаления одного |
| Удалить всех | `LocalizedRemoveAllId` | Текст удаления всех |
| Показать информацию о пользователе | `LocalizedUserInfoId` | Текст просмотра инфо |
| Подсказка в пустом поле ввода | `LocalizedEmptyTooltipId` | Подсказка |
| Заголовок списка выбора | `LocalizedSelectListTitleId` | Заголовок списка |

Устаревшее поле `TextResources` (varchar(1000), XML) заменено на `Localized*Id`.

## Поведение в интерфейсе

### Клик и наведение на значение

В режиме просмотра клик по выбранному значению открывает поле для редактирования — так же, как клик по свободному месту поля. Краткая карточка профиля открывается по наведению на значение. На мобильных клиентах карточка по наведению не открывается.

### Контекстное меню

По правому клику на выбранном элементе доступно контекстное меню (работает и в карточке задачи, и в форме создания задачи). Набор пунктов зависит от типа элемента и роли пользователя:

- для элемента типа «пользователь» — «Информация о пользователе» (открывает карточку пользователя); доступно всем;
- для элемента типа «группа» или «орг. единица» доступны пункты:
  - **«Посмотреть состав участников»** — открывает состав группы или подразделения; доступно пользователям с правом просмотра;
  - **«Развернуть список»** — только при множественном выборе и разрешённом выборе групп. По клику чип группы убирается из поля, а вместо него добавляются конечные участники всех уровней вложенности, кроме уволенных и находящихся в декрете; уже выбранные участники второй раз не добавляются, остальные выбранные значения сохраняются;
  - **«Удалить»** — убирает группу из поля.

### Иерархический выбор орг. единиц

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

- **голубое выделение** — элемент, который будет сохранён в ДП (тот, на который кликнул пользователь);
- **галочка / минус / пустой квадрат** — отражают подчинённость в иерархии и служат для выбора, но **не показывают**, что именно сохранится.

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

## Ограничения группировки и денормализация

Группировка списка задач по колонке SelectUsers работает **только при одновременном выполнении**:

1. `SingleUserMode = true`
2. Активна **только одна** из настроек: AllowUsers, AllowGroups, AllowOrgUnits

При этих условиях в `ExtParamValues.SelectUserValue` и денормализованной таблице `ExtParamXXXNativeValue` хранится ID выбранного элемента (int).

Что записывается в денормализованные поля в зависимости от настроек ДП:

| Условие | `ExtParamValues.SelectUserValue` | `ExtParamValues.ExtParamValue` |
|---------|----------------------------------|-------------------------------|
| SingleUserMode + один Allow-флаг + один элемент выбран | UserID / GroupID / OrgUnitID (int) | Строковое представление |
| Все остальные случаи | NULL | Строковое представление |

Тип `NativeValue` в денормализованной таблице:

- `int` — если `SingleUserMode` и один Allow-флаг
- `(n)varchar(1000)` — иначе

Определяется функцией `dbo.DenormExtParamColumnsDefinition`.

**Смарт-события** — обработчики на события:

| Событие | ID | Описание |
|---------|-----|----------|
| `BeforeSelectUsersOpen` | 169 | Перед открытием диалога выбора пользователей |
