Как в СКД вывести данные из разных полей в одну колонку в зависимости от группировки?

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

При разработке сложных отчетов на Системе компоновки данных (СКД) часто возникает ситуация, когда структура данных требует гибкости. Например, на уровне детальных записей нам нужно видеть одно значение (скажем, ОстатокПоСкладу), а на уровне итогов по иерархии или определенной группе — совершенно другое (например, ОстатокОрганизации). При этом пользователь хочет видеть результат в одной единственной колонке «Остаток», не загромождая отчет лишними столбцами.

В этой статье мы подробно разберем, как реализовать такую логику. Мы проанализируем несколько подходов: от стандартных настроек ресурсов до использования вычисляемых полей и переопределения настроек группировок.

Способ 1. Использование нескольких записей в табе «Ресурсы»

Это самый правильный и «чистый» метод с точки зрения архитектуры СКД. Он не требует написания сложного кода и позволяет использовать встроенный механизм агрегации данных. Разберем его по шагам.

Основная хитрость заключается в использовании колонки «Рассчитывать по...» на закладке «Ресурсы». Давайте проанализируем, как это работает:

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

Таким образом, СКД сама определит контекст вывода. Когда отчет формирует строку для склада, он возьмет формулу из второй записи. Когда перейдет к деталям — из первой. Это позволяет объединить логически разные данные в одном визуальном поле.

Способ 2. Вычисляемое поле с проверкой типа значения

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


ВЫБОР 
    КОГДА ТипЗначения(ПолеГруппировки) = ТИП("Справочник.Склады") 
        ТОГДА Остаток1 
    ИНАЧЕ Остаток2 
КОНЕЦ

После создания такого вычисляемого поля (назовем его ОбщийОстаток), нам все равно придется настроить его как ресурс. Рассмотрим подробнее настройку ресурсов для этого случая:

В выражении ресурса мы пишем Сумма(ОбщийОстаток). Однако важно понимать, что расчет ТипЗначения() на уровне итогов может работать не так, как ожидается, если в группировке участвуют составные типы. Поэтому данный метод лучше всего комбинировать с первым способом, четко указывая поле в колонке «Рассчитывать по...».

Способ 3. Определение уровня иерархии через функцию Уровень()

Иногда задача стоит так: на верхних уровнях иерархии показывать одни данные, а на вложенных — другие. В СКД для этого существует встроенная функция Уровень(). Она возвращает числовое значение вложенности текущей строки отчета (0 для общих итогов, 1 для первого уровня и так далее).

Разберем пример выражения для ресурса:


ВЫБОР 
    КОГДА Уровень() = 0 ТОГДА Сумма(ОстатокОрганизации)
    КОГДА Уровень() = 1 ТОГДА Сумма(ОстатокСклада)
    ИНАЧЕ Сумма(ОстатокДетальный)
КОНЕЦ

Этот подход крайне эффективен в иерархических отчетах по справочникам (например, Подразделения или Номенклатура), где структура заранее известна, но поля в базе данных для разных уровней различаются.

Способ 4. Проверка на NULL для определения текущей группировки

Проанализируем ситуацию: у нас есть группировка по полю Контрагент и вложенная группировка по полю Договор. Мы хотим в одной колонке видеть лимит по контрагенту и задолженность по договору. В ресурсе мы можем написать следующую конструкцию:


ВЫБОР 
    КОГДА Контрагент ЕСТЬ НЕ NULL И Договор ЕСТЬ NULL 
        ТОГДА Максимум(ЛимитКонтрагента) 
    ИНАЧЕ Сумма(СуммаЗадолженности) 
КОНЕЦ

Важный нюанс: такая проверка корректно работает в ресурсах, так как СКД при расчете итогов по конкретной группировке «зануляет» (устанавливает в NULL) значения полей, которые находятся ниже в иерархии группировок.

Способ 5. Переопределение выбранных полей в настройках

Если логика выбора данных слишком сложна для написания формул, или если вы хотите, чтобы названия колонок технически оставались разными, но визуально выглядели как одна, можно использовать возможности вкладки «Настройки».

Выясним, как это сделать без программирования:

  1. В структуре отчета выберем конкретную группировку (например, Склад).
  2. Перейдем на ее локальную вкладку «Выбранные поля».
  3. Снимем флажок «Использовать родительские настройки».
  4. Добавим в список только поле Остаток1.
  5. Нажмем правой кнопкой на это поле и в свойствах установим «Заголовок» равным слову «Остаток».
  6. Для следующей группировки (например, Товар) проделаем то же самое, но добавим поле Остаток2 и установим ему такой же заголовок — «Остаток».

В результате при выводе отчета пользователь увидит одну стройную колонку с одинаковым заголовком, хотя данные в нее будут подтягиваться из разных ресурсов платформой 1С автоматически.

Заключение

Мы рассмотрели пять различных способов решения задачи. Выбор конкретного метода зависит от ваших целей:

Сочетание этих инструментов позволяет создавать мощные и в то же время лаконичные отчеты, которые легко читаются конечными пользователями.

← На главную