Показать сообщение отдельно
Старый 06.10.2017, 11:39   #1  
SuperStar88 is offline
SuperStar88
Участник
 
79 / 10 (1) +
Регистрация: 11.08.2017
? Безопасность на уровне записей (выбрать все условия)
Здравствуйте!
Такая задача: надо формировать отчёт по договорам. При выводе отчета учитывать ограничения, заданные для групп пользователей по Договорам в Безопасности на уровне записей.

Как я понимаю, один пользователь может быть в нескольких группах. Пытаюсь сделать перебор по группам и если они встречаются в SysRecordLevelSecurity, то в запрос добавлять условия из этой таблицы.

Пока сделал как-то коряво. Подскажите как сделать более правильно.
Вот то, что пока придумал:
X++:
private void parmRContractTable(Args _args)
{
    RContractTable              tmpRContractTable;
    UserGroupList               userGroupList;

    integer                     j;
    Query                       q;
    QueryBuildRange             qbr;
    QueryBuildDataSource        qbds;

    SysQueryRun                 sysRun;
    SysRecordLevelSecurity      sysRecord;
    ;

    tmpRContractTable = _args.record();
    rContractTypes = tmpRContractTable.rContractPartnerType;

    q = new Query();
    qbds = q.addDataSource(tablenum(RContractTable));
    while select userGroupList where userGroupList.userId == curUserId()
    {
        select firstonly sysRecord where
                                 sysRecord.groupId      == userGroupList.groupId  &&
                                 sysRecord.tabId        == tablenum(RContractTable) &&
                                 sysRecord.companyId    == curext();
        if(sysRecord)
        {
            sysRun = new SysQueryRun(sysRecord.restriction);
            sysRun.next();
            for(j=1; j<sysRun.query().dataSourceNo(1).rangeCount(); j++)
            {
                qbr = sysRun.query().dataSourceNo(1).range(j);
                qbds.addRange(qbr.field()).value(qbr.value());
            }
        }
    }

    query = new Query(q);
}