Пример реализации скрипта дискретного доступа#
Используется как шаблон для настройки сложных правил дискретного доступа по нескольким параметрам. Позволяет протестировать логику фильтрации и отладить условия доступа к записям.
Место применения: Приложение "Администратор" > Настройки > Администрируемые объекты > [Администрируемый объект] > Редактировать > Дискретные ограничения доступа
Тип: JEXL-скрипт
if (parseIdClass(row.gid) != Pm_AdvRepApi.idClass()) {
return true;
}
// Инициализация переменных с значениями по умолчанию
var idvDoc = row.id;
var ropDoc = null;
var idvBisObj = null;
var idvObjectType = null;
var idvAdvRepItem = [];
var bvExpAlloc = null;
var idvExpAllocBisObj = null;
// Получение значений от проверяемого объекта для проверки на соответствие параметрам
// Загружаем данные только если idvDoc не null
if (idvDoc != null) {
ropDoc = Pm_AdvRepApi.load(idvDoc);
// Бизнес единица авансового отчета
idvBisObj = Pm_AdvRepApi.getAttrValue(ropDoc, 'idBisObj');
// Тип объекта авансового отчета
idvObjectType = Pm_AdvRepApi.getAttrValue(ropDoc, 'idObjectType');
// Элементы позиций авансового отчета
idvAdvRepItem = sql(`
select det.idadvrepitem as detitem
from pm_advrep doc
left join pm_advrepdet det on det.idadvrep = doc.id
where doc.id = ${idvDoc}
;`).asList();
// Признак передачи затрат
bvExpAlloc = sql(`
select
coalesce(cast(doc.jobjattrs_dz ->> 'bExpAllocationSng' as int8), 0) as bexpalloc
from pm_advrep doc
where doc.id = ${idvDoc}
;`).asSingle();
// Бизнес единица дебитора
idvExpAllocBisObj = Pm_AdvRepApi.getObjAttrValue(ropDoc, 'idPassExpBisObj');
}
// Параметры дискретного доступа
// Значения параметров для отладки (без получения от системной настройки)
//var params = sql(`
// select
// cast(string_to_array(translate(jObj ->> 'idBisObj', '[]', ''), ',') as bigint[]) as idBisObj
// ,cast(string_to_array(translate(jObj ->> 'idObjectType', '[]', ''), ',') as bigint[]) as idObjectType
// ,cast(string_to_array(translate(jObj ->> 'idAdvRepItem', '[]', ''), ',') as bigint[]) as idAdvRepItem
// ,cast(string_to_array(translate(jObj ->> 'idExpAllocBisObj', '[]', ''), ',') as bigint[]) as idExpAllocBisObj
// from json_object('{"idBisObj", "2", "idObjectType", "24302", "idAdvRepItem", "", "idExpAllocBisObj", "2"}') as jObj
// ;`).asSingle();
for (p: params) {
var jObj = toJObject(p);
// Инициализация переменных для хранения значений параметров дискретного доступа
var paramBisObj = null;
var paramObjectType = null;
var paramAdvRepItem = null;
var paramExpAllocBisObj = null;
// Значения результата проверки для случая, когда параметр дискретного доступа не задан
var resBisObj = true;
var resObjectType = true;
var resAdvRepItem = false;
var resExpAlloc = false;
var resExpAllocBisObj = true;
// Проверки параметров дискретного доступа
// Проверка бизнес единицы
if ((idvBisObj == null || jObj.contains("idBisObj"))) {
paramBisObj = jObj.childJArray("idBisObj");
if (paramBisObj.size() > 0) {
resBisObj = false;
var i = 0;
while (i < paramBisObj.size() && !resBisObj) {
var value = paramBisObj.getLong(i);
if (value != null) {
if (idvBisObj == null || idvBisObj.toString() == value.toString()) {
resBisObj = true;
}
}
i = i + 1;
}
}
}
// Проверка типа объекта
if ((idvObjectType == null || jObj.contains("idObjectType"))) {
paramObjectType = jObj.childJArray("idObjectType");
if (paramObjectType.size() > 0) {
resObjectType = false;
var i = 0;
while (i < paramObjectType.size() && !resObjectType) {
var value = paramObjectType.getLong(i);
if (value != null) {
if (idvObjectType == null || idvObjectType.toString() == value.toString()) {
resObjectType = true;
}
}
i = i + 1;
}
}
}
// Проверка элемента
if ((idvAdvRepItem == null || jObj.contains("idAdvRepItem"))) {
paramAdvRepItem = jObj.childJArray("idAdvRepItem");
if (paramAdvRepItem.size() > 0) {
resAdvRepItem = false;
var i = 0;
while (i < paramAdvRepItem.size() && !resAdvRepItem) {
var value = paramAdvRepItem.getLong(i);
if (value != null) {
for(r:idvAdvRepItem){
if (r.detitem != null and r.detitem.toString() == value.toString()) {
resAdvRepItem = true;
}
}
}
i = i + 1;
}
}
}
// Проверка признака передачи затрат
if (bvExpAlloc.bexpalloc != null && bvExpAlloc.bexpalloc != 0) {
resExpAlloc = true;
}
// Проверка бизнес единицы дебитора
if ((idvExpAllocBisObj != null && jObj.contains("idExpAllocBisObj"))) {
paramExpAllocBisObj = jObj.childJArray("idExpAllocBisObj");
if (paramExpAllocBisObj.size() > 0) {
resExpAllocBisObj = false;
var i = 0;
while (i < paramExpAllocBisObj.size() && !resExpAllocBisObj) {
var value = paramExpAllocBisObj.getLong(i);
if (value != null) {
if (idvExpAllocBisObj.toString() == value.toString()) {
resExpAllocBisObj = true;
}
}
i = i + 1;
}
}
}
// Итоговая проверка параметров
// raise('resBisObj: ' + toString(resBisObj) + ' ' + 'resObjectType: ' + toString(resObjectType) + ' ' + 'resAdvRepItem: ' + toString(resAdvRepItem) + ' ' + 'resExpAlloc: ' + toString(resExpAlloc) + ' ' + 'resExpAllocBisObj: ' + toString(resExpAllocBisObj));
if (resBisObj == true and resObjectType == true and resAdvRepItem == false) {
return true;
}
else if (resExpAllocBisObj == true and resExpAlloc == true and resObjectType == true and resAdvRepItem == false) {
return true;
}
else {
return false;
}
}