Итоги в СКД: ресурсы, режимы и вычисления на примерах

· 9 мин

Содержание

Итог в системе компоновки данных считается не в запросе, а на вкладке Ресурсы схемы компоновки. Любое числовое поле, которое должно суммироваться по группировкам и в общем итоге, нужно объявить ресурсом и задать функцию агрегации — чаще всего Сумма(ИмяПоля). Без этого поле выведется построчно, но итоговых строк не будет.

Дальше всё решают два момента: по каким группировкам считать ресурс (столбец «Рассчитывать по…») и куда поставить итоговую строку (свойство группировки «Расположение»). Разберём оба, плюс проценты, нарастающий итог, условное оформление итогов и типичные причины, по которым цифры не сходятся.

Речь про платформу 8.3, интерфейс «Такси», конструктор схемы компоновки данных. Всё сказанное работает одинаково в отчётах любой конфигурации — БП, ЗУП, УТ — и во внешних отчётах.

Ресурсы и функции агрегации — с них начинается итог

Откройте схему компоновки и перейдите на вкладку Ресурсы. Слева — список доступных числовых полей из наборов данных, справа — выбранные ресурсы и выражение для каждого.

Порядок такой:

  1. Перенесите нужное поле вправо (стрелкой или двойным кликом).
  2. В столбце Выражение платформа подставит Сумма(Поле) по умолчанию.
  3. При необходимости замените функцию: Количество, Среднее, Максимум, Минимум.
  4. В столбце Рассчитывать по… оставьте пусто (итог по всем группировкам) либо выберите конкретные.

Ресурсом может быть не только поле набора данных, но и выражение: Сумма(Количество * Цена). Отдельное поле «Сумма» в запросе тогда не нужно — считайте прямо в ресурсе.

Разберём на примере. Отчёт по продажам: набор данных возвращает строки Склад, Номенклатура, Количество, Выручка. Объявляем два ресурса — Сумма(Количество) и Сумма(Выручка). В настройках ставим две группировки: сначала Склад, внутри Номенклатура. На выходе платформа сама посчитает выручку по каждой позиции, подытог по складу и общий итог внизу — всё из двух ресурсов, без единой строки кода.

Что важно понимать про агрегацию: функция в ресурсе применяется на каждом уровне группировки и в общем итоге. То есть Сумма(Выручка) в строке номенклатуры даст выручку по позиции, в строке склада — сумму по складу, а в подвале отчёта — общий итог. Вам не нужно писать это трижды, достаточно одного ресурса.

Где считается итог: столбец «Рассчитывать по…»

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

  • Пусто — ресурс считается на всех уровнях и в общем итоге (поведение по умолчанию).
  • Указана группировка — итог появится только на этом уровне и ниже; на остальных ячейка останется пустой.

Если количество складывается по разнородным строкам и даёт бессмысленное число — ограничьте ресурс через «Рассчитывать по…», а не прячьте колонку.

Отдельно отметим: группировки, по которым строится отчёт, задаются уже не здесь, а в пользовательских настройках — вкладка Настройки, элемент Группировки. Там вы перетаскиваете поля (Склад, Номенклатура, Период) и формируете иерархию. Ресурс сам «растечётся» по этой иерархии и посчитает итог на каждом её уровне.

Куда поставить итог: расположение строк и общие итоги

По умолчанию итог группировки выводится в подвале — строкой под детальными записями. Это меняется в двух местах.

Расположение итога конкретной группировки. В Настройки → Группировки выделите группировку и откройте её свойство Расположение. Значения:

ЗначениеЧто делает
Автоплатформа решает сама (обычно — в конце)
Началоитоговая строка над детальными записями
Конецитоговая строка под записями
Нетитог не выводится совсем
ОтдельноИВместедве строки — отдельная шапка и общий подвал

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

Если общий итог «пропал», первым делом проверьте не ресурс, а именно эти два параметра в корне настроек: чаще всего там стоит Нет.

Для таблиц (кросс-отчётов) расположение по горизонтали отвечает за итоговую колонку, по вертикали — за итоговую строку. В линейном списке горизонтальный итог роли не играет.

В кросс-таблице группировки делятся на две оси: одни попадают в строки, другие в колонки. Ресурс тогда считается на пересечении — например, выручка по складу (строки) и месяцу (колонки). Итоговая колонка справа суммирует ресурс по всем месяцам строки, итоговая строка снизу — по всем складам колонки, а правая нижняя ячейка даёт общий итог. Все три считаются из одного ресурса; руками дублировать формулу не нужно.

Вычисляемые поля, проценты и нарастающий итог

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

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

Доля строки в общем итоге (процент):

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

Здесь второй аргумент "ОбщийИтог" говорит: возьми сумму ресурса не по текущей строке, а по всему отчёту. Поле задайте как ресурс со Среднее или выводите построчно — для процентов суммировать его по группировкам смысла нет, поэтому через «Рассчитывать по…» ограничьте уровень.

Нарастающий итог (накопление сверху вниз):

ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая")

