Допустим есть такая ситуация есть 3 прихода по номенклатуре
Было закрытие (если нет ни одного закрытия система не позволит сделать корректировку)
Эти приходы ни с одним расходом не сопоставились. И коррекция равна 0.
Просто так легче дальше считать.
Так вот
Пример1
X++:
Qty CostAmountPosted
10 100
5 20
20 300
Итого в форме коррекция в наличие будет
Допустим мы хотим скорректировать остатки до себестоимости 5
35*5-420 = -245
Считаем Adjustment
InventSumOpenTransact\setAdjustment() (47)
adjustNow = Currency::amount(this.transQty(x) * adjustInTotal/ qtyTotal);
(для 1 прихода) 10*(-245)\35= - 70
(для 2 прихода) 5*(-245)\35= - 35
(для 3 прихода) 20*(-245)\35= - 140
Видим что для второго прихода получилось 35, а разнесённая сумма 20
Смотрим InventSumOpenTransact\setAdjustment() (49)
if (this.transValue(x) + this.transAdjustNow(x) + adjustNow < 0)
Ну раз 35 снять не можем снимем = 20
Теперь эти 15 пропали и мы должны их всунуть или в 1 или 3 приход иначе у нас себестоимость остатка 5 не будет.
Смотрим InventSumOpenTransact\setAdjustment() (44)
if (this.transQty(x) >= qtyRemain)
adjustNow = Currency::amount(amountRemain);
Т.е. эти 15 войдут в в последний приход
Если в последнем меньше чем коррекция
Пример2
X++:
Qty CostAmountPosted
10 300
5 20
20 100
то коррекция будет
-70
-20
-100
А так как распределение не всё пройдёт вторая итерация
-70 (ещё -70) = -140
-20
-100 (и на последней +остаток 15) = - 85
И здесь всё ок (когда сопоставлений не было).
Но вот когда появляются частично сопоставлененые проводки.
Например если бы 2-ой приход был сопоставлен при закрытие 3 ед из 5.
То произойдёт разбиение проводки на количество 3 и 2(CostAmountPosted 12 и 8 соответственно).
И в результате будет попытка корректировки второй проводки (где Qty = 2 и CostAmountPosted = 8)
А в буфере то у нас 20. От туда и ошибка про отрицательную себестоимость.
Разделение проводки будет происходить для всех частично сопоставленых проводок которые участвуют в коррекции.
Так вот вопрос почему бы в методе InventSumOpenTransact\add
массив transValue для тех проводок у которых есть сопоставление заполнять не costAmountPosted, а costAmountPosted - (qtySettled*costAmountPosted)\qty = наши 8
И массив transQty = qty - qtySettled = наши 2 несопоставленные ед?