При разработке сложных отчетов в системе компоновки данных (СКД) мы часто сталкиваемся с ситуацией, когда данные имеют иерархическую структуру, но визуально заказчик хочет видеть их в «плоском» или комбинированном виде. Рассмотрим типичную задачу: у нас есть справочник Номенклатура и связанные с ней Лоты (или серийные номера, партии, цены). Нам необходимо вывести общую сумму остатка по номенклатуре в одной ячейке, при этом сохранив детальную информацию по лотам в соседних строках, не допуская визуального дублирования общей суммы для каждой строки лота. Проанализируем, как реализовать это эффективно и красиво.
Самый простой и логичный способ, который мы разберем первым, — это правильная настройка структуры группировок в настройках отчета. Если нам нужно вывести общее количество для номенклатуры, но детализировать её по лотам, мы можем создать двухуровневую иерархию.
Рассмотрим по шагам:
Номенклатура.Лот.Номенклатура на вкладке «Дополнительные настройки» установим параметр «Расположение итогов» в значение «Нет» (или «Начало», в зависимости от требований к оформлению).Количество для вывода только на уровне номенклатуры.Этот метод позволяет «схлопнуть» данные на верхнем уровне, однако он не всегда решает задачу «объединения ячеек» по вертикали в том виде, в котором это делает Excel. Для достижения идеального визуального соответствия нам потребуются более тонкие инструменты.
Давайте разберем более продвинутый метод, который позволяет выводить агрегированные данные родительской группировки в строках детальных записей. Функция ВычислитьВыражение — это мощный инструмент СКД, позволяющий обращаться к данным других строк или уровней группировки.
Чтобы получить общую сумму по всей номенклатуре внутри строки с конкретным лотом, мы можем использовать специальный синтаксис в выражении поля ресурса или в вычисляемом поле. Проанализируем структуру функции:
ВычислитьВыражение("Сумма(Количество)", "Номенклатура", "Общая")
Разберем параметры этой функции:
"Сумма(Количество)" — это выражение, которое мы хотим вычислить. В данном случае мы суммируем остатки."Номенклатура" — это имя группировки, в контексте которой производится расчет. Это позволяет нам «подняться» на уровень выше."Общая" — область анализа.Используя этот подход, мы получим общее количество в каждой строке лота. Чтобы избежать визуального повторения цифр, мы перейдем к следующему шагу — условному оформлению.
Когда мы вывели общую сумму в каждую строку, нам нужно сделать так, чтобы она отображалась только один раз (например, в первой строке группы номенклатуры), создавая эффект объединенной ячейки. Выясним причину, почему это лучше делать через УО: это сохраняет возможность экспорта в Excel с правильными типами данных.
Алгоритм настройки:
Количество.НомерВГруппе. Условие должно выглядеть так: НомерВГруппе > 1.Таким образом, значение 120 (как в примере автора темы) будет выведено только в первой строке номенклатуры, а в последующих строках лотов ячейки будут выглядеть пустыми, что имитирует объединение.
Если заказчик настаивает на жестком соответствии макету (например, реальное объединение ячеек Merge в табличном документе), нам придется использовать «Макеты» в СКД. Рассмотрим, как это работает.
В схеме компоновки данных перейдем на вкладку «Макеты». Мы можем создать «Макет группировки» для поля Номенклатура. В этом макете мы рисуем область ячеек в конфигураторе так, как она должна выглядеть. Если мы объединим две ячейки по вертикали и укажем в них параметр Количество, СКД при выводе каждой группы будет растягивать эту объединенную область на все строки детальных записей.
Важные моменты при работе с макетами:
Посмотрим на ситуацию со стороны метаданных. В наборе данных СКД у каждого поля есть свойство «Роли». Для поля ресурса можно настроить игнорирование определенных группировок. Это полезно, когда мы хотим, чтобы сумма считалась только по «верхним» уровням.
Вкладка «Ресурсы» также позволяет задать разные выражения для разных уровней группировки. Проанализируем следующий пример настройки:
Для поля Количество в колонке «Рассчитывать по...» укажем:
Номенклатура выражение: Сумма(Количество).Лот выражение: 0 (или вообще оставим пустым).В этом случае СКД сама очистит значения в детальных строках лотов, оставив итог только на уровне номенклатуры. Это «чистый» способ без использования условного оформления текста.
Мы проанализировали ситуацию и нашли несколько путей решения задачи объединения ресурсов. Выбор конкретного метода зависит от того, насколько критична визуальная составляющая:
НомерВГруппе).Помните, что излишнее «дроч...» (как выразился автор темы) с оформлением часто можно заменить простым объяснением заказчику стандартов работы системы, но если бизнес требует — механизмы СКД позволяют реализовать практически любую фантазию визуализации данных.