Еще можно добавить в АОТ небольшой класс и использовать его при отладке:
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-методы объекта написаны по бест-практисам и ничего другого не делают.