Подниму эту давнишнюю тему - хочу вернуться к коду чудо-метода ledgerJournalEngine_Server.adjustDate(), который с 2005-го года в неизменном виде перекочевал и в 2009-ю Аксапту:
X++:
ttsbegin;
dateCorrected = false;
while select forUpdate ledgerJournalTransLocal
where ledgerJournalTransLocal.journalNum == _ledgerJournalTrans.journalNum &&
ledgerJournalTransLocal.voucher == _ledgerJournalTrans.voucher
{
if (ledgerJournalTransLocal.recId != _ledgerJournalTrans.recId)
{
ledgerJournalTransLocal.transDate = _ledgerJournalTrans.transDate;
if (_ledgerJournalEngine)
_ledgerJournalEngine.currencyModified(ledgerJournalTransLocal);
ledgerJournalTransLocal.doUpdate();
dateCorrected = true;
}
}
ttscommit;
Обратите внимание, что этот чудо-код в рамках журнала перебивает дату во всех строчках с одинаковым ваучером, кроме переданной, не глядя на то, какая именно дата там уже прописана - пусть бы и везде одинаковая. Фигня? Конечно, если бы не последующий вызов _ledgerJournalEngine.currencyModified() на всех строчках, кроме переданной, который в общем случае приводит к
перезатиранию введенного пользователем курса валюты - опять же, во всех строчках, кроме переданной. В результате, допустим, хотим мы создать строки с одним ваучером и датой и указать там свой курс - не тот, что в карточке валюты. А этот чудо-метод во всех строках, кроме одной, перебивает нам курс на тот, что в карточке! Хорошо, если журнал создается руками, и пользователь это заметит, а вот если из кода, и после вставки строки журнала дергается ledgerJournalEngine.write(), вызывающий эту "коррекцию" даты, и журнал сразу разносится, то получается, мягко говоря, фигня