11.11.2008, 18:00 | #21 |
Moderator
|
Цитата:
Сообщение от miklenew
Выкидывает сообщение
Отрицательная себестоимость не возможна. (S) \Classes\InventTransAdjust\updateNow - line 72 Не могу понять в чём дело. Считается вроде всё правильно и интуиция подсказывает возможно входные данные не правильны. А именно поле корректировки. Предположил что это поле на InventTrans проверяется таким образом. Для ValueOpen = да Возможно, я не прав и топикстартер уже разобрался в том что происходит в этих классах. В таком случае, просьба написать почему возникло подозрение что неверно значение именно в inventTrans.costAmountAdjustment. |
|
12.11.2008, 10:54 | #22 |
Участник
|
К чему в результате дошёл
1) \Classes\InventSumOpenTransact\add Закидываем в буфер costAmountPosted 2) (S) \Classes\InventSumOpenTransact\setTransAdjustNow - line 4 Инициализируем суммы корректировки нулями 3)(S) \Classes\InventSumOpenTransact\setAdjustment - line 49 Может получиться что расчитанная сумма корректировки нам не подходит, тогда корректировка = this.transValue(x)+this.transAdjustNow(x) Фактически это this.transValue(x) т.к. transAdjustNow(x) = 0 4) (S) \Classes\InventTransAdjust\updateNow - line 35 inventTrans.updateSplit(inventTrans.financialOpenQty()); Делим на две проводки (старая+новая) И все суммы и количества пропорционально распределяем, кроме суммы по корректировке. Корректировку оставляем на изначальной проводке. Т.к. в InventSettlement связь не только по лоту но и по recId. После этой процедуры место старого inventTrans в памяти уже другой. Вот это я исправил, так как это не правильно. Поставил в верху метода X++: RefRecId origRecId; X++: if (inventTrans.financialOpenQty() != inventTrans.qty)
inventTrans.updateSplit(inventTrans.financialOpenQty()); X++: if (inventTrans.financialOpenQty() != inventTrans.qty) { origRecId = inventTrans.RecId; inventTrans.updateSplit(inventTrans.financialOpenQty()); if(inventTrans.RecId != origRecId) inventTrans = InventTrans::findRecId(origRecId, true); }
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
12.11.2008, 19:27 | #23 |
Участник
|
Есть подозрения, что сделал не правильно.
Завтра ещё буду юзать. Но неужели не у кого нет мыслей зачем там updatesplit(). Буду благодарен за любые догадки, даже неправильные.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
12.11.2008, 19:41 | #24 |
Moderator
|
Извиняюсь - занят был - сразу не ответил. Этот самый updateSplit() - единственное что отличает переоценку остатков от переоценки проводок. Вот допустим ты купил 100 процессоров по $100 каждый и за месяц продал половину по цене $120. Потом 1ого числа Intel планово снизил цены за процы до $70 и даже компенсировал тебе разницу. Теперь ты должен ОСТАВШИЕСЯ 50 процессоров переоценить до $70 и продавать их по $85.
Если ты просто переоценишь проводку (или уберешь updateSplit()), то у тебя сумма переоценки равномерно размажется по всему приходному лоту (в том числе и по процессорам которые ты уже продал). В итоге у тебя получиться что первый месяц ты торговал процессорами с себестоимостью $85 при продажной цене $120; второй месяц ты торговал процессорами тоже с себестоимостью $85 при продажной цене $85. Получается что маржа и себестоимость криво посчитаны. А из за того что у тебя при переоценке остатков расщепляется на открытую и закрытую части, переоценка попадет только на открытую часть. В итоге у тебя себестоимость старых продаж не измениться, а новых - упадет ровно настолько насколько нужно. Кстати - это единственное место в Аксапте, которое я знаю, которое расщепляет ФИНАНСОВО разнесенные проводки. Во всех остальных местах, расщепление финансово разнесенных проводок запрещено |
|
|
За это сообщение автора поблагодарили: miklenew (7). |
12.11.2008, 20:21 | #25 |
Участник
|
Цитата:
Т.е. по-моему это еще один случай, когда система расщепляет фин. разнесенные проводки. |
|
12.11.2008, 22:55 | #26 |
Участник
|
Допустим есть такая ситуация есть 3 прихода по номенклатуре
Было закрытие (если нет ни одного закрытия система не позволит сделать корректировку) Эти приходы ни с одним расходом не сопоставились. И коррекция равна 0. Просто так легче дальше считать. Так вот Пример1 X++: Qty CostAmountPosted 10 100 5 20 20 300 X++: 35 420 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. |
|
12.11.2008, 23:24 | #27 |
Moderator
|
Ну кстати, если посмотреть на inventSumOpenTransact.add(), то там в начале есть такой малоприметный метод inventTrans.setTransValueDate(). Он как раз занимается тем, что исключительно для целей коррекции остатков в наличии, отнимает от inventTrans.qty и inventTrans.costAmountPosted количества и сумму складских сопоставлений сделанных до даты переоценки. Так что если с этим методом никто не поигрался, то у тебя там не совсем оригинальные значения qty и costAmountPosted из исходной проводки должны в массиве лежать, а как раз что-то похожее на то что ты написал.
|
|
13.11.2008, 11:12 | #28 |
Участник
|
Спасибо. На работе то его видел. А дома позно уже было забыл про него.
Пока копался понял, что то что хотят консультанты надо делать не через коррекцию запасов, а через коррекцию проводок. Надеюсь там всё пройдёт гладко.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
01.03.2009, 19:19 | #29 |
Участник
|
Цитата:
Расщепление InventSplitTrans_Remain и коррекция в наличии |
|
Теги |
логистика, переоценка |
|
|