Администрирование#
Описание раздела#
Скрипты и запросы для администрирования прав доступа: диагностика дискретного доступа, проверка привилегий, коррекция параметров правил и удаление некорректных настроек.
Скрипты#
Коррекция параметра правила дискретного доступа#
Используется чтобы удалить некорректное значение из JSON-массива параметра правила дискретного доступа (например, несуществующий ID). Применяется при постобработке после миграции или ошибок настройки.
Место применения: Приложение "Администратор" > Настройки > Администрируемые объекты > [Администрируемый объект] > Редактировать > Дискретные ограничения доступа
Внимание
В текущем виде содержит захардкоженные мнемокоды и ID — перед использованием необходимо заменить на актуальные значения.
Тип: JEXL-скрипт
var idvAcObject = Btk_AcObjectApi.findByMnemoCode('Pm_AdvRep'); // Адм.объект
var idvAcRole = Btk_AcRoleApi.findByMnemoCode('tstsud8.Documents'); // Роль
var idvAcRoleObjRule = 30652l; // Правило роли
var idvAcRoleObjRuleParam = 35052l; // Параметры позиции правила роли
if (!idvAcObject) {
dialogs.showMessage("Не найден адм.объект с мнемокодом 'Pm_AdvRep'");
}
if (!idvAcRole) {
dialogs.showMessage("Не найдена роль с мнемокодом 'tstsud8.Documents'");
}
if (!idvAcRoleObjRule) {
dialogs.showMessage("Не найдено правило роли с мнемокодом 'Pm_AdvRep34'");
}
var idvParams = sql(`
select
arorp.id as id
from btk_acroleobjrule aror
join btk_acroleobjruledet arord on arord.idacroleobjrule = aror.id
join btk_acobjectrule aor on arord.idacobjrule = aor.id
join btk_acroleobjruleparam arorp on arorp.idacroleobjruledet = arord.id
where
aor.idacobject = `+ idvAcObject +` -- id адм.объекта
and aror.idacrole = `+ idvAcRole +` -- id роли, для которой задан параметр правила
and aror.id = `+ idvAcRoleObjRule +` -- id правила для конкретной роли
and arorp.id = `+ idvAcRoleObjRuleParam +` -- id позиции правила для конкретной роли
;`).asSingle().id;
if(isNotNull(idvParams)) {
const ropAcRoleObjRuleParam = Btk_AcRoleObjRuleParamApi.load(idvParams);
var jPropertiesNew = [];
var jProperties = Btk_AcRoleObjRuleParamApi.parsejParamValue(ropAcRoleObjRuleParam).asJObject();
var jsonBuilder = "";
var first = true;
for (element : jProperties) {
value = element.asLong();
if (value != 429) {
if (!first) {
jsonBuilder = jsonBuilder + ",";
}
jsonBuilder = jsonBuilder + value;
first = false;
}
}
var jPropertiesNewString = "[" + jsonBuilder + "]";
Btk_AcRoleObjRuleParamApi.setjParamValue(ropAcRoleObjRuleParam, toString(jPropertiesNewString));
}
Удаление привилегий на уровне административного объекта#
Используется чтобы массово удалить привилегии на указанный административный объект для всех ролей, а также пересчитать права пользователей. Применяется при отмене доступа к устаревшему функционалу.
Место применения: Приложение "Администратор" > Настройки > Администрируемые объекты > [Администрируемый объект] > Редактировать > Дискретные ограничения доступа
Внимание
В текущем виде содержит незавершённый массив arr = [...] и захардкоженный код объекта 'Act_MainMenuAvi' — перед использованием необходимо завершить логику и указать корректные значения.
Тип: JEXL-скрипт
var arr = [...];
var ia = sql(`
select opg.id, opg.idacrole from Btk_AcRoleObjPrivTypeGrant opg
join Btk_AcObject o on o.id = opg.idacobject
where opg.bhasaccess = 1 and o.scode = 'Act_MainMenuAvi'
`).asList();
for(rv:ia) {
if (!arr.contains(rv.idacrole)){
arr.add(rv.idacrole);
}
var rr = Btk_AcRoleApi.load(rv.idacrole);
Btk_AcRoleApi.unSync(rr);
var rop = Btk_AcRoleObjPrivTypeGrantApi.load(rv.id);
Btk_AcRoleObjPrivTypeGrantApi.delete(rop);
}
commit();
Btk_AcRoleGrantRegApi.lazyUpdateAll();
commit();
for(id:arr) {
Btk_UserApi.recalcPrivsMulti(Btk_AcRoleApi.getUsersByRole(id));
}
commit();
Пример реализации скрипта дискретного доступа#
Используется как шаблон для настройки сложных правил дискретного доступа по нескольким параметрам (бизнес-объект, тип, элементы, признаки). Позволяет протестировать логику фильтрации и отладить условия доступа к записям.
Место применения: Приложение "Администратор" > Настройки > Администрируемые объекты > [Администрируемый объект] > Редактировать > Дискретные ограничения доступа
Тип: 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;
}
}
Копирование переходов состояний с одного объекта на другой#
Копирует переходы состояний с одного типа объекта на другой.
Скрипт показывает пример массового копирования настроек состояний между типами объектов.
Может использоваться при настройке или тиражировании конфигурации.
Место применения: Сервис > Инструменты > Выполнить JEXL-скрипт
Тип: JEXL-скрипт
var l = sql(`select s1.id idstatefrom, s2.id idstateto, s3.id idstate
from btk_statechange sc
join btk_state s1 on s1.id = sc.idstatefrom
join btk_state s2 on s2.id = sc.idstateto
join btk_state s3 on s3.id = sc.idstate
where s1.idobjecttype = {id_источника}
and s2.idobjecttype = {id_источника}
and s3.idobjecttype = {id_источника}`).asList();
for (w : l) {
Btk_StateChangeApi.register({id_приемника}, w.idstatefrom, w.idstateto, w.idstate);
}