Связь выборок с администрируемыми объектами#

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

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

Основные понятия#

  • Элемент администрирования (класс 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

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

Подключение произвольной выборки#

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

Подключение в исходном коде

В 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 и наименованием Произвольная выборка. Наименование используется для визуального отображения этого элемента в приложении Администратор.

Подключение через приложение Администратор

  1. Откройте карточку нужного объекта администрирования.

  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 следующим образом:

override def acObject: NString = {
  baseAvi.simpleName
}

override def acObjectItem: NString = {
  baseAvi.simpleName
}

Выборка как часть другого администрируемого объекта

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

  1. В 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>
  1. В Avi произвольной выборки переопределить методы acObject и acObjectItem:

override def acObject: NString = {
  // имя объекта
  "Some_Document"
}

override def acObjectItem: NString = {
  // путь, указанный в теге acItem
  "Some_Document\\Some_CustomAvi"
}
  1. В 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.

Решение:

  1. Войдите под суперпользователем или пользователем, у которого есть:

    • доступ к отображению;

    • право на открытие окна отладки.

  2. Откройте окно отладки (Ctrl+Alt+Shift+W) и проверьте:

    • acObjectItem должен быть цепочкой вида мастер-деталь;

    • начало acObjectItem должно совпадать с acObject.

Примеры корректного определения:

Для выборки как администрируемого объекта:
Правильная пара мастер-выборки

Для детализации:
Правильная пара в детализации

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

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

Примеры некорректного определения:

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

Решение:

  • убрать ненужное переопределение;

  • или переопределить acObject соответствующим образом.

  1. Коллекция переменной ссылочности без мастера.
    Некорректная пара для коллекции

Решение:

  • не открывать такие списки как самостоятельные отображения;

  • или переопределить acObject как один из возможных бизнес-объектов.

  1. Ошибка в переопределении acObject.
    Ошибка программиста

Решение:

  • исправить или удалить некорректное переопределение.

Если объект определяется правильно, но проблема осталась:

  1. Откройте приложение Администратор.

  2. Обновите администрируемый объект.

Новый атрибут или колонка не отображается у обычного пользователя#

Проверка:

  1. В приложении Администратор найдите нужный элемент администрирования.

  2. Убедитесь в наличии нужной привилегии.

Если привилегии нет:

  1. Обновите администрируемый объект.

  2. Проверьте avm:

    • если атрибут определён в dvm, но отсутствует в avm, добавьте ссылку на шаблон dvm;

    • для динамических построителей добавьте атрибут в avm.

SQL-ошибка из-за дискретного доступа#

Скрипт фильтрации может вызывать ошибки, если:

  • обращается к несуществующим в отображении колонкам;

  • использует параметр, отсутствующий в запросе, например &id.

Рекомендации:

  1. Используйте только гарантированно существующие колонки, предпочтительно id.

  2. Для специальных отображений:

    • если администрирование не требуется, переопределите isAdministered: Boolean = false;

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

Отключение администрирования в отображении#

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

override def isAdministered: Boolean = false