Третья–пятая позиции задают диапазон: от первой записи группировки до текущей. Получается классический running total — остаток, который растёт от строки к строке.

Для вложенных расчётов по массиву группировок есть ВычислитьВыражениеСГруппировкойМассив — она возвращает массив значений по дочерним группировкам. Применяется, когда нужно, например, найти максимум из подытогов внутри строки верхнего уровня.

Аргумент «Группировка» принимает не только "ОбщийИтог", но и имя конкретной группировки в кавычках — тогда расчёт идёт в её контексте. Пустая строка "" означает текущую группировку.

Частый случай — доля склада внутри всего отчёта и доля позиции внутри своего склада одновременно. Для первой берём "ОбщийИтог", для второй — имя группировки склада. Два вычисляемых поля с разным вторым аргументом решают задачу, не меняя запрос.

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

Функции агрегации: что выбрать под задачу

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

ФункцияЧто считаетКогда брать
Суммаскладывает значенияденьги, количество, обороты
Количествочисло записей (строк)сколько документов, позиций
Количество(Различные Поле)число уникальных значенийсколько разных контрагентов
Среднеесреднее арифметическоесредний чек, средняя цена
Максимум / Минимумкрайнее значениепоследняя дата, пиковый остаток

Две ловушки:

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

Условное оформление итоговых строк

Чтобы итог визуально отличался от детальных записей, используйте Настройки → Условное оформление. Один элемент оформления = одно правило (цвет, шрифт, рамка) + условие + область применения.

Выделить именно итоговые строки можно через Оформляемые поля и Область — в области указывается группировка, а не отдельные ячейки. Для подвала группировки задайте в области её имя; платформа применит оформление к итоговой строке этого уровня.

Шаги:

  1. Откройте Условное оформление, добавьте строку.
  2. В Оформление выберите цвет фона / жирный шрифт.
  3. В Условие при необходимости задайте правило (например, Сумма < 0 — подсветить убыток).
  4. В Оформляемые поля перечислите ресурсы, которые красим.
  5. В Область укажите нужную группировку или общий итог.

Оставите условие пустым — оформление применится всегда. Это удобно для постоянной заливки итоговых строк серым.

Тонкий момент — отличить оформление итога от оформления детальных строк. Если задать область только именем группировки, правило ляжет и на её итог, и на вложенные записи. Чтобы покрасить именно подытоговую строку, в области явно указывают уровень группировки без детальных записей; в большинстве отчётов достаточно выбрать группировку и снять флажок с её детальных записей в списке области.

Макет оформления (вкладка Макеты в схеме) нужен редко — только когда стандартного условного оформления не хватает и надо жёстко задать свой шаблон вывода группировки. Для подсветки итогов это избыточно.

Почему итог не считается или задваивается

Разберём то, что реально ломает цифры, а не пересказ шагов.

Диагностика: выберите симптом

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

Как не замедлить отчёт тяжёлыми итогами

Итоги сами по себе считаются быстро — на выборке, которую платформа уже получила. Тормозит обычно не агрегация, а объём данных и лишние вычисления.

  • Фильтруйте в запросе, а не в компоновке. Отбор по периоду и организации в тексте запроса отсекает строки до компоновки; тот же отбор в настройках забирает все строки и фильтрует их в памяти.
  • Не тащите лишние поля. Каждое поле в детальных записях — это строки в выборке. Если детали не нужны, уберите группировку «Детальные записи» и оставьте только итоговые уровни.
  • Тяжёлые вычисляемые поля — экономно. ВычислитьВыражение по общему итогу для каждой строки заставляет платформу обходить выборку повторно. На больших отчётах это заметно; выносите такие расчёты только туда, где они реально нужны.
  • Автоматическое заполнение полей в наборе данных включает в выборку всё из запроса. Снимите флажок автозаполнения и оставьте только используемые поля, если запрос возвращает много колонок.

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

Проверка перед выпуском отчёта с итогами
Выполнено: 0 / 6

Частые вопросы

Можно ли вывести итог без группировок, одной строкой?
Да. Объявите поле ресурсом и в настройках оставьте только общий итог, убрав все группировки и детальные записи. Отчёт покажет одну итоговую строку.
Почему ресурс не считается на верхнем уровне, а на нижнем — да?
В столбце «Рассчитывать по…» указана нижняя группировка. Очистите значение, чтобы ресурс считался на всех уровнях и в общем итоге.
Как посчитать процент от итога по группировке, а не по всему отчёту?
Вторым аргументом ВычислитьВыражение вместо "ОбщийИтог" укажите имя нужной группировки в кавычках. Расчёт пойдёт в её контексте.
Чем отличается Количество от Количество(Различные)?
Количество считает все записи, включая повторяющиеся значения. Количество(Различные Поле) — только уникальные. Для подсчёта разных контрагентов или номенклатуры нужен второй вариант.
Как сделать нарастающий итог по строкам?
Вычисляемым полем с выражением ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая") — оно накапливает значение от первой записи группировки до текущей.