В принципе - ты прав. Это завязано на отрицательный физический склад. Но сама ошибка срабатывает ТОЛЬКО если физический склад отрицательный и галка "Включать физические операции" включена. Если посмотреть на код рассчета себестоимости списания (inventMovement.financialIssueCostValue()), в старых версиях можно найти такой код:
X++:
value = inventSum.postedValue;
qty = inventSum.postedQty;
if (this.inventModelGroup().inclPhysicalValueInCost)
{
value += inventSum.physicalValue;
qty += inventSum.received - inventSum.deducted;
}
...
return Currency::amount(value / qty * _inventTrans.qty);
Теперь представь себе картину: Оприходовали (физически и финансово) 100 КГ по цене 10000 рублей за КГ. Потом списали (физически) 199.9999 КГ. Теперь первое физическое списание списываем финансово. По формуле:
Qty=100
Value = 1000000
Deducted= 199.9999
Received=100
PhysicalValue - скорее всего равно нолю. ПОскольку первые 100 штук списывали со правильной физической себестоимостью, последующие - по себестоимости из карточки (допустим - незаполненной)
Получаем:
Qty=100+100-199.9999=0.0001; Value=1000000
Сбестоимость списания 1000000/0.0001=1E9. Такие дела
В более поздних sp эту формулу заменили на:
X++:
inventSum = _inventOnhand.inventSum();
if (inventSum.PostedValue * inventSum.PostedQty > 0)
{
value = abs(inventSum.postedValue);
qty = abs(inventSum.postedQty);
}
if (inventSum.PhysicalValue * (inventSum.Received - inventSum.Deducted) > 0 && this.inventModelGroup().inclPhysicalValueInCost)
{
value += abs(inventSum.physicalValue);
qty += abs(inventSum.received - inventSum.deducted);
}
if ((value * qty) <= 0 || qty <= 0)
{
value = _inventTrans.costAmountPhysical;
qty = _inventTrans.qty;
}
...
return Currency::amount(value / qty * _inventTrans.qty);