AX 2009 RU7
Некорректно формируются строки налогового регистра по курсовым разницам если в один период подает следующий набор операций:
1. Операция курсовой разницы
2. Сторно 1-й операции
3. Отдельная операция курсовой разницы с суммой равной 2-й
В такой или аналогичной ситуации процедура свертки строк может подхватить операцию 2 и 3 и удалить их из регистра вместо 1 и 2.
Class / RTax25RegCalc_ExchangeAdj / selectCustVendTrans
X++:
...
void collapseMap()
{
container con;
int j;
MapIterator it = new MapIterator(collapse);
CustVendTrans transCorrect, transDirect;
while (it.more())
{
con = it.value();
// Optimization -->>
// for (i = 1; i <= conlen(con); i++)
if (conlen(con) > 1)
for (i = 2; i <= conlen(con); i++)
// Optimization <<--
{
transCorrect = conpeek(con, i);
if (transCorrect.Correct == NoYes::No ||
transCorrect.TransType == LedgerTransType::AdvanceAdjustment_RU)
continue;
// Optimization -->>
// for (j = 1; j <= conlen(con); j++)
for (j = i - 1; j >= 1; j--)
// Optimization <<--
{
// Optimization -->>
// if (i == j)
// continue;
// Optimization <<--
transDirect = conpeek(con, j);
// Optimization -->>
// if (transCorrect.TransDate < transDirect.TransDate)
// break;
// Optimization <<--
if (transDirect.Correct == NoYes::No &&
// Fix -->>
transDirect.AmountMST == -transCorrect.AmountMST &&
// Fix <<--
LedgerPeriod::find(transCorrect.TransDate).RecId ==
LedgerPeriod::find(transDirect.TransDate).RecId)
{
con = condel(con, j > i ? j : i, 1);
con = condel(con, j > i ? i : j, 1);
record = condel(record, confind(record, transCorrect), 1);
record = condel(record, confind(record, transDirect), 1);
i -= (j < i ? #FieldNum2 : 1);
break;
}
}
}
it.next();
}
}
;
while select custVendTrans
// Optimization -->>
// order by TransDate asc
order by TransDate asc, Correct asc
// Optimization <<--
...