продолжаем препарировать этот отчётик. обнаружились новые "открытия", которые хотелось бы обсудить с компетентными товарищами с точки зрения правильного учёта.
итак, при формировании отчёта с детализацией и без и сортировкой по дате документа получаем в случае нулевой даты документа разные данные по столбцам с просроченной задолженностью.
(см. рисунки во вложении)
происходит это из-за того (смотрим код метода
calculateDetails класса
CustBalancelistDocumentDate), что при детализации в методе
queryRunOpenTransactions используется запрос
CustTransCustTransOpen с сортировкой по дате транзакции, а без детализации - в методе
queryRunOpenTransactionsSummary идёт создание запроса в коде, где уже группировка включается по полю даты документа.
X++:
switch (_dateTransactionDuedate)
{
case DateTransactionDuedate::TransactionDate:
groupByDataSourceNo = 1;
groupByFieldId = fieldnum(CustTransOpen, TransDate);
break;
case DateTransactionDuedate::DueDate:
groupByDataSourceNo = 1;
groupByFieldId = fieldnum(CustTransOpen, DueDate);
break;
case DateTransactionDuedate::DocumentDate:
groupByDataSourceNo = 2;
groupByFieldId = fieldnum(CustTrans, DocumentDate);
break;
default:
throw error(Error::wrongUseOfFunction(funcname()));
}
query = new Query();
query.addDataSource(tablenum(CustTransOpen));
query.dataSourceNo(1).addDataSource(tablenum(CustTrans));
query.dataSourceNo(2).joinMode(JoinMode::InnerJoin);
query.dataSourceNo(2).addLink(fieldnum(CustTransOpen, RefRecId), fieldnum(CustTrans, RecId));
и чуть ниже:
X++:
query.dataSourceNo(1).orderMode(OrderMode::GroupBy);
query.dataSourceNo(groupByDataSourceNo).addSortField(groupByFieldId);
query.dataSourceNo(2).orderMode(OrderMode::GroupBy);
query.dataSourceNo(2).addSortField(fieldnum(CustTrans, CurrencyCode));
query.dataSourceNo(1).fields().addField(fieldnum(CustTransOpen, AmountMST), SelectionField::Sum);
query.dataSourceNo(1).fields().addField(fieldnum(CustTransOpen, AmountCur), SelectionField::Sum);
query.dataSourceNo(groupByDataSourceNo).fields().addField(groupByFieldId);
query.dataSourceNo(2).fields().addField(fieldnum(CustTrans, CurrencyCode));
в следующем же сегменте кода того же метода
calculateDetails мы видим, что анализ на "пустую" дату документа смысла не имеет, ибо все транзакции уже сгруппированы, и оба варианта нулевые.
X++:
queryRun = this.queryRunOpenTransactions(_custTable);
while (queryRun.next())
{
custTrans = queryRun.get(tablenum(CustTrans));
custTransOpen = queryRun.get(tablenum(CustTransOpen));
this.addTrans(_custTable.AccountNum,
custTrans.Voucher,
custTrans.Invoice,
[U]custTrans.DocumentDate ? custTrans.DocumentDate : custTrans.TransDate,[/U]
this.isTransactionAPayment(custTrans),
'',
custTransOpen.AmountMST);
в этой связи вопрос к залу: а как должно выдавать эти данные, где дата документа нулевая (когда проводим фактуру, не указывая даты документа)? который из этих вариантов правильный? или есть третий путь?
спасибо за внимание.