Как в СКД вывести раздельные итоги по положительным и отрицательным значениям?

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

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

Способ 1. Использование выражений в ресурсах

Проанализируем самый лаконичный метод, который не требует изменения структуры запроса или создания лишних вычисляемых полей. Мы можем настроить логику суммирования непосредственно на закладке «Ресурсы» в схеме компоновки данных. Рассмотрим пошагово, как это сделать:

  1. Перейдем на вкладку «Ресурсы».
  2. Добавим наше поле (например, СуммаОтклонения) в список ресурсов дважды.
  3. Для первого вхождения в колонке «Выражение» пропишем формулу для подсчета только положительных значений: Сумма(Выбор Когда СуммаОтклонения > 0 Тогда СуммаОтклонения Иначе 0 Конец)
  4. Для второго вхождения пропишем аналогичную формулу для отрицательных значений: Сумма(Выбор Когда СуммаОтклонения < 0 Тогда СуммаОтклонения Иначе 0 Конец)
  5. Чтобы эти ресурсы не загромождали детальные записи (строки отчета), в колонке «Рассчитывать по...» выберем только те уровни группировок, где нам нужны эти итоги (например, «Общий итог» или конкретная иерархия).

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

Способ 2. Вычисляемые поля и технические группировки

Разберем решение, к которому пришел автор темы. Оно заключается в физическом разделении данных на уровне компоновки. Этот метод особенно полезен, если вы хотите визуально отделить блоки «Экономия» и «Перерасход» друг от друга.

Для реализации выполним следующие действия:

  1. На закладке «Вычисляемые поля» создадим два поля: ИтогПоложительный и ИтогОтрицательный.
  2. В выражении поля ИтогПоложительный укажем: ВЫБОР КОГДА Сумма > 0 ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ.
  3. В выражении поля ИтогОтрицательный укажем: ВЫБОР КОГДА Сумма < 0 ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ.
  4. Добавим эти поля в Ресурсы со стандартной функцией Сумма().
  5. В настройках отчета (закладка «Настройки») добавим две группировки. В одной установим отбор «Положительные», в другой — «Отрицательные».

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

Способ 3. Комбинированный итог в одной ячейке через макет

Выясним, как добиться максимальной эстетики, если заказчик требует, чтобы в подвале отчета под одной колонкой выводилось сразу несколько цифр (например, «Итого +, Итого -, Сальдо»). Для этого нам понадобится работа с Макетами.

Рассмотрим алгоритм настройки макета оформления итогов:

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

В области макета мы можем нарисовать ячейку и вписать в неё параметры. Пример текста в ячейке макета может выглядеть так:

Экономия: [ВсегоПлюс] | Перерасход: [ВсегоМинус]

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

Способ 4. Современные функции СКД (ВычислитьВыражениеСГруппировкойМассив)

Посмотрим на более продвинутый программный метод, который актуален для сложных отчетов с множеством связанных наборов данных, где обычное СУММА(ВЫБОР...) может работать некорректно из-за дублирования записей (Join-эффект).

Мы можем использовать агрегатную функцию ВычислитьВыражениеСГруппировкойМассив в выражении ресурса. Попробуем проанализировать пример такого выражения:


Сумма(Отфильтровать(ВычислитьВыражениеСГруппировкойМассив("Сумма", "Номенклатура"), "Значение > 0"))

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

Важные рекомендации по оформлению

Чтобы отчет не выглядел «дешево» (как выразился автор темы), рекомендуем использовать Условное оформление:

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

← На главную