# Обозреватель проекта

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

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

Путь: `Приложение «Настройка системы» > Сущности > Обозреватель проекта`.

![](/050_tools/img/Project-reviewer.png)

Также обозреватель проекта можно открыть из списка классов операцией **Перейти в обозреватель проекта**.

Через Обозреватель проекта можно, например:

- **Включить групповое редактирование** — порядок добавления операции приведен в разделе [Включение группового редактирования](https://help.globalerp.ru/books/GlobalServerAppGuide/SNAPSHOT/html/040_selection/070_%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%BE%D0%B2.html#id4).
- **Включить универсальный фильтр** — порядок настройки приведен в примере **Включение универсального фильтра** в разделе [Редактор операций](#редактор-операций).
- **Добавить собственную операцию** — порядок настройки приведен в примере **Создание JEXL-операции** в разделе [Редактор операций](#редактор-операций).
- **Вывести скрытый атрибут или изменить его подпись** — примеры приведены в разделе [Редактор атрибутов](#редактор-атрибутов).
- **Связать отображение с объектом администрирования** — пример приведен в разделе [Настройка отображений](#настройка-отображений).
- **Ограничить редактирование атрибута по условию** — пример приведен в разделе [Выражения доступности атрибутов](#выражения-доступности-атрибутов).
- **Установить начальное значение фильтра при открытии выборки** — пример приведен в разделе [События выборки](#события-выборки).
- **Добавить проверку перед сохранением объекта** — пример приведен в разделе [Точки расширения](#точки-расширения).

## Операции обозревателя проекта

На панели инструментов обозревателя проекта доступны операции:

| Операция | Назначение |
| --- | --- |
| **Сохранить** | Сохраняет внесенные изменения. |
| **Откатить** | Отменяет изменения, которые еще не были сохранены. |
| **Обновить** | Обновляет данные в окне обозревателя проекта. |
| **Редактировать** | Открывает окно редактирования выбранной сущности. Для класса в окне доступны его общие свойства, атрибуты, коллекции, характеристики, состояния и другие настройки. |
| **Синхронизация схемы** | Открывает операции синхронизации схемы. |
| **Воркспейс** | Открывает операции работы с воркспейсами. Подробнее см. в разделе [Воркспейсы](#воркспейсы). |
| **Дополнительно** | Открывает дополнительные операции. Добавление настроек выборки описано в разделе [Добавление переопределений в пакет обновления конфигурации](#добавление-переопределений-в-пакет-обновления-конфигурации). |

**Синхронизация схемы**.

В меню **Синхронизация схемы** доступны операции:

- **Синхронизировать по классу** — запускает синхронизацию для выбранного класса;
- **Синхронизировать по модулю** — запускает синхронизацию для выбранного модуля;
- **Корзина удаленных объектов схем** — открывает выборку `Btk_DbGeneratorTrash`.

Чтобы выполнить синхронизацию:

1. Раскройте меню **Синхронизация схемы** на панели инструментов.
2. Выберите **Синхронизировать по классу** или **Синхронизировать по модулю**.
3. В открывшемся окне укажите тип партиции:
   - **Класс** — генерация выполняется для одного выбранного класса;
   - **Модуль** — для всех классов выбранного модуля;
   - **Полная** — для всех классов всех модулей.
4. Выберите режим синхронизации:
   - **Ленивая** — ODM-файл повторно не обрабатывается, если он не изменился с предыдущей генерации;
   - **Полная** — обрабатываются все ODM-файлы выбранной области независимо от наличия изменений.

5. Запустите синхронизацию.

## Дерево сущностей

Дерево сущностей — это основная навигационная область обозревателя проекта. Оно расположено в левой части окна и содержит список сущностей проекта.

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

В дереве отображаются:

- классы;
- выборки, включая выборки без класса;
- файлы `Api` и `Avi`, связанные с классами;
- прикладная бизнес-логика `Api`;
- пакеты прикладной бизнес-логики `Pkg`;
- воркспейсы.

Для классов в качестве дочерних элементов отображаются базовая выборка и `Api`.

Через дерево можно выбрать нужную сущность и открыть связанные с ней вкладки: **Описание**, **Редактор атрибутов**, **Редактор операций**, **Настройка**, **Настройка отображений** и другие. Состав вкладок зависит от типа выбранной сущности.

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

- **Логическая структура** — каталоги для сущностей определяются по тегу `logicFolder`. Если в метаданных класса, выборки или пакета указан тег `logicFolder`, сущность отображается в указанном логическом каталоге. Если тег не задан, используется физический каталог. Пример значения: `logicFolder = "audit.test"`.

- **Физическая структура** — каталоги определяются по расположению сущности внутри проекта. Например, для Scala-пакета `ru.bitec.app.btk.audit.test` каталогом будет `audit.test`.

## Воркспейсы

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

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

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

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

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

### Создание воркспейса

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

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

**Создание через интерфейс.** Чтобы создать воркспейс:

1. В поле **Модуль** выберите модуль, в котором нужно создать воркспейс.
2. Нажмите **Воркспейс**.
3. Выберите **Создать воркспейс**.
4. В открывшемся окне **Воркспейс** укажите уникальное имя воркспейса.
5. Укажите наименование воркспейса.
6. Нажмите **Сохранить**.

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

**Регистрация в коде.** Воркспейс можно зарегистрировать программно.

Пример регистрации воркспейса в коде:

<!-- Начало кода -->
```scala
Bs_ClassDiagramWorkspaceApi().register(
  spSystemName = "Test",
  idpModule = Btk_ModuleApi().findByMnemoCode("rpltst"),
  spFolder = "test",
  spCaption = "Тест"
)

```
<!-- Конец кода -->
Параметры регистрации:
- `spSystemName` — системное имя воркспейса;
- `idpModule` — идентификатор модуля, в котором создается воркспейс;
- `spFolder` — папка, в которой создается воркспейс. Если передано значение `null`, воркспейс отображается в корне модуля;
- `spCaption` — наименование воркспейса.
```{attention}
Метод регистрации не изменяет папку и наименование, если воркспейс с таким системным именем и модулем уже существует.
```

### Наполнение воркспейса

При создании пустого воркспейса на вкладке **Настройка** доступны операции для первичного добавления классов.

Доступные операции:

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

### Перенос воркспейса

Воркспейс можно перенести с одного проекта на другой. Для этого используются операции в меню операций с воркспейсами:

- **Выгрузка воркспейса** — открывает окно с текстом в формате JSON. Полученный JSON можно скопировать;
- **Загрузка воркспейса** — открывает окно, в которое нужно вставить JSON, полученный при выгрузке воркспейса.

Для удаления воркспейса используется операция **Удалить воркспейс**.

## Настройки классов

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

## Настройки классов

### Описание класса

![Описание класса](/050_tools/img/project_explorer_description.png)

На вкладке **Описание** отображаются системное имя и наименование класса, его тип, предок и список атрибутов. Для атрибутов указываются системные имена и наименования.

### Коллекции

На вкладке **Коллекции** отображаются все коллекции класса. Вручную добавленные коллекции можно добавить или удалить.

## Настройки выборки

В обозревателе проекта можно открыть выборку и настроить ее атрибуты, операции, аудит и отображения. Настройки применяются к отображению, выбранному в фильтре.

Чтобы перейти к настройкам выборки:

1. Откройте обозреватель проекта.
2. Найдите нужную выборку с помощью фильтров **Модуль**, **Имя** или **Наименование**.
3. Раскройте класс и выберите связанную с ним выборку (`Avi`).
4. В правой части окна откройте вкладку с требуемыми настройками.
5. В поле **Отображение** выберите отображение, для которого нужно изменить настройки.

### Описание выборки

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

### Редактор атрибутов

![Редактор атрибутов выборки](/050_tools/img/project_explorer_attribute_editor.png)

Вкладка **Редактор атрибутов** используется для настройки состава и свойств полей выбранного отображения.

В редакторе можно настроить свойства атрибутов:

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

У каждого свойства есть два значения настройки: стандартное значение и значение для конкретного отображения.

| Поле | Описание |
| --- | --- |
| **Def. Значение** | Стандартное значение для отображения `Default`. От него наследуются остальные отображения, поэтому стандартные настройки применяются к атрибутам других отображений. |
| **Значение** | Переопределение свойства для конкретного отображения. Такая настройка действует только для выбранного отображения и не наследуется на дочерние отображения. |

Чтобы изменить свойство атрибута для конкретного отображения:

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Редактор атрибутов**.
3. В поле **Отображение** выберите карточку, список или другое отображение, в котором нужно изменить поле.
4. В таблице атрибутов выберите требуемый атрибут.
5. В нижней таблице свойств найдите параметр, который нужно изменить.
6. Укажите новое значение свойства в колонке **Значение**.
7. Сохраните изменения и переоткройте настраиваемую форму.

В примерах используется `sDescription` — строковый атрибут, который отображается в интерфейсе как поле **Описание** и содержит дополнительное текстовое описание объекта. Атрибут присутствует не во всех выборках. Если его нет, используйте другой атрибут выбранной формы.

**Пример отображения атрибута «Описание».**

Если атрибут `sDescription` присутствует в выборке, но скрыт в карточке, его можно вывести без изменения формы в исходном коде.

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Редактор атрибутов**.
3. В поле **Отображение** выберите `Card`.
4. В таблице атрибутов выберите `sDescription`.
5. Для свойства **Видимость** включите значение в колонке **Значение**.
6. Сохраните изменения и переоткройте карточку.

После настройки поле **Описание** отображается в карточке.

**Пример изменения подписи атрибута.**

Для атрибута `sDescription` можно изменить подпись **Описание** на **Дополнительное описание** только в карточке.

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Редактор атрибутов**.
3. В поле **Отображение** выберите `Card`.
4. В таблице атрибутов выберите `sDescription`.
5. В таблице свойств выберите свойство **Наименование**.
6. В колонке **Значение** укажите `Дополнительное описание`.
7. Сохраните изменения и переоткройте карточку.

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

Чтобы вернуть стандартное значение свойства, выделите значение в колонке **Значение** и нажмите кнопку с изображением корзины на панели редактора.

#### Настройка существующих экранных форм

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

Удаление поля из экранной формы выполняется на уровне отображения или разметки формы. При такой настройке поле исключается из пользовательского интерфейса для соответствующей формы, но сам атрибут класса и данные в БД не удаляются. Это позволяет изменить состав экранной формы без изменения структуры хранения данных и без удаления бизнес-атрибута из модели.

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

Чтобы убрать поле из конкретной формы, выберите связанную с формой выборку (`Avi`), откройте вкладку **Редактор атрибутов**, выберите используемое отображение и отключите свойство **Видимость** для требуемого атрибута. Сам атрибут класса при этом удалять не требуется.

#### Выражения доступности атрибутов

Для атрибутов можно задать логическое выражение доступности. Это `JEXL`-скрипт, результат выполнения которого определяет доступность атрибута:

- `true` или `null` — атрибут доступен;
- `false` — атрибут недоступен.

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

Вкладка **Выражения доступности** разделена на две области:

- левая область — скрипт выполняется после `checkWorkability`;
- правая область — скрипт выполняется до `checkWorkability`.

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

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

1. На вкладке **Редактор атрибутов** выберите отображение и атрибут.
2. Откройте вкладку **Выражения доступности** в нижней части редактора.
3. Укажите `JEXL`-выражение в области, соответствующей требуемому порядку выполнения относительно `checkWorkability`.
4. Сохраните изменения и проверьте доступность поля в настроенном отображении.

**Пример блокировки поля для выбранного типа объекта.**

В примере атрибут `sDescription` доступен в карточке для всех объектов, кроме объектов типа `Wf_DocRKDChangeReport`.

1. На вкладке **Редактор атрибутов** выберите отображение `Card`.
2. Выберите атрибут `sDescription`.
3. Откройте вкладку **Выражения доступности**.
4. В левой области укажите выражение:

<!-- Начало кода -->
```scala
getVar("idObjectType").asNLong() != Btk_ObjectTypeApi.findByMnemoCode("Wf_DocRKDChangeReport");
```
<!-- Конец кода -->

5. Сохраните изменения и переоткройте карточку.

Для объекта типа `Wf_DocRKDChangeReport` выражение возвращает `false`, поэтому поле становится недоступным для редактирования. Для остальных типов объектов выражение возвращает `true`.

### Редактор операций

![Редактор операций выборки](/050_tools/img/project_explorer_operation_editor.png)

Вкладка **Редактор операций** используется для настройки доступных действий и событий выборки. Настройки применяются к отображению, выбранному в фильтре.

Для операций можно настроить свойства:

- активность;
- наименование;
- порядковый номер.

Выражения доступности для операций работают так же, как выражения доступности для атрибутов.

Подробнее о свойствах `JEXL`-операции см. в разделе [Свойства JEXL-операции](../040_selection/080_выборка.md#свойства-jexl-операции).

Также можно создать операцию с помощью `JEXL`, задать ей иконку и порядок выполнения при нажатии. Подробнее см. в разделе [Пользовательские JEXL-операции](https://help.globalerp.ru/books/GlobalServerAppGuide/SNAPSHOT/html/040_selection/080_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B0.html#jexl).

Чтобы изменить свойства существующей операции:

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Редактор операций**.
3. В поле **Отображение** выберите отображение, в котором используется операция.
4. Выберите операцию в таблице.
5. На вкладке **Свойства** измените активность, наименование или порядковый номер.
6. Сохраните изменения.

**Пример включения универсального фильтра.**

Чтобы включить [универсальный фильтр](https://help.globalerp.ru/books/GlobalServerAppGuide/SNAPSHOT/html/040_selection/010_universal_filter/010_%D0%9E%D0%B1%D1%89%D0%B5%D0%B5_%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A3%D0%A4.html) в отображении списка:

1. В поле **Отображение** выберите `List`.
2. В таблице операций выберите операцию `uniFilter`.
3. На вкладке **Свойства** включите свойство **Активность**.
4. Сохраните изменения и переоткройте список.

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

Чтобы создать проектную `JEXL`-операцию:

1. На вкладке **Редактор операций** выберите требуемое отображение.
2. Нажмите `Insert` или кнопку создания на панели редактора.
3. Укажите системное имя и наименование операции.
4. На вкладке **Свойства** настройте активность, порядковый номер, иконку и другие требуемые параметры.
5. Если операция должна отображаться внутри существующей кнопки или меню, укажите для нее родительскую операцию.
6. Откройте вкладку **JEXL-скрипт** и задайте выполняемую логику.
7. Сохраните изменения и проверьте операцию в соответствующем отображении.

**Пример создания JEXL-операции.**

В карточку можно добавить операцию **Показать сообщение**, которая выводит информационное окно и не изменяет данные.

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Редактор операций**.
3. В поле **Отображение** выберите `Card`.
4. Нажмите `Insert` или кнопку создания операции на панели редактора.
5. Укажите системное имя `jexl_showMessage` и наименование **Показать сообщение**.
6. На вкладке **Свойства** включите свойства **Активность** и **Видимость операции на всех панелях**.
7. Откройте вкладку **JEXL-скрипт** и укажите:

<!-- Начало кода -->
```scala
dialogs.showMessage("Операция выполнена");
```
<!-- Конец кода -->

8. Сохраните изменения и переоткройте карточку.

Операция **Показать сообщение** становится доступна в карточке. При ее выполнении система отображает сообщение **Операция выполнена**.

Для поиска операций можно использовать флаги над таблицей: **Имеются расширения**, **Только переопределенные**, **Только JEXL** и **Искать во всех отображениях**.

Чтобы настроить логическое выражение доступности операции, выберите ее в таблице, откройте вкладку **Логические выражения доступности** в нижней части редактора, укажите выражение и сохраните изменения. Доступность операции может одновременно зависеть от этого выражения и от настроек дискретного доступа.

#### События выборки

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

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

Чтобы перейти к событиям выборки:

1. Выберите нужную выборку (`Avi`).
2. Откройте вкладку **Редактор операций**.
3. Выберите требуемое отображение.
4. Установите флаг **Отображать события** над таблицей.
5. Выберите событие в таблице и настройте доступные для него свойства или расширения.

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

**Пример установки фильтра при первом открытии выборки.**

Для события `beforeFirstOpen` можно задать начальное значение параметра фильтра. Например, параметру `flt_bNotActive` можно передать значение `1` перед первым открытием списка.

1. Выберите нужную выборку (`Avi`).
2. Откройте вкладку **Редактор операций**.
3. В поле **Отображение** выберите `List`.
4. Установите флаг **Отображать события**.
5. Выберите событие `beforeFirstOpen`.
6. Откройте вкладку **Расширения До** и создайте запись расширения.
7. Укажите JEXL-скрипт:

<!-- Начало кода -->
```
setVar("flt_bNotActive", 1)
```
<!-- Конец кода -->

8. Включите расширение, сохраните изменения и переоткройте список.

При первом открытии выборки параметр `flt_bNotActive` получает значение `1`. Пример применим к выборкам, в которых этот параметр используется в условиях фильтрации.

#### Расширения операций

Функциональность операций выборки можно расширить с помощью `JEXL`-выражений. На вкладках **Расширения До** и **Расширения После** задаются выражения, которые выполняются соответственно до или после выполнения операции.

Расширения, заданные для отображения `Default`, наследуются на остальные отображения. Для таких выражений активен флаг **Default**.

Чтобы добавить расширение операции:

1. На вкладке **Редактор операций** выберите отображение и операцию.
2. Откройте вкладку **Расширения До** или **Расширения После**.
3. Нажмите `Insert` или кнопку создания в области расширений.
4. Создайте запись расширения и укажите `JEXL`-выражение.
5. Включите расширение и сохраните изменения.

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

### Настройка

![Настройка расширенного аудита](/050_tools/img/project_explorer_settings.png)

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

Доступные типы аудита:

- **Не вести аудит**;
- **Аудит успешных операций**;
- **Полный аудит с сохранением ошибок**.

Чтобы изменить тип аудита, выберите выборку (`Avi`), откройте вкладку **Настройка**, укажите требуемый тип аудита для выборки или операций и сохраните изменения.

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

![Настройка отображений выборки](/050_tools/img/project_explorer_display_settings.png)

Вкладка **Настройка отображений** используется для определения объекта администрирования, с которым связано выбранное отображение. Для этого можно задать функции получения `acObject` и `acObjectItem`:

- `acObject` — системное имя администрируемого объекта, к которому относится выборка;
- `acObjectItem` — системное имя элемента администрирования внутри этого объекта.

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

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

Подробнее о стандартной логике определения `acObject` и `acObjectItem` см. в разделе [Определение связи выборки и администрируемого объекта](https://help.globalerp.ru/books/G3AppAdministrationGuide/SNAPSHOT/html/050_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BA_%D1%81_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D1%8B%D0%BC%D0%B8_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8.html#id5).

Чтобы настроить получение `acObject` или `acObjectItem`:

1. Выберите в дереве сущностей нужную выборку (`Avi`).
2. Откройте вкладку **Настройка отображений**.
3. В таблице выберите отображение, для которого нужно изменить определение администрируемого объекта.
4. Установите флаг **Активно переопределение acObject** или **Активно переопределение acObjectItem**.
5. В нижней части окна откройте вкладку **Функция получения acObject** или **Функция получения acObjectItem**.
6. Укажите скрипт, который возвращает системное имя администрируемого объекта или его элемента.
7. Сохраните изменения.

Функция `default()` возвращает стандартное значение `acObject` или `acObjectItem`. Ее можно вызвать в скрипте, если стандартное значение требуется использовать только при определенных условиях. Чтобы полностью вернуться к стандартной логике, снимите соответствующий флаг активности.

**Пример привязки отображения к объекту администрирования.**

В примере выборка `Some_CustomAvi` открывается в составе документа `Some_Document` и использует его настройки доступа. Отображение выборки связывается с объектом администрирования документа и соответствующим элементом через `acObject` и `acObjectItem`. Системные имена в примере условные и заменяются именами существующего объекта администрирования и его элемента.

1. Выберите в дереве сущностей выборку `Some_CustomAvi`.
2. Откройте вкладку **Настройка отображений**.
3. Выберите отображение, в котором используется выборка, например `Card`.
4. Установите флаги **Активно переопределение acObject** и **Активно переопределение acObjectItem**.
5. На вкладке **Функция получения acObject** укажите системное имя объекта администрирования:

<!-- Начало кода -->
```
"Some_Document"
```
<!-- Конец кода -->

6. На вкладке **Функция получения acObjectItem** укажите системное имя элемента администрирования:

<!-- Начало кода -->
```
"Some_Document\\Some_CustomAvi"
```
<!-- Конец кода -->

7. Сохраните изменения и переоткройте форму.

После настройки система ищет права доступа и другие административные настройки по паре `Some_Document` и `Some_Document\Some_CustomAvi`. Настройка не создает объект и элемент администрирования: они должны существовать в системе.

### Добавление переопределений в пакет обновления конфигурации

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

После добавления настройки включаются в состав конфигурации как **Проектные настройки по AVI из обозревателя проекта**. Формирование файла и его установка на другом контуре выполняются через [Менеджер конфигураций](https://help.globalerp.ru/books/GlobalUserGuideSystemWide/SNAPSHOT/html/service/0100_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8.html).

Чтобы добавить в конфигурацию все проектные настройки выбранной выборки, на панели инструментов выберите **Дополнительно > Добавить в конфигурацию проектные настройки выборки**.

На вкладках **Редактор атрибутов** и **Редактор операций** доступны операции добавления переопределений в пакет обновления конфигурации.

Доступные операции:

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

На вкладке **Свойства** доступна операция **Добавить в пакет обновления конфигурации**. Она добавляет в пакет обновления конфигурации только переопределение выделенного свойства. Мультиселект для этой операции не поддерживается.

Чтобы добавить выбранные переопределения в пакет обновления конфигурации:

1. Откройте вкладку **Редактор атрибутов** или **Редактор операций**.
2. Выберите отображение, настройки которого нужно перенести.
3. Выделите требуемые атрибуты или операции.
4. Вызовите операцию **Добавить в пакет обновления конфигурации**.

Если нужно перенести все переопределения выбранного отображения, вызовите операцию **Добавить все переопределения в пакет обновления конфигурации** без выделения отдельных записей. Для переноса одного свойства выберите его на вкладке **Свойства** и вызовите операцию **Добавить в пакет обновления конфигурации**.

## Настройки Api

**Точки расширения**.

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

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

Чтобы просмотреть методы `Api` и их параметры, выберите узел `Api` в дереве и откройте вкладку **Методы**. В таблице можно проверить наличие метода и посмотреть его описание.

Чтобы добавить проектную логику в точку расширения:

1. Выберите узел `Api` в дереве обозревателя проекта.
2. Откройте вкладку **Точки расширения**.
3. Найдите метод по имени или описанию и выберите его в таблице.
4. В нижней части окна откройте вкладку **Расширения До** или **Расширения После**.
5. Нажмите `Insert` или кнопку создания в области расширений.
6. Создайте запись расширения и укажите дополнительную логику в редакторе **Расширение методов**.
7. Включите расширение и сохраните изменения.

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

Точки расширения `Api` выполняются в контексте серверной сессии. В их скриптах нельзя открывать формы, всплывающие окна и диалоги.

**Пример проверки поля перед сохранением объекта.**

Для метода `FlushObject` можно добавить проверку, которая запрещает сохранение объекта с незаполненным атрибутом `sDescription`.

Для метода `FlushObject` доступно расширение только до выполнения основного метода.

1. Выберите в дереве узел `Api` класса, содержащего атрибут `sDescription`.
2. Откройте вкладку **Точки расширения**.
3. Выберите метод `FlushObject`.
4. Откройте вкладку **Расширения До**.
5. Нажмите `Insert` или кнопку создания расширения.
6. Укажите JEXL-скрипт:

<!-- Начало кода -->
```
var aro = rop.copyAro();
if (aro.sDescription() == null) {
  raise("Не заполнено описание!")
}
```
<!-- Конец кода -->

7. Включите расширение и сохраните изменения.

При попытке сохранить объект без описания система прекращает сохранение и выводит ошибку **Не заполнено описание!**. Если `sDescription` заполнен, стандартная логика сохранения выполняется без изменений.

## Создание новых сущностей

В обозревателе проекта реализовано создание основных сущностей:

- **Класс** — создает `odm`-файл;
- **Выборка** — создает `Avi`- и `Avm`-файлы;
- **Пакет** — создает `Pkg`- и `pkg.xml`-файлы;
- **Описание каталога** — создает файл `package-info.java` в указанном каталоге.

## Тегирование

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

Настройка доступных тегов выполняется в разделе `Настройка > Теги обозревателя проекта`.

Для установки тегов сущности используется операция `Дополнительно > Редактировать теги`.

## Документирование сущностей

Документация сущностей отображается на вкладке **Описание** и хранится в исходном коде. Документация пишется в формате Markdown.

| Тип сущности | Где хранится документация |
| --- | --- |
| **Класс** | В `odm`-файле, в теге `documentation`. Тег доступен для класса и атрибутов. |
| **Выборка** | В `Avm`-файле, в теге `documentation`. Тег доступен для выборки, отображения и атрибутов. |
| **Api** | В ScalaDoc в файле `Api`-класса. Подробнее см. [документацию ScalaDoc](https://docs.scala-lang.org/style/scaladoc.html). |
| **Pkg** | В теге `documentation` файла `pkg.xml` и в ScalaDoc `Pkg`-класса. Подробнее см. [документацию ScalaDoc](https://docs.scala-lang.org/style/scaladoc.html). |
| **Каталог** | В файле `package-info.java`, расположенном в каталоге на диске в Scala-ветке. |
| **Модуль** | В файле `package-info.java`, расположенном в корневом каталоге Scala-ветки. |

## Интеграция с IntelliJ IDEA

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

Если в IDEA не открыт текущий проект, при попытке открыть файл отображается сообщение, что проект не найден.

При открытии проекта в IDEA запускается JSON-RPC-сервер. Он получает порт для прослушивания и сохраняет в структуре проекта файл `.idea/ideasocket/<номер порта>.lock`, блокируя этот файл.

Для открытия файла в IDE используется операция **Открыть в IDE**.

| Тип сущности | Открываемый файл |
| --- | --- |
| **Класс** | `odm`-файл. |
| **Выборка** | `Avi`-файл. Дополнительная операция позволяет открыть `Avm`-файл. |
| **Api** | `Api`-файл. |
| **Pkg** | `Pkg.scala`. Дополнительная операция позволяет открыть `pkg.xml`. |