Цитата:
Сообщение от
Maximin
Перечислять поля и писать методы - это долго.

...
Если уровней наследования будет больше - buf2buf нужно сделать несколько раз.

Согласен, что неудобно по нескольку раз писать.
Я для комфорта завел несколько вспомогательных методов на SysDictTable
as_ByFieldId
и
as_ByFieldName
Их попроще использовать
С учетом их метод глобала стал таким
X++:
// обходим баг вызова orig() для табличек с наследованием
// [url=http://axforum.info/forums/showthread.php?p=412642#post412642]Приведение типов для таблиц ax2012[/url]
// [url]http://sashanazarov.blogspot.com/2014/01/dynamics-ax-2012-orig-method-fails-on.html[/url]
// [url=http://axforum.info/forums/showthread.php?p=328140#post328140]Опасный orig[/url]
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024
public static anytype origFieldValue_MRC(Common _common, FieldId _fieldId)
{
Common commonCasted;
Common commonOrig;
anytype ret;
;
if (_common.RecId == 0)
{ // обходим баг
// [url=http://axforum.info/forums/showthread.php?p=328140#post328140]Опасный orig[/url]
commonOrig = _common.orig();
commonOrig.doClear();
ret = commonOrig.(_fieldId);
}
else
{
commonCasted = SysDictTable::as_ByFieldId(_common, _fieldId);
commonOrig = commonCasted.orig();
ret = commonOrig.(_fieldId);
}
return ret;
}смотрится попроще.
Там вообще, все печальнее, так как багу подвержен не только orig но и другие методы.
Цитирую коммент из кода для as_ByFieldId
X++:
// приводит табличный буфер к заданному типу
// работает аналогично оператору as
// отличие в том, что 2-м операндом принимает идентификатор поля
// т.е. на этапе компиляции тип может быть неизвестен
// актуально для табличек с наследованием
// так как для них бывает важно получить буфер с табличным типом таким, для
// которого как раз определено поле с идентификатором _fieldId
// это важно так как из-за кривого ядра в 2012-й аксапте некоторые методы ядра
// для табличек с наследованием корректно работают только если вызваны на
// переменной с таким типом
// Пример
// xRecord.orig()
// xRecord.isFieldDataRetrieved()
// и.т.п.
// похоже, в ядре забыли в реализации подобных методов учесть, что появилось
// наследование и если на типе табличного буфера не определено поле _fieldId (но
// определено на каком-то из родителей) то указанные методы работали неправильно
// или даже выбрасывали исключение
// поэтому чтобы обойти эти проблемы перед вызовом таких методов сперва приводим
// табличный буфер к нужному типу, например, вызываем
// не common.isFieldDataRetrieved(fieldName)
// а SysDictTable::as_ByFieldId(common, fieldName2Id(common.TableId, fieldName)).isFieldDataRetrieved(fieldName)