Показать сообщение отдельно
Старый 27.03.2015, 09:52   #6  
Lanai is offline
Lanai
Участник
 
35 / 29 (1) +++
Регистрация: 09.08.2005
Я правильно понял, что необходим код, которому передаем форму и AccessType, а он запустит каскадно установку этого AccessType для этой формы?

У меня была такая задача. Причем не только для форм. Насколько я понял, методы, которые раздают права каскадно, работают только для дерева прав. Тоже сначала думал эмулировать построение дерева и запускать существующие методы, но в итоге сделал так: вырвал кусками код, который используется при построении дерева, чтобы бегать по объектам формы и давал права на эти объекты.

Вот методы на SysSecurityUserGroup ():

Этот бегает по объектам формы (таблицы и MenuItem) и устанавливает им права:

X++:
void grantSubAccessForForm(   FormName      _formName,
                              AccessType    _access)
{
    SysDictMenu             sysDictMenu;
    TreeNodePath            treeNodePath;
    MenuFunction            menuFunction;
    FormName                formName;
    List                    list;
    Map                     map;

    ListEnumerator          enumerator;
    MapEnumerator           mapEnumerator;
    SysDictTable            dictTable;
    MenuFunction            menu;
    
    ;

    treeNodePath = strFmt("\\Menu Items\\%1\\%2", enum2str(MenuItemType::Display), _formName);
    sysDictMenu  = SysDictMenu::newTreeNodePath(treeNodePath);

    if (sysDictMenu)
    {
        menuFunction = sysDictMenu.menuItem();

        if (menuFunction && SysSecurity::potentialChildren(menuFunction))
        {
            switch (menuFunction.objectType())
            {
                case UtilElementType::Form:
                    formName = menuFunction.object();
                    list = SysSecurity::getFormDatasources(formName);
                    map  = SysSecurity::getFormDisplayMethods(menuFunction);

                    if (list.elements())
                    {
                        enumerator  = list.getEnumerator();

                        while (enumerator.moveNext())
                        {
                            dictTable   = new SysDictTable(enumerator.current());
                            this.accessChangedForTable(dictTable.name(), _access);
                        }
                    }

                    list = SysSecurity::getFormMenuItems(formName);

                    if (list.elements())
                    {
                        enumerator = list.getEnumerator();
                        while (enumerator.moveNext())
                        {
                            switch (classidget(enumerator.current()))
                            {
                                case classnum(Map):

                                map = enumerator.current();

                                mapEnumerator = map.getEnumerator();

                                mapEnumerator.moveNext();

                                switch (classidget(mapEnumerator.currentValue()))
                                {
                                    case classnum(MenuFunction):
                                        menu = mapEnumerator.currentValue();
                                        this.accessChangedForMenuItem(menu.name(), menu.type(), _access);
                                    break;
                                }
                            }
                        }
                   }

                   break;
            }
        }
    }
}

для установки прав для таблицы:

X++:
void accessChangedForTable(TableName    name, AccessType access)
{
    DictTable                   dictTable;
    TableId                     tableId;
    ;
    if (access != AccessType::NoAccess)
    {
        tableId = tableName2Id(name);
        dictTable = new DictTable(tableId);
        if (access > dictTable.maxAccessMode())
            access = dictTable.maxAccessMode();
    }

    EePersonalDataAccessLogging::logTableAccessChange(
        tableId,
        securitySet.tableAccess(tableId),
        access,
        this.parmUserGroupId());

    securitySet.tableAccess(tableId, access);
    origtableAccess.insert(tableId, access);
}

для установки прав на MenuItems

X++:
void accessChangedForMenuItem(  MenuItemName        name,
                                    MenuItemType        type,
                                    AccessType          access)
{
    ;
    securitySet.secureNodeAccess(name, SysSecurity::menuItemType2UtilElementType(type), access);
}

На всякий случай приблизительный вариант как работать с SysSecurityUserGroup:

X++:
    SysSecurityUserGroup                sysSecurity = SysSecurityUserGroup::construct();

    sysSecurity.parmUserGroupId(userGroupId);
    sysSecurity.parmDomainId(domainId);
    sysSecurity.load();

    sysSecurity. grantSubAccessForForm("SalesTable", AccessType::Delete);

    sysSecurity.save();