# Отображение в выборке

Отображение группирует бизнес-логику выборки в зависимости от способа представления данных.

Стандартные отображения для класса:
- `Default` — отображение по умолчанию. В нем определяется общая функциональность для данных выборки. Остальные отображения обычно наследуют это отображение;
- `List` — отображение для списка объектов класса;
- `Card` — отображение для карточки объекта;

## Пользовательские настройки отображения

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

К таким настройкам относятся:
- видимость колонок;
- порядок следования колонок;
- ширина колонок;
- сортировка колонок;
- группировка строк;
- отображение области итогов.
 
При выходе из приложения текущее состояние списка сохраняется автоматически.

### Интеграционные события

При работе с настройками вызываются события ядра:

- `onSaveUserSettings` — сохранение пользовательской настройки;
- `onSaveAsUserSettings` — сохранение как новой настройки;
- `onLoadUserSettings` — загрузка выбранной настройки;
- `onLoadDefaultUserSettings` — загрузка настройки при открытии выборки.

Логика событий реализуется на прикладном уровне, управление пунктами меню выполняется ядром.

### Управление пользовательскими настройками отображения

Управление настройками выполняется через контекстное меню списка.

Чтобы открыть меню:
- нажмите правой кнопкой мыши на любую область таблицы;
- выберите пункт **«Настройки пользователя»**.

Доступны операции:
- сохранение настройки;
- сохранение настройки с новым именем;
- загрузка настройки;
- восстановление настроек по умолчанию.

#### Сохранение настроек

Чтобы сохранить текущую настройку:
- откройте контекстное меню списка;
- выберите **«Настройки пользователя» > «Сохранить»** или **«Сохранить как»**.

Откроется окно сохранения настроек.

В окне указываются:
- наименование настройки;
- доступность:
  - **Для всех**;
  - **Для пользователей** — доступен выбор пользователей;
  - **Профиль** — доступен выбор профиля;
  - **Только для меня**.

Дополнительно:
- может быть установлен признак **«По умолчанию»** — такая настройка применяется при открытии выборки.

Для завершения используется кнопка **«Выбор»**.  
После сохранения настройка применяется к текущему отображению.

#### Загрузка настроек

Для одного интерфейса может быть сохранено несколько пользовательских настроек.

Чтобы загрузить сохранённую настройку:
- откройте контекстное меню списка;
- выберите **«Настройки пользователя» > «Загрузить»**.

Откроется список доступных настроек. Доступны фильтры:
- **Личные** — настройки текущего пользователя;
- **Общие** — доступные настройки (для всех, пользователей, профилей);
- **Других пользователей** — остальные настройки.

Для скрытия общих настроек снимите флаг **«Общие»**.

После выбора настройка применяется к списку.

#### Восстановление настроек по умолчанию

**Восстановление настроек по умолчанию через интерфейс системы**  

Чтобы вернуть отображение к исходному виду:
- откройте контекстное меню списка;
- выберите **«Восстановить настройки по умолчанию»**.

Это основной пользовательский способ сброса настроек.

**Восстановление настроек по умолчанию через прикладной код**  

```{attention}
Метод следует использовать только в ситуациях, когда восстановление через интерфейс не сработало.
```

Для программного сброса используется метод:

`selection.layout.frame.view.asListView.restoreDefaultSettings()`

Пример:
```scala
override def beforeFirstOpen(): Unit = {
  super.beforeFirstOpen()
  selection.layout.frame.view.asListView.restoreDefaultSettings()
}
```

Метод сбрасывает пользовательские настройки list-view и восстанавливает отображение в соответствии с конфигурацией выборки.

### Применение настройки по умолчанию

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

Если пользователю доступны несколько таких настроек, применяется одна из них с учётом приоритета:
- **Только для меня**;
- **Для пользователей**;
- **Профиль**;
- **Для всех**.

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

### Ограничения прав доступа

