# Права доступа к задачам

Документ описывает механизмы настройки прав доступа к задачам в 1Форме. Внутри — права группы на категорию, смарт-доступ, доступ по SQL View, гибкие права через дополнительные параметры, пересчёт прав, отчёт о правах, практический чеклист и типовые ошибки конфигурации. Предназначен для администраторов системы.

## Права группы, смарт-доступ и SQL View

Администратор настраивает базовые механизмы доступа: права группы на категорию, смарт-выражения и источник данных на основе SQL View.

**1. Права группы на категорию**

Где: настройки категории, вкладка «Доступ» (и зеркально — в карточке группы).

Что задаётся:

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

![Карточка группы, вкладка «Права на категории»](https://help.1forma.ru/help-images/permissions/group_category_rights.png)

⚠️ В настройках прав доступа к категории недопустимо использовать группу Users («Все пользователи»).

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

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

**2. Смарт-доступ**

Где: механизм смарт-доступа (настраивается на уровне категорий и групп).

Что задаётся:

- смарт-выражение, возвращающее идентификаторы пользователей (UserID);
- действие (обычно просмотр);
- группы и категории, где правило активно.

⚠️ Видимость задачи через смарт-доступ проверяется только по записям с действием «Просмотр задачи» — любой другой тип доступа (Исполнять, Администратор задач и т.д.) сам по себе задачу не открывает, а лишь добавляет право уже видимой задаче. Чтобы пользователь и видел задачу, и получил дополнительное право — нужны два отдельных правила смарт-доступа с одним смарт-выражением: одно на «Просмотр задачи», второе на нужный тип доступа.

![Реестр правил смарт-доступа: наименование, смарт-выражение, действие](https://help.1forma.ru/help-images/permissions/smart_access.png)

### Настройка смарт-доступа к ДП в AdminSPA

Правила смарт-доступа к дополнительным параметрам настраиваются через всплывающее окно в форме настроек ДП категории.

**Порядок добавления правил:**

1. Откройте настройки ДП в категории.
2. В разделе «Смарт-доступ» откройте всплывающее окно.
3. Заполните параметры правила:
   - Название
   - Смарт-выражение для пользователей
   - Права доступа (чтение/запись)
   - Триггерные группы (при необходимости)
   - Триггерные ДП (при необходимости)
4. Нажмите «Добавить параметр» — правило сохранится на сервере.
5. Форма автоматически очистится для добавления следующего правила.
6. После добавления всех правил закройте окно.

**Особенности:**

- Каждое правило сохраняется независимо от общей формы настроек ДП.
- Защита от дублирования: кнопка блокируется на время сохранения.
- После сохранения отображается уведомление «Смарт-доступ сохранён».
- Правила можно добавлять последовательно, не закрывая окно.
- Закрытие окна не требует дополнительного сохранения — все добавленные правила уже сохранены на сервере.

**3. Доступ по SQL View**

Где: категория (настройка источника доступа). Доступно в новом режиме администрирования с версии 2.265 Цефей.

В поле указывается имя объекта БД (представление или таблица). Объект должен возвращать таблицу с колонками `TaskID`, `UserID`: каждая строка описывает доступ пользователя `UserID` на чтение задачи `TaskID`.

- Имя функции разграничения хранится в `dbo.Subcategories`, столбец `TSQLAccessFunction`.
- Для всех таблиц в скрипте обязательна директива `WITH (NOLOCK)`.
- ⚠️ Права группы на категорию имеют больший вес, чем SQL View: если у пользователя нет доступа к категории, доступ, выданный только через SQL View, не действует.
- На версиях до 2.265 Цефей для включения нужно проверить табличную функцию `fn_UserTaskPermissions` — в ней должны быть раскомментированы строки с `fn_CustomTaskPermissions`.

**Как назначенный объект попадает в решение о доступе.** Из представлений, назначенных категориям, процедура `dbo.GenerateCustomTaskPermissionsView` собирает представление `dbo.vwCustomTaskPermissions` (колонки `TaskID`, `UserID`, `SubcatID`, `IsTaskClosed`), а процедура `dbo.CustomTaskPermissionsRefresh` переносит его строки в кэш `dbo.CustomTaskPermissions`; категории без назначенного представления строк в кэш не дают.

На PostgreSQL настроить доступ по SQL View нельзя: при сохранении система отвечает «Не поддерживается на PG», генерация представления не запускается.

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

## Уровни административного доступа

В платформе два уровня административных прав:

- **Администратор с полными правами** (God) — выполняет все административные операции, включая деструктивные и критические настройки системы.
- **Администратор с ограниченными правами** — выполняет административные операции, кроме требующих полных прав.
- **Администратор категории** — право на администрирование конкретной категории, без роли администратора площадки. Открывает доступ к разделу администрирования с деревом, отфильтрованным по своим категориям: видны только они и их родительские разделы. В своей категории доступны настройки карточки задачи, текста, комментариев, сроков, участников, подписей элементов интерфейса, формы создания задачи, кнопок действий, блоков формы и таблиц в них, ресурсов, опросов, новостей и почтовых сообщений; дополнительный параметр можно создать, привязать, переставить, настроить и отвязать, а также скопировать права групп и по состояниям, значения и управлять индексами. Блоки дополнительных параметров и группы блоков своей категории ведутся целиком — кроме системного блока «Шапка задачи», элементы которого переставлять и удалять нельзя; вкладки настроек ДП редактируются, только если параметр привязан исключительно к своей категории — у общего параметра, привязанного к нескольким категориям, сохранение отклоняется. Остаются закрытыми создание, копирование и удаление категорий, маршруты и переходы, права доступа, смарт-автоматизации, вставка кода на страницы, режим технических работ и выбор хранимой процедуры источником данных таблицы блока; удаление самого параметра из общего справочника доступно только администратору площадки.

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

Только администратору с полными правами доступны:

| Область | Действие |
|---------|----------|
| Порталы | Изменение и удаление шаблонов блоков |
| Репозитории | Создание, изменение и удаление настроек репозиториев, подготовка репозитория |
| Почта | Удаление почтового ящика вместе со связанными данными |
| Система | Изменение настройки записи событий в базу данных |
| Инфраструктура | Получение сведений об инфраструктуре кластера |
| Служебная аналитика | Просмотр служебных срезов активности пользователей test-info (`last-users-tasks-by-ep-changes`, `last-users-tasks-by-count-comments`, `last-users-tasks-by-change-date`, `last-viewed-users-tasks`) |

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

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

**Чтение матрицы по несуществующему объекту.** Если в запросе на чтение матрицы указан идентификатор сущности, которой в системе нет, ответ приходит управляемым отказом, а не внутренней ошибкой сервера: раньше такой запрос завершался ошибкой 500 и записью в журнале необработанных исключений. На существующие объекты это не влияет — настройки доступа отдаются как прежде.

Чтение матрицы прав группы по разделу через API не поддерживается: у раздела нет собственной матрицы, права задаются на категории внутри него. Запрос по разделу возвращает 400 с текстом «Операция не поддерживается. У раздела нет своих прав непосредственно. Права устанавливаются на категории в разделе.», а пользователь без полных прав — 403.

## Гибкие права через ДП

Гибкие права предоставляют доступ на **просмотр** конкретных задач (не всей категории) на основании данных в самой задаче. Другие действия (редактирование, комментирование) требуют дополнительных прав на категорию. Доступно с v2.261 Лира.

Гибкие права распространяются и на заместителей: если у замещаемого пользователя есть доступ к задаче через гибкие права, его заместитель в период замещения также сможет её просматривать.

### Режим Flat

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

| Поле формы | Описание |
|------------|----------|
| Категория | Категория, на задачи которой настраиваются права |
| Выбор пользователей | ДП типа «Выбор пользователей» в этой же категории |

- Таблица БД: `dbo.EPRightsFlat`
- Пример: ДП «РП (Руководитель проекта)» в категории «Договоры» — пользователи из ДП видят задачи договоров.

⚠️ В ДП «Выбор пользователя» допустимы только пользователи и группы; орг.единицы не поддерживаются.

Настройка выполняется в разделе администрирования «Flat: гибкие права»: в строке выбираются категория, ДП «Выбор пользователей» и тип выбора (User / Group).

![Форма «Flat: гибкие права»: пример с ДП «РП» и «СДО» в категории «Договоры»](https://help.1forma.ru/help-images/permissions/flat.png)

### Режим Lookup

ДП с типом «Lookup поле» в текущей категории ведёт на категорию-источник, где есть ДП «Выбор пользователя». Пользователи из ДП категории-источника получают доступ к задаче.

| Поле формы | Описание |
|------------|----------|
| Категория | Категория, на задачи которой настраиваются права |
| Выбор пользователей | ДП типа «Выбор пользователей» — в категории-источнике Lookup |
| Lookup | ДП типа «Lookup поле» в категории из поля «Категория» |

- Таблица БД: `dbo.EPRightsLkp`
- Пример: категория «Backlog проектных задач» → Lookup «Модуль» на категорию «Модули ТМ» → ДП «Акцептант» (Выбор пользователя) → доступ к задачам Backlog.

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

![Форма «Lookup: гибкие права»: пример с Lookup «Модуль» и ДП «Акцептант» из категории-источника «Модули ТМ»](https://help.1forma.ru/help-images/permissions/lookup_rights.png)

### Режим Multilookup

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

| Поле формы | Описание |
|------------|----------|
| Категория | Категория, на задачи которой настраиваются права |
| Выбор пользователей | ДП типа «Выбор пользователей» — в категории-источнике Multilookup |
| Multilookup | ДП типа «Выбор нескольких задач из категории» в категории из поля «Категория» |

- Таблица БД: `dbo.EPRightsMlt`
- Пример: категории разработки (Backlog, Backlog несоответствия) → ДП «Компании» (Multilookup на категорию «Клиенты») → ДП «КМ (Клиентский менеджер)» → доступ к задачам.

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

![Форма «Multilookup: гибкие права»: пример с ДП «Компании» (Multilookup) и ДП «КМ» из категории-источника «Клиенты»](https://help.1forma.ru/help-images/permissions/mlt.png)

### Особенности форм администрирования и пересчёт функций прав

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

- Формы гибких прав **нельзя редактировать прямо в списке** — запись можно только создать или удалить.
- **Тип выбора пользователей**: `Пользователь (User)`, `Группа (Group)`, `Орг.структура (временно не используется)`.
- ⚠️ Настройка доступа по статусам (`ep-rights-*-states-*`) **устарела с v2.264 Кассиопея** — не используется.

При изменении настроек гибких прав через формы администрирования вызывается хранимая процедура `dbo.GenerateExtParamsRightsFunctions`, которая пересоздаёт функцию `fn_UserTaskPermissionsGeneral` из шаблона.

Паттерны настройки (таблица режимов, ограничения, паттерн скрытого ДП через автоматизацию) — см. [academy-patterns.md](https://help.1forma.ru/domains/permissions/academy-patterns.md#4-гибкие-права-на-задачи).

## Автоматический и фоновый пересчёт прав

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

**Автоматический пересчёт прав**

Система автоматически пересчитывает гибкие права при любом изменении задачи:

- создание задачи;
- смена категории;
- изменение заказчика или исполнителя;
- обновление статуса или ДП.

Пересчёт выполняет хранимая процедура `dbo.AllUserPermissionsRefresh`, которая вызывается со **скользящей задержкой 1 секунда** — несколько изменений одной задачи группируются в один пересчёт. Параметры процедуры: `@UserID, @SubcatID, @TaskIDs, @OnlineUserOnlyF, @DebugF`.

**Фоновые задания пересчёта прав**

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

| Задание | Период | Описание |
|---------|--------|----------|
| `RefreshAllUsersPermissionsJob` | Раз в час | Полный пересчёт прав для всех пользователей |
| `RefreshOnlineUsersPermissionsJob` | Каждые 5 мин | Пересчёт прав только для пользователей, находящихся в сети |

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

1. Проверить лог `job_history` — выполняется ли `AllUserPermissionsRefresh`.
2. Для `RefreshAllUsersPermissionsJob` — см. [support-guide-permissions.md](https://help.1forma.ru/domains/auth/support-guide-permissions.md#5-синхронизация-прав) (диагностика таймаута).

## Отчёт о правах доступа

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

### Параметры фильтрации

Отчёт можно ограничить одним или несколькими параметрами:

| Параметр | Описание |
|----------|----------|
| Пользователь | Вывести права указанных пользователей |
| Группа | Вывести права пользователей, входящих в выбранные группы |
| Категория | Вывести права на выбранную категорию |
| Действие | Вывести права по выбранному действию с категорией |

Параметры можно комбинировать — отчёт строится одновременно по нескольким условиям.

⚠️ Отчёт учитывает права, наследуемые при заместительстве.

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

## Практический чеклист и типовые ошибки

Если пользователь не видит нужные задачи, пройдите по шагам:

1. Убедиться, что пользователь состоит в нужной группе.
2. Проверить права группы на целевую категорию.
3. Проверить, не конфиденциальна ли задача.
4. Для смарт-доступа проверить активность и область правила.
5. Для ДП-цепочек проверить конкретные `ExtParamID` и `SubcatID`.

Наиболее частые ошибки при настройке прав и их причины:

| Симптом | Частая причина |
|---|---|
| Пользователь не видит задачи категории | нет `VIEW` на категорию для его групп |
| Видит часть задач, но не все | доступ идёт только по роли/смарту/ДП |
| Смарт-доступ не срабатывает | правило/группа/категория настроены неверно или кэш не обновлён |
| Гибкий доступ через ДП «не работает» | ошибка в ID ДП или категории, цепочка настроена неверно |
