Доступ к ДП — взаимодействие систем разграничения¶
Документ описывает четыре независимые системы контроля доступа к дополнительным параметрам (ДП) в 1Форме: ExtParamPermission (права группы), TaskEntityPermissionsSet (матрица доступа), SmartAccess (смарт-выражения) и колоночные права табличных ДП. Для администраторов категорий и разработчиков, настраивающих права доступа. Рассматриваются таблицы БД, задействованные в каждой системе, флаги включения и взаимодействие систем при совместной работе.
Обзор¶
Доступ к дополнительным параметрам контролируется тремя независимыми системами. Каждая покрывает свой уровень детализации, но документированного приоритета между ними нет.
Система 1: ExtParamPermission — «группа видит/редактирует ДП»
Система 2: TaskEntityPermissionsSet — «роль/группа в состоянии видит/редактирует ДП»
Система 3: SmartAccess — «пользователи по смарт-выражению видят/редактирует ДП»
Дополнительно для табличных ДП:
Система 4: ExtParamTableSettingsInSubcat*Permissions — «группа/состояние → доступ к колонке»
Система 1: ExtParamPermission (прямые права группы)¶
Уровень детализации: ДП + категория + группа.
| Таблица | PK | Колонки |
|---|---|---|
ExtParamPermission |
(ExtParamID, SubcatID, GroupID) | AllowEdit (bit) |
Логика: если пользователь в группе → AllowEdit=1 → редактирование, иначе — только чтение.
Материализация: ExtParamsRights — кэш прав, пересчитывается SP ExtParamsRightsRefresh.
Где настраивается: Админка категории → ДП → вкладка «Доступ».
Особенности:
- Нет контроля по состояниям — права статичны
- Нет уровня
Disallow— только Read/Write - Самая старая из трёх систем
Система 2: TaskEntityPermissionsSet (матрица доступа)¶
Уровень детализации: ДП + категория + (состояние × роль/группа/действие).
| Таблица | Назначение |
|---|---|
TaskEntityPermissionsSet |
Заголовок матрицы (EntityAccessType=1 для ДП) |
TaskEntityPermissions |
Строки: (StateID, GroupID, ActionID, роли) → AccessType |
Логика: для текущего состояния задачи определяется уровень доступа (Disallow/Read/Write) по приоритету: группы/роли/действия выше, чем «Все».
Флаг включения: ExtParamsInSubcat.TaskEntityPermissionControl (bit). Если false — система 2 не применяется.
Где настраивается: Админка категории → ДП → кнопка «Матрица доступа».
Особенности:
- Контроль по состояниям — самая гибкая из трёх
- Три уровня доступа: Запрет (Disallow), Чтение (Read), Запись (Write)
Список доступных ДП после перехода по маршруту. При смене статуса задачи список доступных ДП обновляется по новому статусу: ДП, ставший доступным в новом статусе, появляется сразу, без перезагрузки страницы.
Система 3: SmartAccessForExtParamsInSubcat (смарт-доступ)¶
Уровень детализации: ДП + категория + SmartExpression → CanRead/CanWrite.
| Таблица | PK | Назначение |
|---|---|---|
SmartAccessForExtParamsInSubcat |
Id | Правило: (SubcatId, ExtParamId?, UsersSmartExpressionId) → CanRead, CanWrite |
SmartAccessForExtParamsInSubcatRules |
Id | Список ДП, на которые действует правило |
SmartAccessForExtParamsInSubcatTriggerExtParams |
Id | При изменении каких ДП пересчитывать |
SmartAccessForExtParamsInSubcatTriggerGroups |
Id | При изменении членства в каких группах пересчитывать |
SmartAccessForExtParamsInSubcatView |
(SmartAccessId, UserId, TaskId) | Материализованный результат |
Логика: SmartExpression возвращает список UserID → для них применяются CanRead/CanWrite. Результат материализуется в View-таблицу.
Флаг включения: ExtParamsInSubcat.SmartAccessControl (bit).
Где настраивается: Админка категории → ДП → «Смарт-доступ».

