Как сделать отбор по системному полю НомерПоПорядкуВГруппировке в СКД

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с задачей ограничения количества строк внутри группировки или разворота строк во вложенные колонки. На первый взгляд самым очевидным решением кажется использование поля СистемныеПоля.НомерПоПорядкуВГруппировке или создание вычисляемого поля с функцией НомерПоПорядкуВГруппировке() с последующим наложением отбора, например, Номер = 1. Однако при попытке установить такой отбор группировка очищается, и строки пропадают из отчета вовсе. Разберем подробно, почему так происходит, и рассмотрим правильные способы решения этой задачи.

Выясним причину: почему не работает отбор по номеру по порядку

Проанализируем последовательность этапов компоновки данных платформой 1С:Предприятие:

  1. Получение данных и наложение отборов: СКД применяет фильтры из схемы и пользовательских настроек на уровне текста запроса к базе данных и внутренней фильтрации наборов данных.
  2. Формирование дерева или таблицы группировок: данные агрегируются согласно настроенной иерархии.
  3. Вывод макета компоновки: происходит генерация результирующего табличного документа.

Системное поле СистемныеПоля.НомерПоПорядкуВГруппировке, а также функция языка выражений СКД НомерПоПорядкуВГруппировке() рассчитываются непосредственно на этапе вывода уже скомпонованных и отфильтрованных данных. Если наложить отбор на значение, которое физически еще не рассчитано до момента применения фильтров, возникает конфликт вычислений: условие не выполняется, и СКД исключает строки из выборки.

Рассмотрим альтернативные способы реализации задач, ради которых обычно пытаются использовать данный отбор.

Способ 1. Разворот данных по горизонтали через структуру Таблица

Если цель заключается в том, чтобы развернуть подчиненную группировку в строку (по колонкам), стандартная иерархическая структура группировок не подходит. Для этого необходимо использовать объект структуры Таблица (кросс-таблицу):

  1. Перейдем на вкладку Настройки схемы компоновки данных.
  2. Удалим линейную структуру группировок и нажмем Добавить > Новая таблица.
  3. В ветку Строки таблицы добавим первую (родительскую) группировку.
  4. В ветку Колонки таблицы добавим вторую группировку, которую необходимо развернуть по горизонтали.
  5. В ветку Выбранные поля таблицы добавим числовые ресурсы или показатели.

При таком подходе платформа автоматически выведет значения второй группировки в виде колонок для каждого элемента первой группировки без необходимости настраивать искусственную нумерацию.

Способ 2. Ограничение количества строк в группировке (Первые N записей)

Если требуется отобразить только первые N записей для каждой группы (например, только одну первую строку):

  1. Откроем вкладку Настройки в СКД.
  2. Выделим конкретную вложенную группировку, для которой требуется ограничение.
  3. В нижней части окна перейдем на вкладку Другие настройки.
  4. Найдем свойство Количество записей и установим желаемое число (например, 1).
  5. На вкладке Порядок для этой же группировки обязательно настроим правила сортировки, чтобы система однозначно определяла, какие именно записи будут первыми.

СКД выведет ровно указанное количество записей для каждого родительского элемента.

Способ 3. Нумерация строк на уровне запроса набора данных

Если порядковый номер записи внутри группы необходим как полноценное поле для сложных условий отбора или специфической группировки, рассчитаем его в запросе набора данных. Для этого используем самосоединение таблицы:


ВЫБРАТЬ
    Т1.Контрагент КАК Контрагент,
    Т1.Договор КАК Договор,
    КОЛИЧЕСТВО(Т2.Договор) КАК НомерСтрокиВГруппе
ИЗ
    Документ_Продажи КАК Т1
    ЛЕВОЕ СОЕДИНЕНИЕ Документ_Продажи КАК Т2
        ПО Т1.Контрагент = Т2.Контрагент
        И Т1.Договор.Код >= Т2.Договор.Код
СГРУППИРОВАТЬ ПО
    Т1.Контрагент,
    Т1.Договор

Также при использовании временных таблиц можно применить функцию АВТОНОМЕРЗАПИСИ(). Полученное поле НомерСтрокиВГруппе становится обычным числовым полем источника данных. По нему можно беспрепятственно накладывать отборы как в основном фильтре отчета, так и в отборах отдельных группировок СКД.

← На главную