Показать сообщение отдельно
Старый 04.03.2015, 16:15   #7  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Еще можно добавить в АОТ небольшой класс и использовать его при отладке:

X++:
 class ParmMethodViewer
{
    Object object;
     Map parmMethodName2Value;
}
 
 void initMap()
{
    DictClass    dictClass;
    int          methodIdx;
    str          methodName;
    Object       parmObject;
    Common       parmCommon;
    anytype      parmPrimitive;
    Types        type;
    ;
 
     parmMethodName2Value = new Map(Types::String, Types::String);
 
     dictClass = new DictClass(classidget(object));
     for(methodIdx = 1; methodIdx <= dictClass.objectMethodCnt(); methodIdx++)
    {
        methodName = dictClass.objectMethod(methodIdx);
         if (!strStartsWith(methodName, 'parm'))
        {
            continue;
        }
 
         type = typeOf(dictClass.callObject(methodName, object));
 
        switch (type)
        {
            case Types::Class:
                parmObject = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                    classId2Name(classidget(parmObject)));
                break;
 
             case Types::Record:
                parmCommon = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                        strFmt('Table %1, RecId %2',
                            tableid2name(parmCommon.TableId),
                            parmCommon.RecId));
                break;
 
             case Types::String,
                 Types::Date,
                 Types::Guid,
                 Types::Int64,
                 Types::Integer,
                 Types::Real,
                 Types::Time,
                 Types::UtcDateTime:
                parmPrimitive = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                    strFmt('%1', parmPrimitive));
                break;
        }
    }
}
 
 void new(Object _object)
{
    ;
     object = _object;
 
     this.initMap();
}
Примеры использования:

X++:
 public static void main(Args _args)
{
    Args             args;
    InventTable      inventTable;
     ParmMethodViewer parmMethodViewer;
    ;
 
     args = new Args();
    args.parm('qwerty');
    args.parmEnumType(enumnum(NoYes));
    args.parmObject(new SalesFormLetter_Invoice());
 
     parmMethodViewer = new ParmMethodViewer(args);
     breakpoint;
 
     select firstonly inventTable;
     parmMethodViewer = new ParmMethodViewer(AxInventTable::newInventTable(inventTable));
     breakpoint;
}
На первой точке остановки переменная parmMethodName2Value будет иметь значение ["parm"->"qwerty","parmEnumType"->"61469","parmObject"->"SalesFormLetter_Invoice"]

На второй:

["parmAltConfigId"->"","parmAltInventColorId"->"","parmAltInventSizeId"->"","parmAltItemId"->"","parmAssetGroupId_RU"->"","parmAssetId_RU"->"","parmBatchNumGroupId"->"","parmBOMCalcGroupId"->"","parmBOMLevel"->"0","parmBOMUnitId"->"pcs", ...

Но тут нужно быть уверенным, что все parm-методы объекта написаны по бест-практисам и ничего другого не делают.
За это сообщение автора поблагодарили: Logger (3), dit31 (1).