Администрирование#

Описание раздела#

Скрипты и запросы для администрирования прав доступа: диагностика дискретного доступа, проверка привилегий, коррекция параметров правил и удаление некорректных настроек.

Скрипты#

Коррекция параметра правила дискретного доступа#

Используется чтобы удалить некорректное значение из 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);
}