Показать сообщение отдельно
Старый 11.01.2009, 12:54   #7  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Можно попробывать следующее решение :
В классе 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 (пример, вы привели сами - строки журнала ГК), аналитика все равно останется только с тем доступом, который вы установили.
За это сообщение автора поблагодарили: ZVV (1), Sada (3).