В итоге сделал так - в начале получаются остатки из InventSum
X++:
while select sum(AvailPhysical), sum(PhysicalInvent), sum(OnOrder), sum(ReservOrdered), sum(ReservPhysical) from inventSum
group by ItemId
where inventSum.ClosedQty == NoYes::No
join InventLocationId from inventDim
group by InventLocationId
where inventDim.InventDimId == inventSum.InventDimId
&& inventDim.InventLocationId == _inventLocationId
Потом получаются остатки из WHSInventReserve и в цикле объединяются с теми что есть в InventSum (через временную таблицу)
X++:
while select sum(AvailPhysical), sum(ReservOrdered), sum(ReservPhysical) from WHSInventReserve
group by ItemId
join WHSReservationHierarchyItem
group by ItemId
where WHSReservationHierarchyItem.ItemId == WHSInventReserve.ItemId &&
WHSReservationHierarchyItem.ItemDataAreaId == WHSInventReserve.dataAreaId
join WHSReservationHierarchyElement
group by DimensionFieldId
where WHSReservationHierarchyElement.DimensionFieldId == fieldNum(InventDim, InventLocationId) &&
WHSReservationHierarchyElement.ReservationHierarchy == WHSReservationHierarchyItem.ReservationHierarchy &&
WHSReservationHierarchyElement.ReservationHierarchyLevel == WHSInventReserve.HierarchyLevel
join InventLocationId from inventDim
group by InventLocationId
where inventDim.InventDimId == WHSInventReserve.InventDimId
&& inventDim.InventLocationId == _inventLocationId
...
Второй цикл работает в 6 раз медленнее чем первый, но все равно в целом получается в 10 раз быстрее чем получать остатки по каждой номенклатуре