|
12.03.2013, 11:15 | #1 |
Участник
|
Открытая проводка по закрытой проводке клиента
Добрый день!
Имеется валютная проводка клиента с проставленной датой закрытия, при этом по ней есть открытая проводка с нулевой суммой в валюте операции и ненулевой суммой в первичной валюте. Вопрос, это нормальная ситуация? А то эта сумма вылезает, как задолженность в нашем отчете по дебиторке, если строить его в первичной валюте. |
|
12.03.2013, 11:30 | #2 |
NavAx
|
Это ошибка.
Вот кусок джоба, которым искали подобные ошибки. X++: while select CustTrans where (!AccountNum || CustTrans.AccountNum == AccountNum) && (!Voucher || CustTrans.Voucher == Voucher) && (!PostingProfile || CustTrans.PostingProfile == PostingProfile) && (!dateFrom || CustTrans.TransDate >= dateFrom) exists join CustTransOpen2 where CustTransOpen2.RefRecId == CustTrans.RecId { select sum(AmountMST), sum(AmountCur), count(RecId) from CustTransOpen where CustTransOpen.RefRecId == CustTrans.RecId; AmountMST = CustTrans.AmountMST + CustTrans.ExchAdjustment - CustTrans.SettleAmountMST - CustTransOpen.AmountMST; AmountCur = CustTrans.AmountCur - CustTrans.SettleAmountCur - CustTransOpen.AmountCur; if (AmountMST != 0 || AmountCur != 0) info(strfmt("CustTrans.RecId открытая сумма %1", CustTrans.RecId)); select sum(SettleAmountMST), sum(SettleAmountCur), sum(ExchAdjustment) from CustSettlement where CustSettlement.TransRecId == CustTrans.RecId; AmountMST = CustTrans.SettleAmountMST - CustSettlement.SettleAmountMST - CustSettlement.ExchAdjustment; AmountCur = CustTrans.SettleAmountCur - CustSettlement.SettleAmountCur; if (AmountMST != 0 || AmountCur != 0) info(strfmt("CustTrans.RecId сумма сопоставления %1", CustTrans.RecId)); if (abs(CustTrans.AmountCur) < abs(CustTrans.SettleAmountCur) || abs(CustTrans.AmountMST) < abs(CustTrans.SettleAmountMST - CustTrans.ExchAdjustment)) { info(strfmt("!!!CustTrans.RecId сумма сопоставления больше самой суммы %1", CustTrans.RecId)); } } Последний раз редактировалось raz; 12.03.2013 в 11:35. Причина: 1 |
|
|
За это сообщение автора поблагодарили: gl00mie (3), byte (1). |
12.03.2013, 14:24 | #3 |
Участник
|
Спасибо за джобик. Он ругается на открытую сумму.
Насколько я понимаю, должно выполняться равенство custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment В моем случае имеется расхождения на сумму открытой проводки. Единственное, что мне приходит на ум, это тупо ее удалить. |
|
12.03.2013, 14:59 | #4 |
NavAx
|
|
|
13.03.2013, 11:43 | #5 |
Участник
|
Цитата:
custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment выполняется, но опять же по закрытой проводке имеется открытая, причем равная нереализованной курсовой разнице. Что бы это могло значить? В чем вообще отличие нереализованной от реализованной курсовой разницы? |
|
12.03.2013, 11:39 | #6 |
Участник
|
Тип проводки какой?
|
|
12.03.2013, 13:31 | #7 |
Участник
|
|
|
18.03.2013, 14:54 | #8 |
Участник
|
Для начала поделюсь тем, что выяснил:
Реализованная КР - разница между рублевой оценкой сделки покупки/продажи валюты по курсу сделки и рублевой оценкой сделки по курсу ЦБ на дату проведения сделки. Нереализованная КР - изменение рублевой оценки валютных средств в связи с изменением курса ЦБ. Т.е. курсовая, появляющаяся в процессе сопоставления - реализованная, а в процессе переоценки - нереализованная. Что касается равенства custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment, то для проводок типа "курсовая разница" оно не выполняется, выяснено на практике. Что же касается других типов проводки, я думаю, все же должно выполнятся (это мое предположение, поправьте, пжл, если не так). А теперь вопрос. После запуска переоценки я обнаружил, что она корректирует закрытые проводки. Несмотря на то, что при запуске переоценки в запросе присутствует join с открытыми проводками, запрос, с которым она работает строится на лету и в нем этой связи нет. Это нормально, что так система работает? Метод расчета КР стоит "Инкрементный". |
|
02.04.2013, 18:37 | #9 |
Участник
|
Цитата:
Приведу код, который позволил сторнировать неправильные корректировки нереализованной курсовой. Для его работы требуется сделать public метод postExchAdj класса CustVendExchAdjustment_W. X++: CustTrans custTrans, custTrans2, custTransNew; CustSettlement custSettlement, custSettlement2; CustTransOpen custTransOpen, custTransOpen2; LedgerTrans ledgerTrans; ExchRate exchRate; CustVendExchAdjustment_W custVendExchAdjustment; CustVendTransSettlement custVendTransSettlement; CustVendSettle custVendSettle; CustVendExchAdj custVendExchAdj; CustVendExchAdjTrans custVendExchAdjTrans; LedgerVoucherGroup ledgerVoucherGroup; LedgerVoucher ledgerVoucher; LedgerVoucherObject ledgerVoucherObject; TransDate transDate = 31\03\2013; Voucher voucher; Set set = new Set(types::Container); SetIterator si; ; while select forupdate custTrans where custTrans.TransType != LedgerTransType::ExchAdjustment && custTrans.CurrencyCode != "RUR" notexists join custTransOpen2 where custTransOpen2.RefRecId == custTrans.RecId { if(custTrans.AmountMST != custTrans.SettleAmountMST - custTrans.ExchAdjustment) { if(custTrans.AmountMST == custTrans.SettleAmountMST - custTrans.CustExchAdjustmentRealized) { info(strfmt("Расходится на нереализованную курсовую;%1;%2;%3", custTrans.Voucher, custTrans.RecId, custTrans.TransDate)); while select custSettlement where custSettlement.TransRecId == custTrans.RecId && custSettlement.ExchAdjustment join custTrans2 where custTrans2.Voucher == custSettlement.OffsetTransVoucher && custTrans2.TransType == LedgerTransType::ExchAdjustment && custTrans2.CustExchAdjustmentUnrealized { set.add([custTrans.RecId, custTrans2.RecId]); } } else { info(strfmt(";%1;%2;%3", custTrans.Voucher, custTrans.RecId, custTrans.TransDate)); } } } ttsbegin; si = new SetIterator(set); while(si.more()) { custTrans = CustTrans::find(conpeek(si.value(), 1), true); custTrans2 = CustTrans::find(conpeek(si.value(), 2)); custVendTransSettlement = CustVendTransSettlement::construct(SysModule::Cust); custVendExchAdj = new CustExchAdj(); custVendExchAdjTrans = CustVendExchAdjTrans::construct(SysModule::Cust, custVendExchAdj); custVendExchAdjustment = CustVendExchAdjustment_W::newFromExchAdj(custVendExchAdj, custVendExchAdjTrans); custVendExchAdjustment.setCustVendTransSettlement(custVendTransSettlement); custVendExchAdjustment.parmTransactionDate(transDate); custVendExchAdjustment.setSettlementGroupPlaceHolder(1); ledgerVoucher = LedgerVoucher::newLedgerPost( DetailSummary::Summary, SysModule::Cust, "" ); ledgerVoucher.parmCompanyId(curext()); //voucher = NumberSeq::newGetNum(CustParameters::numRefCustExchAdjVoucher()).num(); voucher = custTrans2.Voucher; ledgerVoucherObject = LedgerVoucherObject::newVoucher( voucher, transDate, SysModule::Cust, LedgerTransType::ExchAdjustment, true ); ledgerVoucher.addVoucher(ledgerVoucherObject); custVendExchAdjustment.parmLedgerVoucher(ledgerVoucher); exchRate = ExchRates::findExchRateDate(custTrans.CurrencyCode, custVendExchAdjTrans.exchrateDate(custTrans)).ExchRate; custTrans.LastSettleVoucher = ledgerVoucher.lastVoucher(); custTrans.LastSettleCompany = ledgerVoucher.parmCompanyId(); custTrans.LastExchAdjVoucher = custTrans.LastSettleVoucher; custTrans.LastExchAdjRate = exchRate; custTrans.LastExchAdj = transDate; custTrans.LastSettleDate = custTrans.LastExchAdj; custTrans.update(); custVendExchAdjustment.postExchAdj( custTrans2.CustExchAdjustmentUnrealized, custTrans, true, false, "", datenull(), 0, NoneTableTrans::Transaction, custTrans.Dimension, custTrans.PostingProfile, false, "", 0, false, custTrans, custTrans, voucher ); custSettlement2 = custVendExchAdjustment.parmCustVendSettle().updateTransaction_W(custTrans, null); custVendTransSettlement.addSettlement(custSettlement2, 1, custTrans.TransType); ledgerVoucher.end(); custVendTransSettlement.post(); si.next(); } ttscommit; |
|
03.04.2013, 10:16 | #10 |
MCTS
|
Вообще, в переоценке курсовых по закрытым проводкам нет ничего криминального. Так как допустим, сопоставили мы накладную с оплатой в текущем периоде. А переоценку курсовой на конец прошлого периода сделать забыли. А теперь хотим получить корректную отчетность на конец прошлого периода с учетом курсовых.
__________________
I could tell you, but then I would have to bill you. |
|
|
За это сообщение автора поблагодарили: byte (1). |
03.04.2013, 16:43 | #11 |
Участник
|
Цитата:
Сообщение от twilight
Вообще, в переоценке курсовых по закрытым проводкам нет ничего криминального. Так как допустим, сопоставили мы накладную с оплатой в текущем периоде. А переоценку курсовой на конец прошлого периода сделать забыли. А теперь хотим получить корректную отчетность на конец прошлого периода с учетом курсовых.
|
|
18.03.2013, 23:16 | #12 |
MCTS
|
У меня тоже появляются подобные проводки (AX 2009 RU6) и сегодня я обнаружил один из вариантов их возникновения: если в форме сопоставление фактур с оплатами сопоставлять одновременно накладные от 31.01.2013, 07.02.2013 и 28.02.2013 с платежом от 07.02.2013 при условии, что расчитана нереализованная курсовая (метод расчета в параметрах ГК Итого за период) на 28.02.2013. То потом при отмене этих сопоставлений нереализованная курсовая по накладным от 31.01.2013 и 07.02.2013 задваивается! Это происходит из-за того, что когда выбирается несколько записей в форме сопоставления, то дата сопоставления определяется по умолчанию как максимальная из всех дат отмеченных записей (т. е. есть разница - сопоставляем попарно будет один результат, сопостовляем все вместе - будет другой результат). Мало того, что это само по себе странно (пользователям удобно сопоставлять несколько записей одновременно, но по бух. учету правильнее дату сопоставления брать отдельно по каждой паре сопоставляемых проводок), так еще и при этом некорректно срабатывает отмена сопоставления...
__________________
I could tell you, but then I would have to bill you. |
|
|
За это сообщение автора поблагодарили: byte (1). |
19.03.2013, 17:38 | #13 |
MCTS
|
Нашел как исправить: Реверс сопоставлений
__________________
I could tell you, but then I would have to bill you. |
|
|
|