В приложении есть масса полезных проверок Best Practices, которые помогают выявлять различные косяки в своем и чужом коде. Стоит, однако, отметить, что выполнение этих проверок
- в разы замедляет компиляцию;
- практически бессмысленно для объектов на "чужих" слоях.
В связи с этим захотелось сделать так, чтобы эти проверки срабатывали лишь для объектов на текущем слое разработки. Для этого оказалось достаточно добавить новое поле, скажем, в SysBPParameters и чуток подрихтовать класс SysBPCheck:
X++:
private void doTreeNode(TreeNode _treeNode)
{
TreeNodeTraverser treeNodeTraverser;
SysBPCheckBase sysBPCheckBase;
TreeNode treeNodeToRelease;
boolean checkChildren = true;
TreeNodePath parentPath;
int infologLines;
Map map = new Map(Types::Integer, Types::Integer);
MapEnumerator enum;
int length;
;
treeNodeToRelease = null;
// if (_treeNode) //-gl00m, 14.02.2011
if (this.mustCheckTreeNode(_treeNode)) //+gl00m, 14.02.2011
{
treeNodeTraverser = new TreeNodeTraverser(_treeNode);
while (treeNodeTraverser.next()) // Check Best Practices
{
if (!sysCompilerOutput)
{
setprefix(treeNodeTraverser.infologPrefix());
}
treeNode = treeNodeTraverser.currentNode();
if(treeNode)
{
length=strlen(treeNode.treeNodePath());
}
else
{
length=0;
}
//If we are doing a BP check on a Query node within a View node then don't release the view node
if (treeNodeToRelease && SysTreeNode::isApplObject(treeNode) &&
(treeNodeToRelease.sysNodeType()!= #NT_DBVIEW || (treeNode && treeNode.sysNodeType()!= #NT_QE) ||
length < strlen(treeNodeToRelease.treeNodePath()) ||
substr(treeNode.treeNodePath(),1,strlen(treeNodeToRelease.treeNodePath())) != treeNodeToRelease.treeNodePath()))
{
treeNodeToRelease.treeNodeRelease();
treeNodeToRelease = null;
}
// if (checkChildren || //-gl00m, 14.02.2011
if ((checkChildren || //+gl00m, 14.02.2011
substr(treeNode.treeNodePath(),1,strlen(parentPath)) != parentPath) //No longer a child to the parent
&& this.mustCheckTreeNode( treeNode )) //+gl00m, 14.02.2011
{
sysBPCheckBase = this.getSysBpCheckBase(treeNode);
sysBPCheckBase.parmSysBPCheck(this);
// ...
А это новый метод, который решает, надо ли проверять переданный объект приложения:
X++:
// gl00m, 14.02.2011
protected boolean mustCheckTreeNode(TreeNode _treeNode)
{
UtilEntryLevel applObjectLayer;
UtilEntryLevel currentAOLayer;
boolean ret;
;
if (_treeNode)
{
ret = true;
currentAOLayer = currentAOLayer();
// если разработка ведется на sys-слое, то эта модификация, очевидно, бессмысленна
if (currentAOLayer > UtilEntryLevel::sys)
{
applObjectLayer = _treeNode.applObjectLayer();
if ( applObjectLayer < currentAOLayer
&& enum2str(_treeNode.applObjectType()) != ''
)
{
// в зависимости от настроек можем не проверять объекты, которые расположены ниже текущего слоя
// NB! это поле надо будет добавить в таблицу и на форму самостоятельно
ret = !SysBPParameters::find().CheckBPForCurrentAOLayerOnly;
}
}
}
return ret;
}
PS. Модификация сделана для AX 2009, но, думаю, на другие версии перенести ее не составит труда.