Дано:
Трёхуровневая Аксапта v3.0 SP4
Класс WMSOrderTransSplit - разбиение строк
в методе run() есть проверка:
X++:
select firstonly forupdate WMSOrderTransCopy
index hint OrderIdx
where WMSOrderTransCopy.orderId == WMSOrderTrans.orderId &&
WMSOrderTransCopy.itemId == WMSOrderTrans.itemId &&
WMSOrderTransCopy.recId == WMSOrderTrans.recId;
if (!WMSOrderTransCopy || !bufCmp(WMSOrderTransCopy, WMSOrderTrans))
throw error("@SYS18447");
Смысл проверки, если я правильно понимаю
!WMSOrderTransCopy - не удалил ли пользователь строку перед разбиением
!bufCmp(WMSOrderTransCopy, WMSOrderTrans) - не изменил ли пользователь строку перед разбиением
Так вот bufCmp(...) в случае RunOn Server работает некорректно, а именно возвращает false, когда строка не была изменена. Иными словами - строка пришедшая в класс, и строка взятая в качестве эталона, для метода equal() понимаются как разные. Изменяя же свойство класса RunOn на Called from, метод equal() работает правильно.
Как вариант, !bufCmp(WMSOrderTransCopy, WMSOrderTrans) можно попытаться заменить на WMSOrderTransCopy.xml() != WMSOrderTrans.xml()
Причём такое поведение equal() характерно не только для таблицы WMSOrderTrans, но и для для других таблиц.