При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартный механизм группировки работает слишком «агрессивно». Система по умолчанию стремится свернуть все записи с одинаковыми значениями в группировочных полях, суммируя ресурсы. Однако в некоторых задачах нам требуется вывести каждую физическую запись отдельно, даже если основные реквизиты совпадают, или же сгруппировать данные по уникальной комбинации нескольких полей. Разберем детально, как управлять этим процессом.
Представим ситуацию: у нас есть набор данных, содержащий информацию о движениях товаров. Мы хотим сгруппировать отчет по Складу и Номенклатуре одновременно, чтобы это выглядело как одна логическая группа. При этом возникает вторая проблема — если по одной и той же номенклатуре на одном складе было несколько операций, СКД может «схлопнуть» их в одну строку, сложив количества. Если нам важно видеть каждую операцию отдельно, стандартная группировка по ссылке нам не подойдет. Проанализируем, какими инструментами мы располагаем для решения этих задач.
Рассмотрим самый простой и нативный способ создания составной группировки. Многие начинающие разработчики пытаются найти в конфигураторе отдельный тип поля «Составное», однако всё гораздо проще и настраивается в пользовательском режиме или на вкладке «Настройки» в схеме компоновки.
Ctrl и выделяем, например, Организация и Склад.В этом случае СКД сформирует уникальный ключ группировки на основе комбинации этих двух значений. В итоговом отчете мы увидим одну строку группировки, где через запятую (или в отдельных колонках, в зависимости от настроек расположения полей) будут выведены оба реквизита. Это позволяет избежать излишней вложенности «лесенкой», когда данных слишком много.
Иногда нам нужно, чтобы группировка выглядела как единое целое в иерархии. Для этого мы можем применить Вычисляемые поля. Рассмотрим пример, когда нужно объединить артикул и наименование товара.
Разберем шаги настройки:
ТоварПодробно.
Строка(Номенклатура.Артикул) + " | " + Строка(Номенклатура.Наименование)
Этот метод хорош для визуализации, но помните: группировка будет идти по строковому представлению, что может быть менее производительно на огромных массивах данных, чем группировка по ссылочным полям.
Теперь перейдем к более сложному вопросу, который часто ставит в тупик: как сделать так, чтобы СКД не сворачивала одинаковые ссылки в одну строку группировки? Выясним причину такого поведения. СКД воспринимает поле группировки как уникальный ключ. Если ключ совпадает — записи объединяются.
Проанализируем ситуацию: у вас есть поле ДокументПродажи. Вы делаете по нему группировку. Если в наборе данных есть две записи с одним и тем же документом, они превратятся в одну строку. Чтобы этого избежать, нам нужно сделать ключ группировки уникальным для каждой строки набора данных.
Для этого в запрос набора данных следует добавить поле, которое гарантированно отличается для каждой строки. Например, НомерСтроки, МоментВремени или просто уникальный идентификатор (GUID). Рассмотрим пример запроса:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Количество КАК Количество,
Продажи.Сумма КАК Сумма,
Продажи.НомерСтроки КАК УникальныйКлюч
ИЗ
РегистрНакопления.Продажи КАК Продажи
После добавления такого поля, в настройках СКД мы добавляем в группировку оба поля: и Номенклатура, и УникальныйКлюч. Чтобы пользователь не видел техническое поле «УникальныйКлюч», его можно скрыть в настройках выбранных полей или задать ему нулевую ширину в оформлении. В результате СКД увидит, что комбинация {Товар, Строка 1} и {Товар, Строка 2} — это разные группы, и выведет их отдельными строками.
Если задача стоит максимально просто — вывести все строки без какого-либо суммирования на нижнем уровне — нам помогут Детальные записи. Разберем, как правильно их комбинировать с обычными группировками.
Допустим, нам нужна иерархия по Складам, а внутри Склада мы хотим видеть абсолютно все записи. Структура настроек должна выглядеть так:
Склад
При такой структуре СКД сначала сгруппирует данные по складам, а затем внутри каждого склада просто выведет строки набора данных «как есть», не пытаясь их объединять. Это самый быстрый и правильный с точки зрения архитектуры способ вывода подробных данных.
При работе со сложными группировками и связями наборов данных критически важно заглядывать на вкладку Наборы данных в колонку Роль. Посмотрим на основные настройки, которые влияют на результат:
ЛЕВОЕ СОЕДИНЕНИЕ в запросе.SELECT запроса, даже если пользователь не выбрал его в отчете. Это необходимо, если на этом поле строятся программные расчеты или специфические группировки.Подводя итог, можно сказать, что СКД предоставляет гибкие инструменты для управления данными. Главное — помнить, что любая группировка — это, прежде всего, создание ключа. Если вы понимаете, из чего состоит этот ключ (одно поле, несколько полей или скрытый идентификатор), вы всегда сможете добиться отчета нужного вида.