Прецедент настройки дискретного доступа#
Требуется настроить администрируемый объект «Договоры» так, чтобы пользователю роли были доступны только расходные договоры определенных подразделений.
Для этого выполните следующие действия:
В приложении «Администратор» откройте раздел «Настройки > Администрируемые объекты».
Найдите объект
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((¶ms) 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((¶ms) 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— для типа договора.

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

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

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