Связь выборок с администрируемыми объектами#
В статье описано, как выборки связываются с администрируемыми объектами: какие сущности участвуют в этой связи, как формируется структура объекта, как выборка определяет свою принадлежность через методы acObject и acObjectItem.
Материал помогает понять, как подключить произвольную выборку к объекту администрирования, как переопределить методы связи и как диагностировать проблемы с применением прав.
Основные понятия#
Элемент администрирования (класс
Btk_AcItem) — логический объект, соответствующий одной выборке. Для каждой выборки сavm.xmlсоздаётся отдельный элемент администрирования с перечнем элементарных привилегий.Элементарная привилегия (класс
Btk_AcItemPrivilege, коллекцияBtk_AcItem) — логический объект, соответствующий элементу выборки: атрибуту или операции. Элементарные привилегии имеют тип привилегии. Например, атрибуты относятся к типу Чтение.Тип элементарной привилегии — группа элементарных привилегий. Позволяет управлять доступом к группе привилегий, а не к каждой привилегии отдельно.
Объект администрирования (класс
Btk_AcObject) — логический объект, соответствующий бизнес-объекту. Содержит элементы администрирования, входящие в этот объект.Бизнес-объект (класс
Btk_BoEntity) — логическое объединение нескольких классов в единую сущность. Создаётся на корневой класс и включает все его коллекции.Базовая выборка — выборка, соответствующая классу. Например, выборка
Btk_ClassAviявляется базовой выборкой классаBtk_Class.Произвольная выборка — выборка, не принадлежащая какому-либо классу. К таким выборкам относятся и выборки-наследники базовой выборки.
Корневой класс — класс, на который формируется отдельный бизнес-объект. Это логически самостоятельный объект со своими коллекциями. К таким классам относятся: Справочник, Документ, Настройка, Журнал.
Принцип построения администрируемых объектов#
Формирование на основе структуры odm.xml#
Для каждого корневого класса создаётся свой администрируемый объект. Его имя совпадает с именем класса.
В состав администрируемого объекта включаются элементы администрирования, соответствующие выборкам всех классов, входящих в бизнес-объект: самого класса и всех его коллекций.
Пример структуры бизнес-объекта:
Документ 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
Элементы администрирования в составе объекта имеют имя, соответствующее их пути внутри бизнес-объекта. Для чего используются такие пути, описано в разделе Определение связи выборки и администрируемого объекта.
Подключение произвольной выборки#
Помимо элементов администрирования, соответствующих базовым выборкам классов бизнес-объектов, в структуру администрируемого объекта можно добавить произвольную выборку. Для этого есть два способа.
Подключение в исходном коде
В avm.xml базовой выборки корневого класса добавьте тег acObject, в котором укажите дополнительные элементы администрирования.
Пример разметки:
<view xmlns="http://www.global-system.ru/xsd/global3-view-1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.global-system.ru/xsd/global3-view-1.0"
name="Some_Document">
<acObject>
<acItems>
<acItem name="Some_Document\Some_CustomAvi" caption="Произвольная выборка"/>
</acItems>
</acObject>
</view>
В этом примере объявлен дополнительный элемент администрирования в составе объекта Some_Document с именем Some_Document\Some_CustomAvi и наименованием Произвольная выборка. Наименование используется для визуального отображения этого элемента в приложении Администратор.
Подключение через приложение Администратор
Откройте карточку нужного объекта администрирования.
Добавьте новый элемент на закладке Элементы администрируемого объекта.
Определение связи выборки и администрируемого объекта#
Каждая выборка при открытии в событии onLoadAdminMeta определяет свою принадлежность к элементу администрирования и объекту администрирования через методы acObject и acObjectItem.
Все настройки прав доступа к выборке ищутся по паре значений, которые возвращают эти два метода.
Значения, возвращаемые этими методами для выборки, можно увидеть через окно отладки.
Чтобы к выборке корректно применялись настройки доступа, в приложении Администратор должен существовать:
объект администрирования, имя которого равно результату метода
acObject;элемент администрирования в составе этого объекта, имя которого равно результату метода
acObjectItem.
Метод acObject#
Метод возвращает системное имя объекта администрирования, к которому относится выборка. Например, Some_Document.
Основной принцип:
Если выборка принадлежит классу и этот класс является корневым, имя класса используется как имя администрируемого объекта.
В остальных случаях вызывается метод
acObjectмастер-выборки.
Метод acObjectItem#
Метод возвращает системное имя элемента администрирования в составе объекта. Например, Some_Document\Some_DocumentPositionAvi.
Основной принцип:
Вызывается метод
acObjectItemмастер-выборки.К полученному значению добавляется текущее имя выборки.
Базовые выборки классов#
Для базовых выборок классов в большинстве случаев корректно работает стандартная логика определения элемента администрирования и объекта администрирования.
Исключением может быть базовая выборка v-коллекций, если она открывается вне формы, на которой расположена базовая выборка мастер-объекта. Например, если список объектов v-коллекции открывается как главная выборка формы.
Произвольные выборки#
Для произвольных выборок определить принадлежность к объекту администрирования автоматически сложнее, чем для базовых выборок, соответствующих структуре бизнес-объектов.
В большинстве случаев разработчику требуется самостоятельно переопределить методы acObject и acObjectItem.
Выборка как самостоятельный администрируемый объект
Если произвольную выборку предполагается использовать как самостоятельный объект администрирования, требуется:
В
avm.xmlобъявить тегacObject.В
Aviпереопределить методыacObjectиacObjectItemследующим образом:
override def acObject: NString = {
baseAvi.simpleName
}
override def acObjectItem: NString = {
baseAvi.simpleName
}
Выборка как часть другого администрируемого объекта
Если произвольную выборку предполагается использовать как часть существующего объекта администрирования, требуется:
В
avm.xmlбазовой выборки корневого класса этого бизнес-объекта объявить тегacObjectи внутри него добавить новый элемент администрирования:
<view xmlns="http://www.global-system.ru/xsd/global3-view-1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.global-system.ru/xsd/global3-view-1.0"
name="Some_Document">
<acObject>
<acItems>
<acItem name="Some_Document\Some_CustomAvi" caption="Произвольная выборка"/>
</acItems>
</acObject>
</view>
В
Aviпроизвольной выборки переопределить методыacObjectиacObjectItem:
override def acObject: NString = {
// имя объекта
"Some_Document"
}
override def acObjectItem: NString = {
// путь, указанный в теге acItem
"Some_Document\\Some_CustomAvi"
}
В
Apiпроизвольной выборки зарегистрировать элемент с помощью методаBtk_AcObjectItemApi().registerByAcObjectItemName:
def regAcObjectItem(): Unit = {
val bvDefinedAcObjectItem = TxIndex(Btk_AcObjectItemAta.Type)(_.sCode).byKey("Some_Document\\Some_Document\\Some_CustomAvi#Default").isEmpty
if (bvDefinedAcObjectItem) Btk_AcObjectItemApi().registerByAcObjectItemName("Some_Document\\Some_Document\\Some_CustomAvi#Default")
}
Часто задаваемые вопросы#
При заходе не под суперпользователем выборка не отображается или не применяются права#
Возможная причина — некорректное определение acObjectItem или acObject.
Решение:
Войдите под суперпользователем или пользователем, у которого есть:
доступ к отображению;
право на открытие окна отладки.
Откройте окно отладки (
Ctrl+Alt+Shift+W) и проверьте:acObjectItemдолжен быть цепочкой видамастер-деталь;начало
acObjectItemдолжно совпадать сacObject.
Примеры корректного определения:
Для выборки как администрируемого объекта:

