Показать сообщение отдельно
Старый 14.05.2015, 14:23   #179  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
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);
Вся прелесть в предпоследних двух строчках: сколько бы ни было различных типов проводок и слоев разноски для исходного ваучера, код "сторнирования" будет использовать только последнюю комбинацию. В частности, очень "веселый" результат получается, если включен двухвалютный склад: все подряд сторнирующие проводки оказываются либо на текущем слое разноски, либо на слое "Вал.склад", задваивая обороты по счетам.
За это сообщение автора поблагодарили: Logger (3).