Я правильно понял, что необходим код, которому передаем форму и 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();