Прецедент настройки дискретного доступа

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

Требуется настроить администрируемый объект «Договоры» так, чтобы пользователю роли были доступны только расходные договоры определенных подразделений.

Для этого выполните следующие действия:

  • В приложении «Администратор» откройте раздел «Настройки > Администрируемые объекты».

  • Найдите объект Cnt_Contract и откройте его карточку.

  • В карточке администрируемого объекта установите признак «Дискретный доступ».

  • На закладке «Дискретные ограничения доступа» создайте административные правила с типом «Примитивное правило».

  • Для каждого правила заполните скрипты на следующих закладках:

    • «Скрипт для фильтрации объектных привилегий» — определяет, какие объекты будут отображаться в списках;

    • «Скрипт проверки строк по объектному кешу» — проверяет доступ к объекту при открытии по ссылке из других документов.

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

  • по ОФС участников договора;

  • по типу договора.

Правило по ОФС участников договора#

Скрипт для фильтрации объектных привилегий:

select 1
     from cnt_Contract tt
     join Cnt_ContractOFSParticipants cp 
       on tt.id = cp.idcontract 
     join Bs_OFStructure ofs 
       on cp.idofstructure = ofs.id
    where tt.id = (&id)
      and exists (
      select 1 from (select cast(json_array_elements_text(cast((&params) as json)) as int8) as id) ids where ids.id = ofs.id
      )

Скрипт проверки строк по объектному кешу:

for (p: params) {
  var idv = row.id;
  var ropObj = Cnt_ContractApi.load(idv);
  var colRops = Cnt_ContractOFSParticipantsApi.byParent(ropObj);
  var colJRops = toJRops(colRops).asList();
  for (colRop: colJRops) {
      if (colRop.idOFStructure != null) {
        if (colRop.idOFStructure.toString() == p.toString()) {
          return true;
        }
    }
  }
}

Правило по типу договора#

Скрипт для фильтрации объектных привилегий:

select 1
     from cnt_Contract tt
     join (
     select cast(json_array_elements_text(cast((&params) as json)) as int8) as id
      ) as ids 
     on tt.idobjecttype = ids.id
    where tt.id = (&id)

Скрипт проверки строк по объектному кешу:

for (p: params) {
  var idv = row.id;
  var ropObj = Cnt_ContractApi.load(idv);
  var idObjectType = Cnt_ContractApi.getAttrValue(ropObj,"idObjectType");
  if (idObjectType.toString() == p.toString()) {
    return true;
  }
}
  • На закладке «Параметр правила» для каждого правила укажите:

    • в поле «Тип параметра» — значение «Ссылочный на объект»;

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

В этом примере используются следующие классы:

  • Bs_OFStructure — для ОФС;

  • Btk_ObjectType — для типа договора.

  • В карточке роли откройте закладку «Дискретный доступ» и добавьте администрируемый объект, для которого требуется настроить ограничение.

  • В детализации на закладке «Значения правила» укажите значения, по которым должны проверяться правила.

  • Перейдите на закладку «Права роли» и найдите нужный администрируемый бизнес-объект.

  • В детализации «Расшифровка прав» выберите настроенное ограничение для прав на просмотр или редактирование объектов.

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