Ну раз все молчат, вверну свой быдлокод.
Собственно в решении ничего неожиданного нет.
Заменил использование
markupDS.findRecord на банальное накладываение range по заранее собранным RecId (индекс в таблице такой есть, так что это не проблема). А сбор RecId уже спокойно можно разбить на 2 запроса.
Ниже уже конкретная реализация, если кому интересно.
Метод
dsExecuteMarkup по всему семейству сделал типа
boolean, чтобы в форме
FactureEditLines_RU у датасорса метод
executeQuery имел вид
X++:
public void executeQuery()
{
// SOI -->
/*
factureEngine.dsExecuteMarkup();
// super(); // PS 1791
*/
if (factureEngine.dsExecuteMarkup())
{
super();
}
// SOI <--
}
Далее, в классе
FactureEditLinesEngineCustVend_RU в метод
dsExecuteMarkup добавляем
X++:
mrkDS.clearRanges(); // в потомках мы накладываем range, логично его сначала почистить
return false;
И, наконец, в наследниках (тут пример
FactureEditLinesEngineCust_RU, в
Vend - аналогично)
X++:
public boolean dsExecuteMarkup()
{
MarkupTrans markupCursor;
CustInvoiceJour tJour = custInvoiceJourDS.cursor();
CustInvoiceTrans tTrans;
// SOI -->
QueryBuildDataSource qbds;
QueryBuildRange qbr;
Set set = new Set(Types::Int64);
SetEnumerator sE;
counter counter;
str range;
// SOI <--
;
super();
// SOI -->
qbds = markupDs.query().dataSourceTable(tablenum(MarkupTrans));
// собственно собираем все, что связано и со строками и с заголовком
while select recid
from markupCursor
where markupCursor.CustVendPosted_RU
&& !markupCursor.ItemPosted_RU
exists join tTrans
where tTrans.SalesId == tJour.SalesId
&& tTrans.InvoiceId == tJour.InvoiceId
&& tTrans.InvoiceDate == tJour.InvoiceDate
&& tTrans.NumberSequenceGroup == tJour.NumberSequenceGroup
&& tTrans.TableId == markupCursor.TransTableId
&& tTrans.RecId == markupCursor.TransRecId
{
set.add(markupCursor.RecId);
}
while select recid
from markupCursor
where markupCursor.CustVendPosted_RU
&& !markupCursor.ItemPosted_RU
&& markupCursor.TransTableId == tJour.TableId
&& markupCursor.TransRecId == tJour.RecId
{
set.add(markupCursor.RecId);
}
// и лепим это все в range
sE = set.getEnumerator();
while (sE.moveNext())
{
counter++;
if (counter > 15) // не по-научному, знаю, но зато работает :)
{
qbr = qbds.addRange(fieldnum(MarkupTrans, RecId));
qbr.value(range);
range = strmin();
counter = 0;
}
range = queryRangeConcat(range, sE.current());
}
if (!set.elements())
{
range = sysQuery::value(0); // ничего не нашли - ничего и не покажем
}
if (range)
{
qbr = qbds.addRange(fieldnum(MarkupTrans, RecId));
qbr.value(range);
}
return true;
// SOI <--
}
Повторюсь - решение топорное и где-то даже некрасивое, но решать нужно было быстро. Да и со своей задачей оно справляется. Потому больше ничего и не делалось в этом направлении.
Если у кого есть какие другие варианты или критика/дополнения - буду рад увидеть.