Показать сообщение отдельно
Старый 12.11.2008, 22:55   #19  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Допустим есть такая ситуация есть 3 прихода по номенклатуре
Было закрытие (если нет ни одного закрытия система не позволит сделать корректировку)
Эти приходы ни с одним расходом не сопоставились. И коррекция равна 0.
Просто так легче дальше считать.
Так вот
Пример1
X++:
Qty 	CostAmountPosted
10	100
5	20
20	300
Итого в форме коррекция в наличие будет
X++:
         
35				420
Допустим мы хотим скорректировать остатки до себестоимости 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 несопоставленные ед?
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 12.11.2008 в 23:01.