Особенности:
- Самая мощная: произвольная логика через SmartExpression
- Материализованный результат — обновляется не в реальном времени
ExtParamId = NULLв заголовке → правило на все ДП категории- Триггеры пересчёта настраиваются в карточке правила смарт-доступа ДП: «Пересчёт при смене ДП» — пересчёт при изменении значений выбранных дополнительных параметров, «Пересчёт при добавлении пользователя в группу» — при изменении членства в указанных группах. Триггеры хранятся в таблицах
SmartAccessForExtParamsInSubcatTriggerExtParamsиSmartAccessForExtParamsInSubcatTriggerGroups. Наполнение этих таблиц из интерфейса работает начиная с версии 2.268.346 — до этого настройки триггеров в UI сохранялись только по основному правилу, а junction-таблицы триггеров оставались пустыми и автоматический пересчёт не запускался. Без настроенных триггеров пересчёт выполняется только вручную через кнопку синхронизации.
Схема дочерних таблиц правила:
SmartAccessForExtParamsInSubcat
│ Id, Name, CanRead, CanWrite, UsersSmartExpressionId, ExtParamId?, SubcatId
│
├── Rules (какие ДП скрывать/показывать)
│ SmartAccessId (FK) + ExtParamId (FK → ExtParams)
│
├── TriggerExtParams (при изменении каких ДП пересчитывать View)
│ SmartAccessId (FK) + ExtParamId (FK → ExtParams)
│
└── TriggerGroups (при изменении членства пересчитывать View)
SmartAccessId (FK) + GroupId (FK → Groups)
Система 4: Колоночные права табличных ДП¶
Уровень детализации: колонка табличного ДП + категория + (группа ИЛИ состояние).
| Таблица | PK | Назначение |
|---|---|---|
ExtParamTableSettingsInSubcat |
Id | Привязка колонки к категории: (ExtParamInSubcatId, ColumnId) + флаги |
ExtParamTableSettingsInSubcatGroupPermissions |
Id | Доступ по группе: +GroupId → AccessType |
ExtParamTableSettingsInSubcatStatePermissions |
Id | Доступ по состоянию: +StateId → AccessType |
Флаги включения (в ExtParamTableSettingsInSubcat):
GroupAccessControlMode(int) — режим контроля по группамStateAccessControlEnabled(bit) — контроль по состояниям
Ограничение: виртуальные группы не поддерживаются
При настройке доступа к колонкам таблицы по группам (через ExtParamTableSettingsInSubcatGroupPermissions) виртуальные группы не используются.
Виртуальные группы (тип «Виртуальная», например «Подписчики задач (всем)») предназначены для ограничений на уровне задач, но не для разграничения прав на уровне колонок таблиц. Для колоночных прав доступны только обычные группы (тип «Обычная» и «Связанная»).
Взаимодействие систем¶
Порядок проверки и применимость систем¶
Какие системы действуют в разных ситуациях:
| Ситуация | Системы |
|---|---|
| ДП в категории, матрица выключена, SmartAccess выключен | Только система 1 (ExtParamPermission) |
| ДП в категории, матрица включена | Система 1 + Система 2 |
| ДП в категории, SmartAccess включен | Система 1 + Система 3 |
| Колонка табличного ДП, контроль по группам или состояниям включён | Система 1 + Система 4 |
| Всё включено | Все четыре системы |
Проверка доступа (функция БД fn_AccessGetAccessTypeExtParam) идёт в определённом порядке, но документированного приоритета нет. Фактическое поведение:
- Система 3 (SmartAccess) — если включена, материализованный View определяет видимость ДП
- Система 2 (матрица) — если включена, определяет AccessType по состоянию/роли
- Система 1 (ExtParamPermission) — базовый уровень Read/Write по группе
- Система 4 (колоночные права) — применяется поверх для табличных ДП
Конфликт: если SmartAccess скрывает ДП (CanRead=0), но матрица разрешает Write — побеждает SmartAccess (ДП скрыт). Обратное: если матрица запрещает, а SmartAccess разрешает — ДП доступен. Фактически SmartAccess работает как маска видимости, а матрица — как уровень доступа.
Схема¶
Сводная схема систем доступа к ДП:
┌─ ExtParamPermission (Read/Write по группе)
│
ExtParamsInSubcat ────────┼─ TaskEntityPermissionsSet (Disallow/Read/Write по состоянию×роль)
│ │ └── TaskEntityPermissions (строки матрицы)
│ │
│ └─ SmartAccessForExtParamsInSubcat (маска видимости)
│ ├── Rules
│ ├── TriggerExtParams
│ └── TriggerGroups
│
└── ExtParamTableSettingsInSubcat (для табличных ДП)
├── GroupPermissions (Read/Write по группе на колонку)
└── StatePermissions (Read/Write по состоянию на колонку)