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

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

  • В справочнике администрируемых объектов (Приложение «Администратор», Настройки -> Администрируемые объекты) найти требуемый — 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 (Тип объекта)

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

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