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