Обнаружена еще одна интересная особенность работы с TreeNode.AOTmakeXref()
Оказывается в стандартном коде в большинстве мест этот метод обрамляется отключением записи собираемых перекрестных ссылок в постоянную таблицу, за счет чего ускоряется работа этого метода
Например так
\Classes\EditorScripts\documentation_HeaderTemplate
2012-я
X++:
appl.updatexRefSet(true);
memberFunction.aoTmakeXref(1);
tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
appl.updatexRefSet(false);
2009-я
X++:
infolog.updatexRefSet(this, true);
memberFunction.AOTmakeXref(1);
tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef(), memberFunction.treeNodePath());
infolog.updatexRefSet(this, false);
А в популярных доработках к EditorScripts (открыть узел в AOT, перейти к определению переменной итп), в HK Framework итп, в общем, везде, где используются собираемые на лету перекрестные ссылки - этого не делается. Из-за этого в 12-ке бывает заметно подтормаживает и нервирует. Иногда замедление измеряется в секундах. Чаще меньше секунды но все равно напрягает.
Написал свой метод xRefCreate::makeTmpByTreeNode_MRC, который заменяет вызов
X++:
appl.updatexRefSet(true);
memberFunction.aoTmakeXref(1);
tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
appl.updatexRefSet(false);
и везде его использую
X++:
/// <summary>
/// Рекомендуется вместо treeNode.aotMakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef());
/// </summary>
/// <param name="_treeNode">
/// TreeNode, для которого собираем временные перекрестные ссылки
/// </param>
/// <param name="_flag">
/// 1-й параметр _flag, передаваемый в treeNode.aotMakeXref(_flag)
/// </param>
/// <param name="_xRefAll">
/// 2-й параметр _xRefAll, передаваемый в treeNode.aotMakeXref(_flag, _xRefAll)
/// </param>
/// <param name="_path">
/// параметр _path передаваемый в xRefCreate::makeTmp()
/// </param>
/// <returns>
/// Временная таблица xRefTmpReferences с результатами сбора перекрестных ссылок по treenode
/// </returns>
/// <remarks>
/// [url=http://axforum.info/forums/showthread.php?p=299419#post299419]Открыть в новом окне объект из кода[/url]
/// В 2012-й вызов treeNode.aotMakeXref(1) работает быстрее если
/// обрамить его отключением сохранения перекрестных ссылок
/// см. пример в стандартном коде в \Classes\EditorScripts\documentation_HeaderTemplate
///
/// метод makeTmpByTreeNode_MRC сделан для удобства, для замены куска кода
/// appl.updatexRefSet(true);
/// treeNode.aotMakeXref(1);
/// tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), treeNode.treeNodePath());
/// appl.updatexRefSet(false);
/// одной строкой кода с вызовом этого метода
/// xRefCreate::makeTmpByTreeNode_MRC(treeNode, 1, false /*default value*/, treeNode.treeNodePath());
/// </remarks>
// JEV007437, PKoz 31.01.2023
public static xRefTmpReferences makeTmpByTreeNode_MRC(
TreeNode _treeNode,
int _flag = 1, // обычно 1
boolean _xRefAll = false,
xRefPath _path = '' // в стандарте обычно _treeNode.treeNodePath()
)
{
xRefTmpReferences tmpxRefReferences;
boolean temporaryForbidSaveXref;
;
temporaryForbidSaveXref = appl.canUpdatexRef();
if (temporaryForbidSaveXref)
{
appl.updatexRefSet(true);
}
_treeNode.aotMakeXref(_flag, _xRefAll);
tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), _path);
if (temporaryForbidSaveXref)
{
appl.updatexRefSet(false);
}
return tmpxRefReferences;
}