# Настройки отображения выборки

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

В системе используются два механизма сохранения состояния выборки:

- пользовательские настройки — именованные настройки, которые явно сохраняются через контекстное меню списка;
- автонастройки — текущее состояние интерфейса, которое автоматически сохраняется в реестре при выходе из приложения.

При открытии выборки система определяет, какой из этих источников использовать.

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

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

Стандартные отображения для класса:

- `Default` — отображение по умолчанию, в котором определяется общая функциональность выборки. Остальные отображения обычно наследуют его настройки;
- `List` — отображение списка объектов класса;
- `Card` — отображение карточки объекта;
- `Lookup` — отображение списка объектов, открываемого для выбора значения.

О настройке деревьев с частичной загрузкой данных см. в разделе [«Частично загружаемые деревья»](050_частично_загружаемые_деревья.md).

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

Пользовательские настройки отображения позволяют адаптировать внешний вид и поведение списка под рабочий сценарий.

В настройке сохраняются:

- видимость колонок;
- порядок следования колонок;
- ширина колонок;
- сортировка колонок;
- группировка строк;
- отображение области итогов.

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

Права на создание и изменение настроек определяются ролями пользователя.

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

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

Чтобы открыть меню:

1. Нажмите правой кнопкой мыши на любую область таблицы.
2. Выберите пункт **Настройки пользователя**.

В меню доступны операции:

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

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

Чтобы сохранить текущую настройку:

1. Откройте контекстное меню списка.
2. Выберите **Настройки пользователя > Сохранить** или **Настройки пользователя > Сохранить как**.

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

В окне указываются:

- наименование настройки;
- доступность настройки;
- признак **По умолчанию**.

Для настройки можно выбрать один из следующих вариантов доступности:

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

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

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

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

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

Чтобы загрузить сохранённую настройку:

1. Откройте контекстное меню списка.
2. Выберите **Настройки пользователя > Загрузить**.

Откроется список доступных настроек.

Для отбора настроек используются флаги:

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

Чтобы скрыть общие настройки, снимите флаг **Общие**.

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

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

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

Если пользователю доступны несколько таких настроек, система выбирает одну из них в следующем порядке:

1. **Только для меня**.
2. **Для пользователей**.
3. **Профиль**.
4. **Для всех**.

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

Автоматическое применение пользовательской настройки также зависит от флага **Восстанавливать изменения в интерфейсе при переоткрытии**.

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

Чтобы вернуть отображение к исходному виду:

1. Откройте контекстное меню списка.
2. Выберите **Восстановить настройки по умолчанию**.

Это основной способ сброса пользовательских настроек через интерфейс системы.

Метод `restoreDefaultSettings()` используется для программного сброса настроек списка.

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

Для сброса используется вызов:

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

Пример вызова при первом открытии выборки:

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

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

## Автоматическое восстановление состояния интерфейса

При выходе из приложения текущее состояние списка автоматически сохраняется в реестре. Такие сведения называются автонастройками.

Флаг **Восстанавливать изменения в интерфейсе при переоткрытии** определяет приоритет между автонастройками и явно сохранёнными пользовательскими настройками.

По умолчанию флаг включён.

### Управление флагом

Флаг доступен:

- в главном меню приложения;
- в контекстном меню списка.

Элементы управления изменяют значение `CoreApplication.AutoSettings.RestoreWhenHasUserSettings`.

Флаг в контекстном меню списка дублирует элемент главного меню и может быть отключён администратором.

### Применение настроек при открытии выборки

Если флаг **Восстанавливать изменения в интерфейсе при переоткрытии** включён:

- при наличии автонастроек применяются автонастройки;
- при отсутствии автонастроек применяется доступная пользовательская настройка.

Если флаг выключен:

- при наличии пользовательской настройки применяется пользовательская настройка;
- при отсутствии пользовательской настройки применяются автонастройки из реестра.

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

## Серверные параметры автонастроек

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

| Параметр                                                                                       | Назначение                                                                                       | Значение по умолчанию |
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | --------------------- |
| `Configuration.Databases.Database.UI.AutoSettings.RestoreAutoSettingsRegardlessOfUserSettings` | Устанавливает глобальный приоритет автонастроек над пользовательскими настройками                | `true`                |
| `Configuration.Databases.Database.UI.AutoSettings.AllowUserToChangeSettings`                   | Разрешает пользователю изменять флаг **Восстанавливать изменения в интерфейсе при переоткрытии** | `true`                |

### Приоритет административной конфигурации

Если параметр `RestoreAutoSettingsRegardlessOfUserSettings` имеет значение `true`, применяется режим административного управления автонастройками.

В этом режиме:

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

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

Возможность изменения флага определяется параметром:

```text
Configuration.Databases.Database.UI.AutoSettings.AllowUserToChangeSettings
```

Если параметр имеет значение `false`:

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

На уровне API возможность изменения флага определяется методом:

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

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

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

Итоговые параметры автонастроек приложения доступны через:

```scala
CoreApplication.autoSettings()
```

## Права доступа

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

Путь: `Доступ > Роли > Права роли`.

Подробнее о настройке прав см. в разделе [Администрирование приложений](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` — изменение настроек, созданных другими пользователями.

### Публичные настройки

Привилегия `CanEditPublicSetting` разрешает создавать и изменять настройки со следующими вариантами доступности:

- **Для пользователей**;
- **Профиль**;
- **Для всех**.

Если у пользователя отсутствует эта привилегия:

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

### Настройки других пользователей

Привилегия `CanEditAnotherUserSetting` разрешает изменять настройки, созданные другими пользователями.

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

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

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

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

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

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

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

## Примеры использования

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

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

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

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

**Сброс некорректной настройки**

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

В этом случае используются:

- **Восстановить настройки по умолчанию** — основной пользовательский способ;
- `restoreDefaultSettings()` — программный способ для ситуаций, когда восстановление через интерфейс не сработало.
