Создаётся ощущение, что передача курсора на сервер не всегда происходит. Т.е. у сервера существует своя серверная версия курсора, которая, как оказывается, не всегда (или точнее не целиком) синхронизируется с клиенской. А именно не синхронизируется orig-часть курсора!
т.е. xTable.clear() - полностью стирает только клиенстскую версию, а на сервере курсор остаётся со старым orig.
Для эксперимента можно попробовать вручную стереть серверный orig
X++:
server static void serverClear(xTable _xTable)
{
_xTable.clear();
}
X++:
...
for(i = 1; i <= 5; i++)
{
xTable.clear();
xTable::serverClear(xTable); // <<-----------
xTable.Qty = i;
diff = xTable::diff(xTable);
info(strFmt("%1 %2", diff, xTable.Qty - xTable.orig().Qty));
xTable.insert();
}
результат:
0,00 1,00
2,00 2,00
3,00 3,00
4,00 4,00
5,00 5,00
P.S.: Проверил, в обратную сторону курсоры синхронизируются корректно. Т.е. clear(), вызванный на сервере стирает и клиенский orig() тоже.