Привет всем.
Попалась ссылка с описанием багов при использовании табличного метода modifiedFieldValue().
https://bkdynamics-ax.blogspot.com/2...ifference.html
Стал проверять, нашлось много интересного.
Axapta 2012 R3 CU13
1. При обычной работе в p-code при вызове super() из modifiedField() идет вызов modifiedFieldValue().
2. В стандартном коде есть места где идет вызов modifiedFieldValue(), соответственно если написать код в modifiedField() то в некоторых сценариях он никогда не вызовется.
3. Если табличка Table1 из иерархии наследования то super() в методе modifiedField() вызывает modifiedField() родительской таблички, и т.д. пока не дойдет вызов до корневой таблички. Super() корневой таблички вызывает Table1.modifiedFieldValue(), чей super() передает вызов в modifiedFieldValue() родительской и.т.д. пока не дойдем до корневой таблички в иерархии.
4. При работе в CIL п.1 не выполняется, что может приводить к отличиям в работе пакетных заданий от обычного запуска через p-code. (Об этом и было сообщение у индусов https://bkdynamics-ax.blogspot.com/2...ifference.html )
5. Пункт 3 работает с багами. Параметр _fieldName в метод modifiedFieldValue() передается как 'UNKNOWN'. Если наследования табличек нет то все ок.
В общем, какая-то жуть.
Вопросы:
а. Для чего был введен метод modifiedFieldValue ?
б. Куда правильнее помещать свой кастомизированный код, в modifiedField или в modifiedFieldValue ?
в. Какой из методов лучше вызывать из кода в случае необходимости. ModifiedField или modifiedFieldValue ?
г. Как быть с п.4 ? Как для CIL кода обойти баг ? (Или это не баг а так и задумано. Тогда в чем смысл ?)
д. Что делать с п.5 ? Как обойти багу ?
е. Как обстоят дела с Dynamics 365 ? Там поведение такое же или другое ?
Для иллюстрации приложил проект.
Класс пакетник, можно запусить в p-code можно в CIL и сравнить результаты в инфологе.
Вызов в p-code
Вызов в CIL