Настройка прав доступа выполняется в приложении **«Администратор»** в разделе:
`Доступ > Роли > Права роли.` Подробнее про права роли см. в [Администрирование приложений](http://helpcenter.gs.local/G3AppAdministrationGuide/html/030_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80.html#id8).

В системе права доступа для работы с пользовательскими настройками списка  определяются администрируемым объектом `Btk_SelGridSetting`.

В объекте используются следующие привилегии:

- `CanEditPublicSetting` — сохранение и редактирование публичных настроек.  
Определяет возможность создавать и изменять настройки с доступностью:
  - **Для пользователей**;
  - **Профиль**;
  - **Для всех**.

  При отсутствии данной привилегии:
  - недоступен выбор указанных типов доступности;
  - недоступно редактирование соответствующих настроек;
  - невозможно сохранить настройку, если активна настройка с публичной доступностью.
- `CanEditAnotherUserSetting` — редактирование настроек других пользователей.  
Определяет возможность изменять настройки, созданные другими пользователями.  
  При отсутствии данной привилегии редактирование доступно только для собственных настроек.

Ограничения прав доступа учитываются как при сохранении, так и при редактировании и загрузке настроек.

### Примеры сценариев

**Сохранение удобного представления списка**

Пользователь настраивает состав колонок и сортировку, затем сохраняет настройку через  
**«Настройки пользователя» > «Сохранить как»**.  
В дальнейшем настройка может быть быстро загружена при работе с выборкой.

**Использование настройки по умолчанию**

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

**Сброс некорректных настроек**

После изменения разметки списка ранее сохранённые настройки могут работать некорректно.  
В этом случае используется:
- пользовательский сценарий — **«Восстановить настройки по умолчанию»**;
- программный сброс — `restoreDefaultSettings()` (в исключительных случаях).

## Восстанавливать изменения в интерфейсе при переоткрытии

Флажок управляет приоритетом между автоматически сохраняемыми настройками интерфейса (автонастройками) и явно сохраненными пользовательскими настройками.

### Назначение

Флаг определяет, какие настройки применяются при открытии выборки:
- автонастройки (состояние интерфейса, сохраненное в реестре при закрытии);
- пользовательские настройки (сохраненные через контекстное меню).

Значение по умолчанию: включено.

### Уровни конфигурации

| Уровень | Параметр / элемент | Описание |
|--------|---------------------|----------|
| Сервер | `Configuration.Databases.Database.UI.AutoSettings.RestoreAutoSettingsRegardlessOfUserSettings` | Глобальный приоритет автонастроек над пользовательскими настройками. По умолчанию `true` |
| Сервер | `Configuration.Databases.Database.UI.AutoSettings.AllowUserToChangeSettings` | Разрешение пользователю изменять флаг. По умолчанию `true` |
| Главное меню | `Флажок "Восстанавливать изменения в интерфейсе при переоткрытии"` | Пользовательское управление флагом (`CoreApplication.AutoSettings.RestoreWhenHasUserSettings`) |
| Контекстное меню грида | `Флажок "Восстанавливать изменения в интерфейсе при переоткрытии"` | Дублирующий элемент управления, может быть отключен администратором |

### Логика применения при открытии выборки

При открытии выборки система определяет источник настроек:

**Если флаг включен**
- есть автонастройки в реестре > применяются автонастройки;
- нет автонастроек > применяется пользовательская настройка (если существует).

**Если флаг выключен**
- есть пользовательская настройка > применяется она;
- нет пользовательской настройки > применяются автонастройки из реестра.

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

### Поведение при наличии пользовательских и административных настроек

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

Режим активируется параметром:
`RestoreAutoSettingsRegardlessOfUserSettings = true`

### Ограничение изменения флага

Возможность изменения флага определяется серверным параметром:
`Configuration.Databases.Database.UI.AutoSettings.AllowUserToChangeSettings`

Если параметр выключен:
- флаг в UI становится недоступным для изменения;
- доступно только администраторское управление.

### Техническая реализация

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

Флаг на уровне API:

`ru.bitec.gtk.core.gl.CoreAutoSettings.isAllowUserToChangeSettings()`

Переопределение поведения:

`ru.bitec.gtk.core.gl.CoreAutoSettings.isRestoreAutoSettingsRegardlessOfUserSettings()`

Итоговое поведение формируется на уровне:

`CoreApplication.autoSettings()`