Более простой способ воспроизвести баг.
Пусть у нас есть 2 лота из описания выше, выполняем для них такой код
X++:
// Запускать на сервере - в джоб поставить недостаточно, потому что джоб всегда на клиенте исполняется.
// лучше поставить в статический метод какого то класса
server static void test()
{
InventTransID InventTransID;
Object Object;
Object Object2;
Qty grd_calcQty(InventTransId _inventTransId, boolean _disablecache, str _s)
{
InventTrans inventTrans;
;
inventTrans = null;
if (_disablecache)
inventTrans.disableCache(true);
select sum(qty) from inventTrans
index hint TransIdIdx
where inventTrans.inventTransId == _inventTransId &&
// inventTrans.StatusIssue >= StatusIssue::ReservPhysical
// && inventTrans.StatusIssue <= StatusIssue::OnOrder
(inventTrans.statusIssue == StatusIssue::ReservPhysical ||
inventTrans.statusIssue == StatusIssue::ReservOrdered ||
inventTrans.statusIssue == StatusIssue::OnOrder)
;
info(strFMT("%3 DisableCache = %1 Количество %2",
inventTrans.disableCache(),
inventTrans.Qty,
_s)); // здесь в плохом случае возвращает 0 для ЛОТ2. Если все в порядке то -5
}
;
ttsBegin;
InventTransID = "ЛОТ1"; // ЛОТ1 Количество 4 (2 физрезерв; 2 скомплектовано)
Object = InventTrans::viewCacheInventTransId(InventTransId, true);
// GRD_calcQty(InventTransId);
InventTransID = "ЛОТ2"; // ЛОТ2 Количество 5 (5 физрезерв)
GRD_calcQty(InventTransId, false, "Кеширование не отключали.");
GRD_calcQty(InventTransId, true , "Отключили кеширование.");
Object2 = InventTrans::viewCacheInventTransId(InventTransId, true);
GRD_calcQty(InventTransId, false, "Кеширование не отключали. Создан RecordViewCache по второму лоту");
GRD_calcQty(InventTransId, true , "Отключили кеширование. Создан RecordViewCache по второму лоту");
ttsCommit;
}