Показать сообщение отдельно
Старый 01.03.2009, 19:16   #1  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,877 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Расщепление InventSplitTrans_Remain и коррекция в наличии
Привет всем
Хотел бы обсудить работу механизма расщепления проводок InventTrans в Аксапте 3.0 SP5
(класс \Classes\InventSplitTrans_Remain)
Выяснились некоторые неприятные моменты.
Суть баги в том, что если мы имеем частично закрытую приходную проводку то при её расщеплении, может оказаться так, что сумма сопоставления в проводке и сумма проводки не будут совпадать. (Причина этого в том что система некорректно обрабатывает ошибки округления) Из-за этого в дальнейшем проводка никогда не закрывается и ломается функция Коррекция-В наличии.

Рассмотрим пример.
1. 1-е марта делаем приход на 1080 штук, сумма 10983,05
2. 2-е марта делаем 2 расхода по 30 штук. (Для воспроизведения бага важно чтобы было именно 2 расхода по 30 а не 1 по 60)
3. Закрываем склад на 2-е марта (или позднее - это непринципиально)

Что получается:
В приходной проводке имеем Закрытое количество (QtySettled) 60
Рассчитанная сумма (CostAmountSettled) 610,16

Если сделать Коррекция-В наличии на процент -100 т.е. попытаться обнулить остаток, то система выдаст ошибку в момент расщепления, которое выполняется при такой коррекции.

Тогда сделаем просто расщепление проводки. Проводки - Функции - Разбиение
Укажем количество 1020, т.е. оставшаяся после расщепления проводка должна закрыться, так как для неё будет qtySettled == Qty
Но этого не происходит, потому что при расщеплении система записала в InventTrans.CostAmountPosted сумму 610,17 в то время как
CostAmountSettled == 610,16
(Проводка не закрывается потому что в методе InventTrans.setClosedOpen() не отрабатывает условие на закрытие проводки
X++:
        case this.isUpdatedFinancial()                                    &&
             abs(this.qty - this.qtySettled) < InventAdj::settleQtyDiff() &&
             Currency::amount(this.costValue() - this.costAmountSettled) == 0 :
Соответственно в открытой части проводки CostAmountPosted == 10372,88 Qty == 1020

Теперь понятно почему при выполнении функции Коррекция - В наличии была ошибка.
Ошибка происходит потому что сумма, которую надо сминусовать рассчитывается по нерасщепленной проводке (\Classes\InventAdj_SumUp\updateInvent) и равна 10372,89 а после расщепления из-за неправильных округлений сумма в открытой проводке равна 10372,88 поэтому при коррекции сумма положительной проводки загоняется в минус на 1 копейку и возникает ошибка.


Во вложении прилагается попытка исправления данной баги. Суть в том, что при расщеплении система проверяет полностью ли закрыта проводка по количеству и если да, то скидывает все округления в поле InventTrans.CostAmountPosted искусственно подгоняя себестоимость проводки под сумму (InventTrans.CostAmountSettled)

При этом не совсем понятно что делать с остальными полями себестоимости
costAmountStd
costAmountPhysical
costAmountOperations

Поскольку costAmountOperations обычно равен costAmountPosted то аналогичные исправления я делаю и в costAmountOperations.
Вложения
Тип файла: rar GRD_fixInventTransSplitAxForum_pkoz.rar (4.5 Кб, 93 просмотров)
За это сообщение автора поблагодарили: fed (3), gl00mie (7), Aquarius (1).