# Пространства — Администрирование

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

![Раздел «Пространства»: дерево пространств и список статей](https://help.1forma.ru/help-images/spaces/spaces-02.png)

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

### Автоадминка — через смежные домены

Формы автоадминки из смежных доменов, через которые настраиваются пространства:

| Alias формы | Название | Таблица БД | Папка |
|-------------|----------|-----------|-------|
| `custom-settings` | Пользовательские настройки | dbo.SettingsCustom | Системные настройки |
| `workplaces` | Рабочие места группы | dbo.UserGroupSettings | Пользовательский интерфейс |
| `favourites` ¹ | Избранное группы | dbo.UserLinks | Пользовательский интерфейс |
| `groups` | Группы | dbo.Groups | Пользователи и группы |

¹ Форма `favourites` — **отдельная SPA-страница** (`/administration/favorites-groups`), зарегистрированная в дереве автоадминки.

## Кто может создавать пространства и разделы

Те же операции доступны из интерфейса пространств: кнопка «+» рядом с поиском открывает создание пространства (название, группы-администраторы, группы просмотра, раздел), правая кнопка мыши на пространстве — его редактирование, отдельная форма создаёт раздел. В интерфейсе эти кнопки видят только пользователи с правом «Администратор категории» на соответствующем разделе; для остальных создание недоступно. Подробное описание пользовательского сценария — в [бизнес-описании домена](https://help.1forma.ru/domains/spaces/business.md).

Создание и редактирование пространств не требует глобальных прав администратора. Соответствующие методы админ-API помечены атрибутом `AllowNonAdmin`: общая проверка роли администратора для них не выполняется, права проверяются внутри сервиса по конкретному разделу или пространству. Если проверка не прошла, возвращается ошибка доступа.

| Операция | Метод API | Кому доступна |
|----------|-----------|---------------|
| Создать пространство | `POST /api/admin/spaces` | Глобальный администратор; член группы-администратора целевого раздела (`CategoryGroupPermissions`, действие `CATEGORY_ADMIN`); пользователь с правом «Администратор категории» (`AdminCat`) хотя бы на одной категории целевого раздела |
| Редактировать пространство (название, права групп) | `POST /api/admin/spaces/{spaceId}` | Глобальный администратор; администратор самого пространства — право `AdminCat` на категории-пространстве |
| Получить разделы, доступные для создания пространств | `GET /api/admin/spaces/available-categories` | Любой авторизованный; в ответ попадают только те разделы, где у пользователя есть одно из прав, перечисленных для создания |
| Создать раздел | `POST /api/admin/categories` | Глобальный администратор (признак «бог» или специальное право `CHSC`); член группы-администратора родительского раздела. Раздел верхнего уровня, без родителя, создаёт только глобальный администратор |
| Редактировать, удалить, скопировать раздел | `POST /api/admin/categories/{categoryId}`, `DELETE /api/admin/categories/{categoryId}`, `POST /api/admin/categories/{categoryId}/copy` | Только глобальный администратор |

**Где выполняется проверка:**

| Операция | Проверка |
|----------|----------|
| Создание пространства | `SpacesAdminService.CreateSpace` → `CanCreateSpaceInCategory` |
| Редактирование пространства | `BaseAdminController.CheckAdminOrSubcategoryAdmin` → `Permissions.CheckGodOrSubcatAdmin` |
| Создание раздела | `CategoryAdminService.CreateCategory` → `CanCreateCategory` |

Право «Администратор категории» на подкатегориях раздела определяется по дереву категорий пользователя (`Categories.GetSubcategoriesInUserTree` с действием `AdminCat`), поэтому администратору достаточно прав хотя бы на одну категорию нужного раздела.

**Что происходит при создании пространства:** создаётся категория с типом «Пространство», к ней применяется настройка по типу категории, а группам из запроса выставляются права «Администратор категории» (`AdminGroupIds`) и «Просмотр» (`ViewerGroupIds`) с пересчётом прав на категорию. Настройка по типу неоднородна: иконка и цвет по умолчанию ставятся всегда, а системные ДП пространства и признак `IsWikiSubcat = 1` — только если настройка `SpaceSettings` заведена, содержит блок `ExtParams` и включена (`IsActive = true`). Если пространства выключены или настройка не заполнена, запрос всё равно успешно вернёт идентификатор, но категория останется с типом «Пространство» и `IsWikiSubcat = 0`: пространством она не станет, в списках пространств не появится, а её собственное редактирование через `POST /api/admin/spaces/{spaceId}` сразу даст `404`. При редактировании синхронизируется каждый список групп, переданный в запросе: перечисленным в нём группам право включается, остальным — выключается. Список, отсутствующий в запросе, не обрабатывается: соответствующее право остаётся как было.

**Какой идентификатор принимается при редактировании:** редактирование работает только с категорией, у которой стоит признак вики-категории (`IsWikiSubcat = 1`). Если категории с указанным идентификатором нет или признак снят, ничего не меняется: API отвечает `404` с сообщением «Сущность типа SubcategoryEntity с идентификатором {id} отсутствует в системе». Обычная категория задач для операций с пространствами не существует — её нельзя ни переименовать, ни переписать ей права групп через `POST /api/admin/spaces/{spaceId}`, а это важно, потому что синхронизация переданного списка групп снимает право у всех групп, в него не попавших: пустой список `[]` снимает право у всех, а запрос вообще без `AdminGroupIds` и `ViewerGroupIds` (например, только с новым названием) права не трогает. Проверка нужна именно на редактировании: это единственная пишущая операция пространств, принимающая идентификатор уже существующей категории. При создании (`POST /api/admin/spaces`) признак выставляет сама система — но только при заполненной и включённой настройке `SpaceSettings` (см. выше), — а списки пространств и статей и так отбираются по нему.

Порядок проверок в методе редактирования: сначала права, затем признак вики-категории. Поэтому на незнакомом идентификаторе настройщик без прав администратора на этой категории получает отказ в доступе (`403`), а сообщение об отсутствующей сущности видит тот, у кого права есть.

### Журналирование прав групп

Простановка и снятие прав группы на категорию-пространство записываются в журнал действий администраторов (`dbo.ActionLog`) записью типа `group_on_subcategory_permission`: сохраняются инициатор, группа, пространство, действие, на которое выдано право, и признак «включено/снято». Запись создаётся и при создании пространства, где группам выставляются права «Администратор категории» и «Просмотр», и при редактировании — по каждой группе, у которой право изменилось. Если строку права успел снять параллельный запрос, записи не появляется. Права и порядок проверок при этом не меняются.

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

### Конфигурация пространств (SettingsCustom)

**Где настраивается:** автоадминка → форма `custom-settings` → запись `Key = SpaceSettings`
**Таблица БД:** `dbo.SettingsCustom`

JSON-значение определяет:
- `IsActive` — включены ли пространства (если `false` — скрыты независимо от навигационных настроек)
- `RootCatId` — корневая категория дерева пространств
- `ExtParams` — системные ДП пространства (контент, обложка, родитель и др.)

**Как применяется:** эти настройки используются для построения дерева пространств и отображения статей.

![Создание статьи пространства: обложка, название и контент](https://help.1forma.ru/help-images/spaces/space_create_cover.png)

### Тип категории «Пространство» (Subcategories)

**Где настраивается:** автоадминка → форма `subcategories`
**Таблица БД:** `dbo.Subcategories`

| Поле | Что контролирует |
|------|------------------|
| `SubcatTypeID` = «Пространство» | Категория попадает в контур пространств |
| `IsWikiSubcat = 1` | Включает вики-функциональность; служит признаком пространства для админ-API: со снятым признаком категория не редактируется как пространство |
| `OneFMainVisibilityMode` | Определяет показ контента в лентах/списках |

### Видимость блока «Пространства» (UserGroupSettings)

**Где настраивается:** автоадминка → форма `workplaces`
**Таблица БД:** `dbo.UserGroupSettings`

| Поле | Что контролирует |
|------|------------------|
| `SpacesVisible` | Показывает/скрывает раздел «Пространства» в левом меню |

### Избранное: ссылки на пространства (UserLinks)

**Где настраивается:** SPA-страница `/administration/favorites-groups` (пункт `favourites` в дереве автоадминки)
**Таблица БД:** `dbo.UserLinks`

Ссылки типа «Пространство» и «Страница пространства» для быстрой навигации в конкретное пространство/статью.

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

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

| Поле | Что контролирует |
|------|------------------|
| `TypeId` | Тип ссылки (пространство / страница пространства) |
| `LinkedObjectId` | ID привязанного пространства/статьи |
| `Href` | URL для перехода |

### Привязка группы к статье (Groups)

**Где настраивается:** автоадминка → форма `groups`
**Таблица БД:** `dbo.Groups`

| Поле | Что контролирует |
|------|------------------|
| `SpaceTaskID` | Кнопка перехода в статью пространства из сценариев интерфейса группы |

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

Частые проблемы при настройке пространств: вероятная причина, где проверить и запрос для диагностики в БД:

| Симптом | Причина | Где проверить | SQL-диагностика |
|---------|---------|---------------|-----------------|
| Пользователь не видит «Пространства» | `IsActive = false` или `SpacesVisible` выключен | Формы `custom-settings`, `workplaces` | `select [Value] from dbo.SettingsCustom where [Key] = 'SpaceSettings'; select GroupId, SpacesVisible from dbo.UserGroupSettings` |
| Пространство есть в БД, но не в списке | Неверный `RootCatId` или категория не типа «Пространство» | `dbo.SettingsCustom`, `dbo.Subcategories` | `select Id, SubcatTypeID, IsWikiSubcat from dbo.Subcategories where Id = {subcatId}` |
| В статье нет контента/обложки/родителя | Неверные ID в `SpaceSettings.ExtParams` | `dbo.SettingsCustom` → JSON `ExtParams` | Проверить соответствующие ДП в категории пространства |
| При редактировании пространства — «Сущность типа SubcategoryEntity … отсутствует в системе» | Идентификатор указывает на обычную категорию задач либо у категории снят `IsWikiSubcat` | Форма `subcategories` | `select Id, SubcatTypeID, IsWikiSubcat from dbo.Subcategories where Id = {spaceId}` |
| Ссылка из избранного открывает не тот объект | Неверный `TypeId` или `LinkedObjectId` | Форма `favourites` | `select * from dbo.UserLinks where Id = {linkId}` |
| Кнопка группы ведёт в неверную статью | Неверный `SpaceTaskID` | Форма `groups` | `select Id, SpaceTaskID from dbo.Groups where Id = {groupId}` |

## Связанные документы

См. также:

- [Пространства — бизнес-логика](https://help.1forma.ru/domains/spaces/business.md) — дерево, статьи, навигация
- [Социальная сеть — администрирование](https://help.1forma.ru/domains/social-network/admin.md) — пересечение по вики-категориям
- [Системные настройки](https://help.1forma.ru/domains/system/admin.md) — `custom-settings`
- [Категории — администрирование](https://help.1forma.ru/domains/categories/admin.md) — типы категорий, ДП
