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