Вот вчера наткнулся на такую особенность:
Если в строке заказа на продажу изменить в коде количество в полях остатков (RemainInventPhysical / RemainSalesPhysical) а потом просто вызвать
то проводки будут соотвественно откорректированы.
Если жи такую же операцию произвести со строкой заказа на перемещение, при этом поправив
оба количества: Отгрузить остаток и Получить остаток, а потом вызвать обновления буффера, то проводки будут неправильно откорректированы,
если количество остатка обнулить
X++:
inventTransferLine.QtyRemainShip -= qty;
inventTransferLine.QtyRemainReceive -= qty;
/*или так inventTransferLine.synchronizeQtyRemainReceive();*/
invnetTransferLine.update();
дело в том, что строка заказа на перемещение имеет 4 складские проводки: ИЗ СКЛАДА-> Транзит ИЗ / Транзит НА -> НА СКАЛАД.
При этом, как известно, проводки Транзита смаркированы между собой.
Так вот, при удалении проводки Транзит НА будет удалена маркировка и вызван метод
X++:
invnetTransferLine.doUpdate()
, что в последствии приводит к тому, что количества preEstimated и transEstimated в классе InventUpd_Estimated оба равны нулю и тогда проводки Транзит ИЗ и НА СКАЛАД не удаляются!!!
К счастью есть чудесный метод, который используется из функции на форме:
X++:
inventTransferLine.updateDeliverRemainder()
Приведу часть его кода, чтобы наглядно показать, где разработчики перехватывают и предотвращают вышеописанное поведение:
X++:
movementFrom = InventMovement::construct(this);
estimatedFrom = InventUpd_Estimated::newInventMovement(movementFrom);
estimatedFrom.updateNow();
estimatedTransitTo = InventUpd_Estimated::newInventMovement(InventMovement::construct(this,InventMovSubType::TransferOrderTransitTo));
estimatedTransitTo.updateNow();
this.QtyRemainReceive = qtyRemainReceive; /*здесь происходит принудительное восстановление остатка*/
movementTransitFrom = InventMovement::construct(this,InventMovSubType::TransferOrderTransitFrom);
estimatedTransitFrom = InventUpd_Estimated::newInventMovement(movementTransitFrom);
estimatedTransitFrom.updateNow();
estimatedTo = InventUpd_Estimated::newInventMovement(InventMovement::construct(this,InventMovSubType::TransferOrderTo));
estimatedTo.updateNow();
Код совпадает и в AX 4.0 и в AX 2012.
Удачи в разработке!