Доработал вариант Denicce под себя: нужно, чтобы неизмененные объекты удалялись из дерева, а оставались только содержащие изменения.
Соответственно, вместо \Classes\SysImportElements\markDifferentObjects предлагается \Classes\SysImportElements\deleteEqualObjects:
X++:
public void deleteEqualObjects(FormTreeControl _ftc)
{
FormTreeControl treeControl = _ftc;
FormTreeItem treeItem;
Set itemIdxSet = new Set(Types::Integer);
void deleteNodeWithEmptyParents(FormTreeItem _treeItem)
{
TreeItemIdx idx;
TreeItemIdx childIdx;
int i;
boolean parentIsEmpty;
if (_treeItem)
{
idx = _treeItem.idx();
itemIdxSet.add(idx);
while select forUpdate firstonly tmpImportAot
where tmpImportAot.TreeNodePath == _treeItem.data()
{
tmpImportAot.Import = false;
tmpImportAot.update();
}
parentIsEmpty = true;
childIdx = treeControl.getChild(treeControl.getParent(idx));
while (childIdx)
{
if (!itemIdxSet.in(childIdx))
{
parentIsEmpty = false;
break;
}
childIdx = treeControl.getNextSibling(childIdx);
}
if (parentIsEmpty)
deleteNodeWithEmptyParents(treeControl.getItem(treeControl.getParent(idx)));
}
}
itemIdxSet = new Set(Types::Integer);
treeItem = treeControl.getItem(treeControl.getRoot());
if (treeItem)
{
SysFormTreeControl::expandTree(treeControl, treeItem.idx());
while (treeItem)
{
// KDV анализируем только конечные узлы дерева (листы - объекты АОТ):
if (! strFind(treeItem.data(), '\\', strLen(treeItem.data()), -1))
{
// KDV сравниваем последний слой в АОТ и слой XPO:
if (this.compareNodes(treeControl, treeItem))
deleteNodeWithEmptyParents(treeItem);
}
treeItem = treeControl.getItem(treeControl.getNextVisible(treeItem.idx()));
}
SysFormTreeControl::deleteTreeItem(treeControl, itemIdxSet);
}
}
ну и соотв. образом подменить вызов исходного метода на мой.