# Связь выборок с администрируемыми объектами
## основные понятия
### Элемент администрирования
Элемент администрирования (класс `Btk_AcItem`) - логический объект, который соответствует одной выборке.
На каждую выборку, обладающую своей `avm.xml`, создается отдельный `элемент администрирования`, обладает перечнем `элементарных привилегий`
### Элементарная привилегия
Элементарная привилегия (класс `Btk_AcItemPrivilege`, коллекция к `Btk_AcItem`) - логический объект, который соответствует одному из элементов выборки: атрибуту или операции.
Элементарные привилегии обладают `типом привилегии`. Например, атрибуты относятся к типу `Чтение`.
### Тип элементарной привилегии
Определяет группу `Элементарной привилегии`. Позволяет управлять доступом к группам привилегий, а не по отдельности к каждой `элементарной привилегии`
### Объект администрирования
Объект администрирования (класс `Btk_AcObject`) - логический объект, который соответствует `Бизнес объекту`, и обладает перечнем `элементов администрирования`, входящих в этот объект.
### Бизнес объект
Бизнес объект (класс `Btk_BoEntity`) - логическое объединение нескольких `классов` в единую сущность.
Бизнес объект создается на `корневые классы`, и включает все его коллекции.
### Базовая выборка
Выборка, которая соответствует классу. Например, выборка `Btk_ClassAvi` является базовой выборкой класса `Btk_Class`
### Произвольная выборка
Выборка, которая не принадлежит какому-либо классу.
В том числе и выборки-наследники от `базовой выборки`
### Корневой класс
Класс, на который формируется отдельный `бизнес объект`. Является логическим отдельным объектом, который обладает своими `коллекциями`.
Это классы с типом `Справочник`, `Документ`, `Настройка`, `Журнал`.
## Принцип построения адм. объектов
### Формирование на основе структуры odm.xml
1. На каждый `корневой класс` создается свой `администрируемый объект`, имя которого равно имени `класса`.
2. В `администрируемый объект` включаются `элементы администрирования`, которые соответствуют выборкам всех классов входящий в `бизнес объект` (сам класс и все его коллекции).
Пример структуры `бизнес объекта`:
```
Документ Some_Document
+ Коллекция Some_DocumentPosition
+ Коллекция Some_DocumentPositionDet
+ V-коллекция Коллекция Some_DocumentLink
```
Пример сформированного `администрируемого объекта`:
```
Адм. объект Some_Document
+ Элемент Some_DocumentAvi
+ Элемент Some_Document\Some_DocumentPositionAvi
+ Элемент Some_Document\Some_DocumentPosition\Some_DocumentPositionDetAvi
+ Элемент Some_Document\Some_DocumentLinkAvi
```
`Элементы администрирования` в составе `объекта администрирования` имеют имя, которое соответствует их пути внутри `бизнес объекта`.
Зачем используются такие пути будет описано в главе `Определение связи выборки и адм. объекта`
### Подключение произвольной выборки в структуру адм. объекта
По мимо `элементов администрирования`, соответствующих базовым выборкам классов `бизнес объектов`, есть возможность добавить произвольную выборку в структуру `администрируемого объекта`. Для этого существует 2 способа:
1. Подключение в исходном коде\
В `avm.xml` `базовой выборки` `корневого класса` добавить тег `acObject`, в котором указать дополнительные `элементы администрирования`.
Пример разметки:
```xml
```
В этом примере объявлен один дополнительный `элемент администрирования` в составе объекта "Some_Document", с именем "Some_Document\Some_CustomAvi" и наименованием "Произвольная выборка".
Наименование используется для визуального отображения этого элемента в приложении администратор.
2. Подключение через приложение `администратор`
- Открыть карточку нужного `объекта администрирования`
- добавить новый элемент на закладке `Элементы администрируемого объекта`
## Определение связи выборки и адм. объекта
Каждая выборка на открытии в событии `onLoadAdminMeta` через методы выборки `acObject` и `acObjectItem` определяет свою принадлежность к `элементу администрирования` и `объекту администрирования`.
Все настройки прав доступа к выборке будут искаться по паре значений, которые вернули эти два метода.
Значение, которые вернули эти два метода для выборки, можно увидеть через `окно отладки`.
Т.е. чтобы к выборке корректно применялись настройки доступа, в приложении `администратор` должен быть `объект администрирования`, имя которого равно результату метода `acObject`, и в составе этого объекта должен быть `элемент администрирования`, имя которого равно результату метода `acObjectItem`.
### Метод acObject
Возвращает системное имя `объекта администрирования` к которому относится выборка. Например, "Some_Document"
Основной принцип:
1. Если выборка принадлежит классу, и класс `корневой`, то имя этого класса = имя адм. объекта
2. Иначе вызывается метод `acObject` мастер-выборки.
### Метод acObjectItem
Возвращает системное имя `элемента администрирования` в составе объекта. например, "Some_Document\Some_DocumentPositionAvi"
Основной принцип:
1. Вызывается метод `acObjectItem` мастер-выборки.
2. К полученному значению добавляется текущее имя выборки.
### Базовые выборки классов
Для `базовых выборок классов` в большинстве случаев корректно отрабатывает стандартная логика определения `элемента администрирования` и `объекта администрирования`.
Исключением может служить `базовая выборка` `v-коллекций`, если она открывается вне формы, на которой расположена `базовая выборка` `мастер-объекта`. Например, если открыть список объектов `v-коллекции`, как главную выборку формы.
### Произвольные выборки
Для `произвольных выборок` определить принадлежность к `объекту администрирования` автоматически не так просто, как для `базовых выборок`, которые соответствуют структуре `бизнес объектов`.
В большинстве случаев разработчику требуется самостоятельно переопределить работу методов `acObject` и `acObjectItem`.
#### Выборка как самостоятельный адм. объект
Если `произвольную выборку` предполагается использовать как самостоятельный `объект администрирования`, то требуется:
1. в `avm.xml` объявить тег `acObject`
2. в `Avi` переопределить методы `acObject` и `acObjectItem` следующим образом:
```scala
override def acObject: NString = {
baseAvi.simpleName
}
override def acObjectItem: NString = {
baseAvi.simpleName
}
```
#### Выборка как часть другого адм. объекта
Если `произвольную выборку` предполагается использовать как часть существующего `объекта администрирования`, то требуется:
1. В `avm.xml` `базовой выборки` `корневого класса` этого `бизнес объекта` объявить тег `acObject` и внутри него добавить новый `элемент администрирования`
```xml
```
2. в `Avi` `произвольной выборки` переопределить методы `acObject` и `acObjectItem` следующим образом:
```scala
override def acObject: NString = {
//имя объекта
"Some_Document"
}
override def acObjectItem: NString = {
//путь, который мы указали в теге acItem
"Some_Document\\Some_CustomAvi"
}
```