Все гораздо проще.
Есть у датасорса в квери (объект QueryBuildDataSource) свойство fetchMode.
По умолчанию оно имеет значение QueryFetchMode::One2Many. Но его можно поставить в значение QueryFetchMode::One2One.
Смысл следующий.
Допустим у нас есть запрос из двух таблиц - шапки и строк. Если fetchMode = QueryFetchMode::One2Many, то getNo(шапки) возвратит курсор шапки только один (первый) раз для всех строк данной шапки.
Т.е. это будет выглядеть так:
X++:
while (queryRun.next())
{
= queryRun.getNo(1);
do
{
= queryRun.getNo(2);
.................... // код
}
while (queryRun.next());
}
Если же поставить fetchMode в значение QueryFetchMode::One2One (или в 0 что тоже самое) - то Вы получите тот эффект, который ожидаете получить.
Т.е. при каждом вызове queryRun.next() оба курсора будут заполнены данными.
Я не знаю как это связано с производительностью и зачем такая логика. Но она (логика) заложена именно такая.