что то я не понял в чем тут прелесть использования макроса?
гораздо нагляднее и проще вывести на диалог query, где пользователь спокойно может указать диапазон через "..". Более того, в query пользователь сможет, при желании, добавить ещё и свое поле с условием для выборки.
Вот такой код, ИМХО, проще для понимания и поддержания:
1. Создаем класс для нашего отчета\функции и наследуем его от RunBase.
2. Перекрываем методы: QueryRun - указываем свой queryRun, который определили в ClassDeclaration; ShowQueryValues - возвращаем true; Pack; UnPack; InitParmDefault.
3. Создаем метод InitQuery в котором пишем запрос для нашего диалога:
X++:
Query query = new Query();
QueryBuildDataSource qbds;
;
qbds = query.addDataSource(tableNum(CustInvoiceTable));
qbds.addRange(fieldNum(CustInvoiceTable, CustGroupId));
qbds.addRange(fieldNum(CustInvoiceTable, CustAccount));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceAccount));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceDate));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceId));
queryRun = new QueryRun(query); // queryRun объявлен в ClassDeclarartion класса
4. вызываем метод InitQuery в методе InitParmDefault до вызова super().
и все, при выполнении нашего отчета\функции появиться диалог, в котором пользователь может указать хоть диапазон, хоть одно значение, хоть несколько значений через запятую, хоть вообще добавить свое поле и указать для него значение.
потом в Run будет простой перебор
X++:
while(queryRun.next())
и ничего мудрить не придется