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

# Практическое задание 5. Настройка дискретного доступа

Настройте роль таким образом, чтобы пользователю были доступны только расходные договоры подразделений СМТ-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((&params) 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((&params) 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 (Тип объекта)

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

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