Показать сообщение отдельно
Старый 11.03.2026, 15:16   #19  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,017 / 3301 (119) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от 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)