Сразу оговорюсь что у меня Ax3.0 SP5
Поэтому у вас возможны отличия. Но если в 4-ке код несильно поменялся, то
скорее всего работают методы
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
или
\Classes\InventUpd_Physical\updatePhysicalReturnedIssue
На примере
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
Там вначале ищется расход (физическое или финансовое движение) по аналитике из строки. Если найден, то на основе него делается возврат, подхватывается аналитика и все такое.
X++:
while select forupdate inventTrans
Index hint TransIdIdx
order by inventDimId Desc
where inventTrans.inventTransId == movement.transId() &&
inventTrans.statusIssue == statusIssue &&
inventTrans.statusReceipt == StatusReceipt::None &&
inventTrans.packingSlipReturned == 0
#InventDimJoin(InventTrans.inventDimId,InventDim,inventDimCriteria,inventDimFlags)
{
if (inventTrans.InventTransIdReturn)
continue;
addQty = this.updateTransPhysicalReturnedReceipt(_ledgerVoucher, inventTrans, addQty);
Если что-то не получилось. (Скорее всего это и есть ваш случай) В силу каких то причин не нашлась проводка. (Например, проставлен Номер возвращенного лота inventTrans.InventTransIdReturn - т.е. этот лот кто то уже использовал) то тогда она продолжает поиск без учета аналитик, работает такой код :
X++:
while select forupdate inventTrans
Index hint TransIdIdx
order by inventDimId desc
where inventTrans.inventTransId == movement.transId() &&
inventTrans.statusIssue == statusIssue &&
inventTrans.statusReceipt == StatusReceipt::None &&
inventTrans.packingSlipReturned == 0
{
if (inventTrans.InventTransIdReturn)
continue;
addQty = this.updateTransPhysicalReturnedReceipt(_ledgerVoucher, inventTrans, addQty);
if (!addQty)
break;
и тут может произойти "перескок" аналитик.
Ставьте точки останова и смотрите что реально там у вас происходит.