Цитата:
Сообщение от
yuh
Отсюда - другой вопрос: а как это происходит в AX? Нечто подобное? И если да, то какие именно классы используются для создания журналов?
Например, вот набросок кода создания журнала платежей для какой-то старой версии Аксапты:
X++:
void createIncomingJournal()
{
LedgerJournalNameId incomingName;
LedgerJournalTable incomingJournal;
ledgerJournalTrans incomingTrans;
ledgerJournalTrans ledgerJournalTrans;
LedgerJournalEngine ljeIn;
LedgerJournalEngine ledgerJournalEngine;
NumberSeq numSeq;
ProjTable projTable;
RContractTable rct;
RContractPartnerType rctType;
;
ttsbegin;
select forupdate incomingJournal;
incomingJournal.clear();
incomingJournal.initValue();
incomingJournal.JournalName=incomingName;
incomingJournal.insert();
ljeIn = new BMLedgerJournalEngine(null);
ljeIn.newJournalActive(incomingJournal);
if(ljeIn)
{
while select lines
{
ledgerJournalTrans=incomingTrans;
ledgerJournalEngine=ljeIn;
select forupdate ledgerJournalTrans;
ledgerJournalTrans.clear();
ledgerJournalTrans.TransDate=lines.PaymDate;
ledgerJournalTrans.currencyCode=lines.CurrencyID;
ledgerJournalTrans.ExchRate=lines.ExchRate;
ledgerJournalTrans.initValue();
ledgerJournalTrans.JournalNum=incomingJournal.JournalNum;
ledgerJournalEngine.numberSeqFormHandlerJournal().parmLedgerJournalTrans(ledgerJournalTrans);
ledgerJournalEngine.formMethodDataSourceCreatePost();
ledgerJournalEngine.initValue(ledgerJournalTrans);
ledgerJournalTrans.TransDate=lines.PaymDate;
ledgerJournalTrans.currencyCode=lines.CurrencyID;
ledgerJournalTrans.ExchRate=lines.ExchRate;
ledgerJournalTrans.accountType=lines.AccountType;
ledgerJournalTrans.AccountNum=lines.Account;
ledgerJournalTrans.offsetAccountType=lines.offsetAccountType;
ledgerJournalTrans.OffsetAccount=lines.offsetAccount;
if(AmountDebit)
ledgerJournalTrans.AmountCurDebit=lines.AmountDebit;
else if(AmountCredit)
ledgerJournalTrans.AmountCurCredit=lines.AmountCredit;
ledgerJournalTrans.Txt=lines.TransTxt;
ledgerJournalTrans.DocumentNum=lines.DocumentNum;
ledgerJournalTrans.DocumentDate=lines.PaymDate;
ledgerJournalTrans.validateWrite();
ledgerJournalEngine.preWrite(ledgerJournalTrans);
ledgerJournalEngine.formMethodDataSourceWritePre();
ledgerJournalTrans.write();
ledgerJournalEngine.write(ledgerJournalTrans);
}
}
ttscommit;
if(ljeIn)
info(strfmt("Создан журнал входящих платежей %1", incomingJournal.JournalNum));
}
Но тут повезло, что был класс BMLedgerJournalEngine.

В общем, еще раз повторю - бизнес логика может быть и на форме и в этом случае будут вызываться не только табличные триггеры. Ну вот разве в NAV не так? Обратите внимание на вызов различных "formMethod". Некоторые из подобных классов без открытия формы и не инициализируешь.
Цитата:
Сообщение от
yuh
Олег, спасибо за ответ! Я когда это прочитал, чуть было сам не засомневался. А потом еще раз подумал и утвердился: да, именно так и происходит в NAV!
Поспрашивал коллег, занимающихся NAV. У них другое мнение.

В сферическом идеальном случае да, вызывать табличные триггеры достаточно. Но так это и в AX так. А в реальности бывает и код на формах, который при вызове табличных триггеров, естественно, не сработает.