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

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

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