AX 2012 R2 CU7, \Classes\LedgerUtils_RU\createLedgerTransStorno_RU
X++:
/// Creates storno ledger transactions based on _transDate, _voucher parameters.
public static void createLedgerTransStorno_RU(
LedgerVoucherObject _voucherObject,
TransDate _transDate,
Voucher _voucher,
TaxTransGeneralJournalAccountEntry _taxLinks = null,
LedgerPostingType _ledgerPostingType = LedgerPostingType::None)
// ...
while select RecId from localSubledgerVoucherGeneralJournalEntry
where localSubledgerVoucherGeneralJournalEntry.Voucher == _voucher &&
localSubledgerVoucherGeneralJournalEntry.VoucherDataAreaId == curext() &&
localSubledgerVoucherGeneralJournalEntry.AccountingDate == _transDate
join RecId, PostingLayer, JournalCategory from localGeneralJournalEntry
// ...
_voucherObject.parmPostingLayer(localGeneralJournalEntry.PostingLayer);
_voucherObject.parmJournalCategory(localGeneralJournalEntry.JournalCategory);
_voucherObject.addTrans(ledgerVoucherTransObject);
Вся прелесть в предпоследних двух строчках: сколько бы ни было различных типов проводок и слоев разноски для исходного ваучера, код "сторнирования" будет использовать только последнюю комбинацию. В частности, очень "веселый" результат получается, если включен двухвалютный склад: все подряд сторнирующие проводки оказываются либо на текущем слое разноски, либо на слое "Вал.склад", задваивая обороты по счетам.