Перейти к основному содержанию
`Ctrl`+`K`

# Пример реализации скрипта дискретного доступа

Используется как шаблон для настройки сложных правил дискретного доступа по нескольким параметрам. Позволяет протестировать логику фильтрации и отладить условия доступа к записям.

Место применения: `Приложение "Администратор" > Настройки > Администрируемые объекты > [Администрируемый объект] > Редактировать > Дискретные ограничения доступа`

Тип: 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;
      }
    }