Можно попробывать следующее решение :
В классе SysSetuFormRun пишем метод setAccessDimension(), код которого приведен ниже и вызываем его в методе init() того же класса, аналогично тому как описал
petergunn
X++:
void setAccessDimension(SysDimension _sysDimension, AccessType _accessType = AccessType::View)
{
FormBuildDataSource formDataSource;
FormControl formControl;
SysDictTable sysDictTable;
SysDictField sysDictField;
int dimArrayIdx = Dimensions::code2ArrayIdx(_sysDimension);
FormBuildDesign design = this.form().design();
Counter curControl;
void setSecurityLevelOnDimensions(FormBuildControl _control)
{
int currentControl;
FormBuildStringControl stringControl;
SysDictField dictField;
if (_control.isContainer())
{
for(currentControl = 1; currentControl <= _control.controlCount(); currentControl++)
{
setSecurityLevelOnDimensions(_control.controlNum(currentControl));
}
}
else if (_control.handle() == classNum(FormBuildStringControl))
{
stringControl = _control;
if (stringControl.dataField())
{
formDataSource = this.form().dataSource(stringControl.dataSource());
dictField = new SysDictField(formDataSource.table(), stringControl.dataField());
if (dictField.typeId() == extendedTypeNum(Dimension) && dictField.arrayIndex() == dimArrayIdx)
{
formControl = this.control(stringControl.id());
formControl.userSecurityLevel(_accessType + 1);
}
}
}
}
;
if (design)
{
for(curControl = 1; curControl <= design.controlCount(); curControl++)
{
setSecurityLevelOnDimensions(design.controlNum(curControl));
}
}
}
Преимущество или недостаток данного способа заключается в том, что если после вызова init() формы, написать код, который выставляет в allowEdit(true) для поля типа Dimension, то в отличии от способа предложенного
petergunn (пример, вы привели сами - строки журнала ГК), аналитика все равно останется только с тем доступом, который вы установили.