Оказывается стандартный \Classes\SysDictClass\hasObjectMethod
неправильно работает для методов
FormStringControl.Id()
SysMethodInfo.getAttribute()
SysDictMethod.getAttribute()
DictMethod.getAttribute()
так происходит из-за того, что используемый в нем метод dictMethod.compiledOk()
некорректно работает для случаев когда метод не определен на классе, но наследуется от родительского класса,
который является системным (для обычных классов все ок)
Вот исправление
X++:
public boolean hasObjectMethod_MRC(
IdentifierName methodName
)
{
SysDictMethod dictMethod = new SysDictMethod(UtilElementType::ClassInstanceMethod, this.id(), methodName);
ClassId actualClassId;
;
if (!dictMethod)
{
return false;
}
// JEV008634 "Tech_Автоматическое убирание Bold шрифта на формах", PKoz 16.08.2024 -->
// данное изменение потребовалось потому что стандартный метод hasObjectMethod неверно работает для методов
// FormStringControl.Id()
// SysMethodInfo.getAttribute()
// SysDictMethod.getAttribute()
// DictMethod.getAttribute()
// так происходит из-за того, что используемый в нем метод dictMethod.compiledOk()
// некорреткно работает для случаев когда метод не определен на классе, но наследуется от родительского класса,
// который является системным (для обычных классов все ок)
// но работать будет медленнее из медленного вызова methodsActualClassId
// поэтому результат лучше кешировать
if (!dictMethod.compiledOk())
{
actualClassId = this.methodsActualClassId(methodName);
if (!actualClassId)
{
return false;
}
dictMethod = new SysDictMethod(UtilElementType::ClassInstanceMethod, actualClassId, methodName);
}
// JEV008634 "Tech_Автоматическое убирание Bold шрифта на формах", PKoz 16.08.2024 <--
if (!dictMethod.compiledOk())
{
return false;
}
return true;
}