Для детализации:

Для переопределённой выборки:

Для переопределённой детализации:

Примеры некорректного определения:
Переопределение
thisApiв выборке без класса.

Решение:
убрать ненужное переопределение;
или переопределить
acObjectсоответствующим образом.
Коллекция переменной ссылочности без мастера.

Решение:
не открывать такие списки как самостоятельные отображения;
или переопределить
acObjectкак один из возможных бизнес-объектов.
Ошибка в переопределении
acObject.

Решение:
исправить или удалить некорректное переопределение.
Если объект определяется правильно, но проблема осталась:
Откройте приложение
Администратор.Обновите администрируемый объект.
Новый атрибут или колонка не отображается у обычного пользователя#
Проверка:
В приложении
Администраторнайдите нужный элемент администрирования.Убедитесь в наличии нужной привилегии.
Если привилегии нет:
Обновите администрируемый объект.
Проверьте
avm:если атрибут определён в
dvm, но отсутствует вavm, добавьте ссылку на шаблонdvm;для динамических построителей добавьте атрибут в
avm.
SQL-ошибка из-за дискретного доступа#
Скрипт фильтрации может вызывать ошибки, если:
обращается к несуществующим в отображении колонкам;
использует параметр, отсутствующий в запросе, например
&id.
Рекомендации:
Используйте только гарантированно существующие колонки, предпочтительно
id.Для специальных отображений:
если администрирование не требуется, переопределите
isAdministered: Boolean = false;если разграничение прав нужно, вынесите логику в отдельную выборку.
Отключение администрирования в отображении#
Для отключения администрирования, например для кастомного отображения, на нужном отображении переопределите метод isAdministered:
override def isAdministered: Boolean = false