Как в СКД вывести общий итог по строке в каждой колонке таблицы

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

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

Постановка задачи и анализ проблемы

Представим ситуацию: у нас есть кросс-таблица, где в строках выведены товары, а в колонках — склады. В пересечении находится ресурс Количество. Нам нужно добавить вторую колонку в каждый склад (или вторую строку ресурса), которая будет показывать не количество на этом конкретном складе, а суммарное количество этого товара по всем складам сразу.

Стандартное агрегатное выражение Сумма(Ресурс) в СКД всегда рассчитывается в контексте текущей ячейки. То есть в колонке "Склад 1" оно покажет итог только по "Складу 1". Если мы попытаемся использовать функцию ВычислитьВыражение("Сумма(Ресурс)", "Строка"), система может выдать неожиданный результат, так как она все равно учитывает пересечение с текущей колонкой. Нам же необходимо "вырваться" из контекста текущей колонки и обратиться к итогу всей строки.

Решение через функцию ВычислитьВыражение

Рассмотрим основной инструмент решения подобных задач — функцию ВычислитьВыражение. Для того чтобы получить итог по всей строке, находясь в конкретной колонке, нам нужно правильно указать параметры группировки и области анализа.

Проанализируем синтаксис, который позволяет решить задачу в базовом случае:

ВычислитьВыражение("Сумма(Ресурс)", "Колонка", "ОбщийИтог")

Разберем, что означают эти параметры:

  1. "Сумма(Ресурс)" — агрегатная функция, которую мы хотим вычислить.
  2. "Колонка" — ключевое слово, указывающее, что вычисление должно производиться по всем группировкам колонок.
  3. "ОбщийИтог" — область анализа. Именно этот параметр заставляет СКД брать значение не из текущего контекста ячейки, а из итогового значения по всей горизонтали.

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

Использование имен группировок для точного позиционирования

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

  1. Перейдем в настройки схемы компоновки данных на вкладку "Настройки".
  2. Выберем группировку строк (например, по полю "Номенклатура").
  3. В нижней части экрана в свойствах группировки найдем поле "Имя" и зададим его, например, ГруппировкаСтрока.
  4. Теперь в выражении ресурса мы можем обратиться к этой группировке напрямую.

Выражение ресурса будет выглядеть так:

ВычислитьВыражение("Сумма(Количество)", "ГруппировкаСтрока")

В этом случае СКД проигнорирует все вышестоящие или параллельные измерения (колонки) и вычислит сумму ресурса именно в рамках указанной строки. Это решение является наиболее стабильным.

Решение проблемы с отфильтрованными данными в колонках

Часто возникают ситуации (как в Сообщении 2), когда данные в колонках ограничены каким-либо условием (например, через вычисляемое поле или отбор в группировке), а итог в каждой колонке должен выводиться по всем данным, включая те, что не попали в визуальные колонки отчета.

Проанализируем ситуацию: если мы наложили отбор на колонки, то ВычислитьВыражение("...", "Колонка", "ОбщийИтог") может вернуть сумму только по видимым колонкам. Чтобы получить истинный итог по строке из набора данных, рассмотрим следующие приемы:

1. Использование альтернативного ресурса. Мы можем создать два поля в наборе данных. Одно будет использоваться для расчета значений в колонках (с учетом фильтров), а второе (чистое) — для расчета общего итога. В выражении ресурса для итога мы будем суммировать именно "чистое" поле.

2. Расширенный синтаксис ВычислитьВыражение. Мы можем использовать параметры "Начало" и "Конец" диапазона для охвата всех данных:


ВычислитьВыражение("Сумма(Ресурс)", "ГруппировкаКолонка", "", "Первая", "Последняя")

Сложные вычисления через массив группировок

Если задача требует предварительной агрегации данных (например, сначала получить среднее по складам, а потом сумму этих средних по строке), рассмотрим использование функции ВычислитьВыражениеСГруппировкойМассив. Это мощный инструмент, который позволяет собрать данные в массив и выполнить над ними финальную операцию.

Пример формулы:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(Количество)", "ИмяГруппировкиКолонок"))

Этот метод сначала вычисляет сумму для каждой колонки отдельно, формирует из них массив, а затем внешняя функция Сумма складывает элементы этого массива. Такой подход гарантирует, что мы работаем с результатами вычислений колонок, что полезно для сложных кросс-отчетов.

Практические советы по настройке ресурсов

При настройке подобных итогов важно помнить о вкладке "Ресурсы" в СКД. Для одного и того же поля (например, Количество) можно добавить несколько записей в таблицу ресурсов:

Это позволит гибко управлять тем, где именно будет отображаться общий итог строки — только в детальных записях колонок или также в общих итогах таблицы.

Резюме

Подведем итог. Для вывода итога по строке в каждой колонке мы проанализировали три основных пути:

  1. Простой: ВычислитьВыражение("Сумма(Поле)", "Колонка", "ОбщийИтог").
  2. Надежный (через именованные группировки): ВычислитьВыражение("Сумма(Поле)", "ИмяГруппировкиСтроки").
  3. Продвинутый (для сложных расчетов): использование ВычислитьВыражениеСГруппировкойМассив.

Выбор конкретного метода зависит от того, используются ли в вашем отчете дополнительные фильтры в группировках и какая точность данных требуется в итоговых показателях. Помните, что СКД — это мощный декларативный механизм, и правильное использование функций вычисления выражений позволяет избежать трудоемкой постобработки табличного документа программным кодом.

← На главную