По результатам первичного переноса решения из Ax 3.0 публикую изменения внесенные в функционал Dynamics Ax 4.0 для отображения сравнения по 2-м верхним слоям:
SysCompare\initContext()
X++:
...
this.setCombo(comboBox1,
_context.comparableList(SysCompareType::Text1), comparableMap1, _context.comparableItemDefault(SysCompareType::Text1));
this.setCombo(comboBox2, _context.comparableList(SysCompareType::Text2), comparableMap2, _context.comparableItemDefault(SysCompareType::Text2));
//comboBox1.selection(0);
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( comboBox1.valueStr() == comboBox2.valueStr() ) // если значения box'ов равны - в первом box'е пытаемся взять слой ниже
comboBox1.selection( max( 0, comboBox1.selection() - 1 ) ) ;
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
...
SysTreeNodeCompareContext\parmSysTreenode1():
X++:
public SysTreeNode parmSysTreenode1(SysTreeNode _sysTreenode1 = sysTreenode1)
{
;
sysTreenode1 = _sysTreenode1;
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( !prmisdefault( _sysTreenode1 ) )
default1 = sysTreenode1 ? sysTreeNode1.comparableName() : '' ;
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
return sysTreenode1;
}
SysTreeNodeCompareContext\parmSysTreenode2():
X++:
public SysTreeNode parmSysTreenode2(SysTreeNode _sysTreenode2 = sysTreenode2)
{
;
sysTreenode2 = _sysTreenode2;
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( !prmisdefault( _sysTreenode2 ) )
default2 = sysTreenode2 ? sysTreeNode2.comparableName() : '' ;
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
return sysTreenode2;
}
SysTreeNodeCompareContext\parmTreeNode1():
X++:
public TreeNode parmTreeNode1(TreeNode _treeNode1 = treeNode1)
{
;
treeNode1 = _treeNode1;
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( !prmisdefault( _treeNode1 ) && !sysTreeNode1 )
default1 = treeNode1 ? SysTreeNode::newTreenode( treeNode1 ).comparableName() : '' ;
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
return treeNode1;
}
SysTreeNodeCompareContext\parmTreeNode2():
X++:
public TreeNode parmTreeNode2(TreeNode _treenode2 = treenode2)
{
;
treenode2 = _treenode2;
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( !prmisdefault( _treenode2 ) && !sysTreeNode2 )
default2 = treeNode2 && treeNode2.applObjectLayerMask() ? SysTreeNode::newTreenode( treeNode2 ).comparableName() : '' ;
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
return treenode2;
}
В реализации метода SysTreeNodeCompareContext\parmTreeNode2() сделано небольшое 'допущение': если treeNode2.applObjectLayerMask() == 0 то в этом случае узел был инициализирован в результате импорта из XPO файла, для него должно бы возвращаться значение SysTreeNodeVirtualXPO::newTreenode( treeNode2 ).comparableName().
С другой стороны при импорте из XPO второй список сравнения содержит 1 значение ( вида '\ObjName (xpo)' ), позиционирование будет установлено на него даже в случае если функция вернет ''.
'Полный' вариант модифицированного метода изначально выглядел так - SysTreeNodeCompareContext\parmTreeNode2():
X++:
public TreeNode parmTreeNode2(TreeNode _treenode2 = treenode2)
{
;
treenode2 = _treenode2;
// --> petergunn, Tools_000003_SysCompareDefaultLayer
if( !prmisdefault( _treenode2 ) && !sysTreeNode2 )
{
if( treeNode2 )
default2 = treeNode2.applObjectLayerMask() ? SysTreeNode::newTreenode( treeNode2 ).comparableName() : SysTreeNodeVirtualXPO::newTreenode( treeNode2 ).comparableName() ;
else default2 = '' ;
}
// <-- petergunn, Tools_000003_SysCompareDefaultLayer
return treenode2;
}
Проект с модифицированными классами прилагаю.
P.S. ногами сильно не пинать

, проект пока носит характер отладочной версии и содержит 2 варианта модификации класса SysTreeNodeCompareContext - разделены значением макроопределения #debugVersion