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