При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с задачей ограничения количества строк внутри группировки или разворота строк во вложенные колонки. На первый взгляд самым очевидным решением кажется использование поля СистемныеПоля.НомерПоПорядкуВГруппировке или создание вычисляемого поля с функцией НомерПоПорядкуВГруппировке() с последующим наложением отбора, например, Номер = 1. Однако при попытке установить такой отбор группировка очищается, и строки пропадают из отчета вовсе. Разберем подробно, почему так происходит, и рассмотрим правильные способы решения этой задачи.
Проанализируем последовательность этапов компоновки данных платформой 1С:Предприятие:
Системное поле СистемныеПоля.НомерПоПорядкуВГруппировке, а также функция языка выражений СКД НомерПоПорядкуВГруппировке() рассчитываются непосредственно на этапе вывода уже скомпонованных и отфильтрованных данных. Если наложить отбор на значение, которое физически еще не рассчитано до момента применения фильтров, возникает конфликт вычислений: условие не выполняется, и СКД исключает строки из выборки.
Рассмотрим альтернативные способы реализации задач, ради которых обычно пытаются использовать данный отбор.
Если цель заключается в том, чтобы развернуть подчиненную группировку в строку (по колонкам), стандартная иерархическая структура группировок не подходит. Для этого необходимо использовать объект структуры Таблица (кросс-таблицу):
При таком подходе платформа автоматически выведет значения второй группировки в виде колонок для каждого элемента первой группировки без необходимости настраивать искусственную нумерацию.
Если требуется отобразить только первые N записей для каждой группы (например, только одну первую строку):
1).СКД выведет ровно указанное количество записей для каждого родительского элемента.
Если порядковый номер записи внутри группы необходим как полноценное поле для сложных условий отбора или специфической группировки, рассчитаем его в запросе набора данных. Для этого используем самосоединение таблицы:
ВЫБРАТЬ
Т1.Контрагент КАК Контрагент,
Т1.Договор КАК Договор,
КОЛИЧЕСТВО(Т2.Договор) КАК НомерСтрокиВГруппе
ИЗ
Документ_Продажи КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Документ_Продажи КАК Т2
ПО Т1.Контрагент = Т2.Контрагент
И Т1.Договор.Код >= Т2.Договор.Код
СГРУППИРОВАТЬ ПО
Т1.Контрагент,
Т1.Договор
Также при использовании временных таблиц можно применить функцию АВТОНОМЕРЗАПИСИ(). Полученное поле НомерСтрокиВГруппе становится обычным числовым полем источника данных. По нему можно беспрепятственно накладывать отборы как в основном фильтре отчета, так и в отборах отдельных группировок СКД.