Если брать исходный текст с Query, то можно попробовать указать fetch mode 1:1 явно у всех DS (кроме первого, разумеется).
Если я правильно понял задачу, требуется что-то типа такого:
X++:
Query q;
QueryBuildDataSource qbdsIJT, qbdsIJTr, qbdsIL,
qbdsIT;
QueryBuildRange qbr;
QueryRun qr;
;
q = new Query();
// смысл group by мне непонятен
qbdsIJT = q.addDataSource(tablenum(InventJournalTable));
// qbdsIJT.orderMode(OrderMode::GroupBy);
qbdsIJT.addSelectionField(fieldNum(InventJournalTable, JournalId), SelectionField::Database);
qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationId), SelectionField::Database);
qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationIdTo), SelectionField::Database);
qbdsIJT.addRange(fieldnum(InventJournalTable, JournalNameId)).value('ПРС');
qbdsIJTr = qbdsIJT.addDataSource(tablenum(InventJournalTrans));
qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventTransId), SelectionField::Database);
qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, ItemId), SelectionField::Database);
qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventDimId), SelectionField::Database);
qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, Qty), SelectionField::Database);
qbdsIJTr.relations(true);
qbdsIJTr.joinMode(JoinMode::InnerJoin);
// qbdsIJTr.orderMode(OrderMode::GROUPBY);
qbdsIJTr.fetchMode(QueryFetchMode::One2One);
qbdsIT = qbdsIJTr.addDataSource(tableNum(InventTable));
qbdsIT.relations(true);
qbdsIT.addSelectionField(fieldNum(InventTable, ItemName), SelectionField::Database);
qbdsIT.addSelectionField(fieldNum(InventTable, ItemGroupId), SelectionField::Database);
qbdsIT.joinMode(joinMode::InnerJoin);
// qbdsItl.orderMode(OrderMode::GROUPBY);
qbdsIT.fetchMode(QueryFetchMode::One2One);
// можно объединить 2 DS в одну конструкцию
qbdsIT = qbdsIJT.addDataSource(tableNum(InventLocation));
qbdsIT.fetchMode(QueryFetchMode::One2One);
qbdsIT.joinMode(JoinMode::ExistsJoin);
qbdsIT.relations(false);
// это на самом деле relation
qbr = qbdsIT.addRange(fieldNum(InventLocation, InventLocationId));
qbr.value(strFmt('(%1.%2 = %4.%5) || (%1.%3 = %4.%5)',
qbdsIJT.name(), fieldStr(InventJournalTable, InventLocationId), fieldStr(InventJournalTable, InventLocationIdTo),
qbdsIT.name(), fieldStr(InventLocation, InventLocationId)) );
// прочие условия (на справочник складов)
//qbdsIT.addRange(fieldNum(...
// проверка, что не потерялся какой-нибудь DS
qr = new QueryRun(q);
if (qr.next())
info(strFmt('%1 %2 %3',
qr.get(tableNum(InventJournalTable)).(fieldNum(InventJournalTable, JournalId)),
qr.get(tableNum(InventJournalTrans)).(fieldNum(InventJournalTrans, InventTransId)),
qr.get(tableNum(InventTable)).(fieldNum(InventTable, ItemName))
));
info('DAX query: '+qbdsIJT.toString());
info(strFmt('Query qty: %1', SysQuery::qrCount(new QueryRun(q))));
В трёшке и 2009й работает. В примере объекты заменены на скл.журналы, но конструкция та же.
P.S. В стандарте, конечно же, нет полей со складами в шапке скл.журналов, добавлены вручную.
Пока строчил, уже всё порешали)))