Участник
|
В стандартной функциональности отмена пересчета нереализованных курсовых разниц при помощи периодической операции модуля отсутствует. Это относится к Microsoft NavisionAxapta 3.0 SP6 Microsoft Dynamics AX 4.0 SP2.
Для ручного \ программного способа, в Вашем случае расчета нереализованной курсовой по поставщикам необходимо:- Почистить последние операции LastSettleVoucher и даты LastSettleDate (для 4-ки) сопоставления, сумму курсовой разницы ExchAdjustment, последнюю курсовую разницу LastExchAdj, последнюю операцию по курсовой разнице LastExchAdjVoucher(для 4-ки), последнюю ставку по курсовой разнице LastExchAdjRate (для 4-ки), и нереализованную курсовую разницу VendExchAdjustmentUnrealized, в таблице VendTrans
- В таблице открытых проводок по поставщику VendTransOpen для поля AmountMST по ссылке RefRecId для соответствующего поля RecId в проводках поставщика переписать значение поля AmountMST из VendTrans.
- Удалить записи в таблице сопоставления по поставщику VendSettlement по соответствующим сопоставляемым значениям поля Voucher и по ссылке RefRecId для соответствующих полей RecId таблицы VendTrans.
- Удалить по значениям полей LastSettleVoucher, Voucher, TransDate записи в таблицах VendTrans и LedgerTrans касаемые расчета нереализованной курсовой (значение поля VendExchAdjustmentUnrealized таблицы VendTrans не равно нулю, значение поля VendExchAdjustmentRealized таблицы VendTrans равно нулю, значение поля TransType таблицы VendTrans равно ExchAdjustment: VendTrans. TransType == LedgerTransType:: ExchAdjustment)
По этой схеме получим следующий код Job-а для стандарта:
X++: static void CorrVendExchAdj(Args _args)
{
VendTable vtb;
VendTrans vtAc;
VendTrans vtEx;
VendTrans vt;
VendTrans vtr;
VendTransOpen vto;
VendSettlement vtsAc;
VendSettlement vts;
LedgerTrans ledgerTransAc;
LedgerTrans ledgerTransCorr;
TransDate dt = 22\06\2009; // Дата отменяемого пересчета НКР
int i;
;
if (box::okCancel("Вы уверены в необходимости отмены пересчета нереализованных курсовых разниц поставщиков", DialogButton::Cancel) == DialogButton::Ok)
{
ttsbegin;
while select vtb
where vtb.AccountNum
{
while select forupdate vtAc
where vtAc.AccountNum == vtb.AccountNum &&
vtAc.LastSettleDate == dt &&
vtAc.VendExchAdjustmentUnrealized != 0 &&
vtAc.ExchAdjustment != 0
join forupdate vtEx
where vtEx.LastSettleVoucher == vtAc.Voucher &&
vtEx.TransType == LedgerTransType::ExchAdjustment &&
vtEx.TransDate == dt
{
while select forupdate ledgerTransAc
where ledgerTransAc.Voucher == vtEx.Voucher &&
ledgerTransAc.TransType == LedgerTransType::ExchAdjustment &&
ledgerTransAc.TransDate == dt
join forupdate ledgerTransCorr
where ledgerTransCorr.Voucher == ledgerTransAc.Voucher &&
ledgerTransCorr.BondBatchTrans_RU == ledgerTransAc.BondBatchTrans_RU &&
ledgerTransCorr.BondBatch_RU == ledgerTransAc.BondBatch_RU &&
ledgerTransCorr.Crediting == NoYes::Yes
{
ledgerTransAc.doDelete();
ledgerTransCorr.doDelete();
}
while select forupdate vtsAc
where vtsAc.OffsetTransVoucher == vtEx.Voucher &&
vtsAc.TransRecId == vtAc.RecId
join forupdate vts
where vts.OffsetTransVoucher == vtAc.Voucher &&
vts.TransRecId == vtEx.RecId
{
vtsAc.doDelete();
vts.doDelete();
}
select firstonly forupdate vto
where vto.RefRecId == vtAc.RecId;
vto.AmountMST = vtAc.AmountMST;
vto.doUpdate();
vtEx.doDelete();
vtAc.LastSettleVoucher = '';
vtAc.LastSettleDate = dateNull(); // for AX 4.0
vtAc.ExchAdjustment = 0;
vtAc.LastExchAdj = dateNull();
vtAc.LastExchAdjVoucher = ''; // for AX 4.0
vtAc.LastExchAdjRate = 0; // for AX 4.0
vtAc.VendExchAdjustmentUnrealized = 0;
vtAc.doUpdate();
i++;
}
}
}
Info(strfmt("Отмена пересчета нереализованных курсовых разниц поставщиков выполнена. %1 проводок обработано", i));
ttscommit;
}
При наличии реализованной курсовой разницы пересчитанной сопоставлением проводок и нереализованной курсовой разницы в разных налоговых периодах стандартный функционал отрабатывает корректно не для всех сценариев. И по этому поводу Microsoft NavisionAxapta 3.0 приходилось дорабатывать. Например:
Расчет реализованной и нереализованной курсовой разницы:- Проводим валютную накладную по поставщику (клиенту). В следующем месяце проводим валютный платеж по поставщику (клиенту). Сопоставляем проводки вручную либо сопоставление происходит в автоматическом режиме.
- Проводим переоценку задолженности по контрагенту на конец месяца, в котором была сделана накладная.
- При расчете нереализованной курсовой разницы к переоценке принимается только открытая сумма накладной. Хотя на дату переоценки платежа еще нет.
Получается, что при переоценке задолженности дата сопоставления не анализируется.
Решение: Данную ситуацию легко избежать, если регистрировать в системе операции в их хронологической последовательности. Если выполнить переоценку в последний день месяца не удается, то рекомендуется отключать автоматическое сопоставление проводок по контрагенту, и не выполнять ручного сопоставления до того момента, пока переоценка задолженности по этому контрагенту на конец месяца не будет выполнена в системе.
Механизм расчета курсовой разницы переработан в следующей версии системы - Microsoft Dynamics AX 4.0. Но не достаточно для того, чтобы не возникало ошибок данных. При определённых сценариях система формирует бухгалтерские проводки не по требованию Налогового законодательства. Например:
Некорректное закрытие проводок с разными профилями разноски:- Разнесена Накладная по Закупке Профиль разноски – MDCStd. Итоговый счет для Группы поставщиков ExtFrg 60.1101. Сформировалась бухгалтерская проводка: 01.11.2007; Д 41.0100 К 60.1101; 210,00 EUR, 7350,00 руб. Валюта: EUR. Курс: 35 руб./EUR.
- Разнесена Кредит-Нота по этой Закупке Профиль разноски – CreditNote. Итоговый счет для Группы поставщиков ExtFrg 76.5500. Сформировалась бухгалтерская проводка: 05.11.2007; Д 76.5500 К 41.0100; 210,00 EUR, 7560,00 руб. Валюта: EUR. Курс: 36 руб./EUR.
- Выполнено сопоставление проводок Накладной и Кредит-ноты по Закупке. Сформировались бухгалтерские проводки: 05.11.2007; Д 91.2012 К 60.1101; 210,00 руб. Проводка отрицательной курсовой разницы выполнена без ошибок. 05.11.2007; Д 60.1101 К 76.5500; 7560,00 руб. Текст проводки - (закрытие счета). Это закрывающая проводка привела к увеличению остатка по Дебету счета 60.1101 на 7560,00 руб., и к увеличению остатка по Кредиту счета 76.5500 на 7560,00 руб.
Решение: В \Classes\CustVendSettle_Vend\balancePostingProfile:
X++: void balancePostingProfile(CustVendTrans _custVendTransDebet,
CustVendTrans _custVendTransCredit,
AmountMST _amountMST)
{
LedgerBondClient_RU ledgerBondClient = ledgerVoucher.findLedgerVoucherObject().ledgerBondClient_RU();
LedgerVoucherTransObject ledgerVoucherTransObject;
LedgerVoucherObject ledgerVoucherObject;
LedgerAccount accountNumDebet;
LedgerAccount accountNumCredit;
CustVendSettlePostingLog_RU postingLog;
;
// fix -->
//if (_custVendTransDebet.postingProfile != _custVendTransCredit.postingProfile)
if ((_custVendTransDebet.postingProfile != _custVendTransCredit.postingProfile) &&
((_custVendTransDebet.TransType == LedgerTransType::Purch) &&
(_custVendTransCredit.TransType != LedgerTransType::Purch)))
// fix <--
{
ledgerVoucherObject = this.createLedgerVoucherObject_RU();
ledgerBondClient = ledgerVoucherObject.ledgerBondClient_RU();
accountNumDebet = VendLedgerAccounts::sumAccount(_custVendTransDebet.accountNum,
_custVendTransDebet.postingProfile);
accountNumCredit = VendLedgerAccounts::sumAccount(_custVendTransCredit.accountNum,
_custVendTransCredit.postingProfile);
if (accountNumDebet != accountNumCredit)
{
ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),
LedgerPostingType::VendPayment,
accountNumDebet,
_custVendTransDebet.dimension,
Companyinfo::standardCurrency(),
_amountMST,
_custVendTransDebet.recId);
ledgerVoucherObject.addTrans(ledgerVoucherTransObject);
ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),
LedgerPostingType::VendPayment,
accountNumCredit,
_custVendTransCredit.dimension,
Companyinfo::standardCurrency(),
-_amountMST,
_custVendTransCredit.recId);
ledgerVoucherObject.addTrans(ledgerVoucherTransObject);
if (isConfigurationkeyEnabled(configurationkeynum(CustVendJournalizeSettlementTrans_W)))
{
CustVendTrans::balancePostingProfile_ru(ledgerVoucherTransObject,
_custVendTransDebet,
_custVendTransCredit,
companyInfo::standardCurrency(),
_custVendTransDebet.dimension,
_custVendTransCredit.dimension,
_amountMst,
_amountMst);
postingLog = New CustVendSettlePostingLog_RU(CustVendTransPostingLogType_RU::Balance);
postingLog.parmVoucher(ledgerVoucher.lastVoucher());
postingLog.parmTransDate(ledgerVoucher.lastTransDate());
postingLog.parmCorrect(ledgerVoucher.parmCorrection(ledgerVoucher.lastVoucher()));
postingLog.parmTransRecId (_custVendTransDebet.RecId);
postingLog.parmOffsetRecId (_custVendTransCredit.RecId);
postingLog.parmOffsetDimension(_custVendTransCredit.Dimension);
postingLog.parmReverseTrans(true);
postingLog.createTrans(LedgerPostingType::CustPayment,
accountNumDebet,
accountNumCredit,
_custVendTransDebet.dimension,
CompanyInfo::standardCurrency(),
_amountMst,
_amountMST,
- ledgerVoucherTransObject.parmAmountMSTSecondary());
}
if (ledgerBondClient)
{
ledgerBondClient.bondVRef2VRef(ledgerBondClient.lastVrefId(),
ledgerBondClient.lastVrefId(-1));
}
}
}
}
__________________
“Правильно поставленная задача – оказывается наполовину решена” Мой шеф по диплому Анатолий Алексеевич Маркилов.
Мой статус: В поиске хорошо оплачиваемой работы.
|