Итоги в СКД: ресурсы, режимы и вычисления на примерах
Содержание
Итог в системе компоновки данных считается не в запросе, а на вкладке Ресурсы схемы компоновки. Любое числовое поле, которое должно суммироваться по группировкам и в общем итоге, нужно объявить ресурсом и задать функцию агрегации — чаще всего Сумма(ИмяПоля). Без этого поле выведется построчно, но итоговых строк не будет.
Дальше всё решают два момента: по каким группировкам считать ресурс (столбец «Рассчитывать по…») и куда поставить итоговую строку (свойство группировки «Расположение»). Разберём оба, плюс проценты, нарастающий итог, условное оформление итогов и типичные причины, по которым цифры не сходятся.
Речь про платформу 8.3, интерфейс «Такси», конструктор схемы компоновки данных. Всё сказанное работает одинаково в отчётах любой конфигурации — БП, ЗУП, УТ — и во внешних отчётах.
Ресурсы и функции агрегации — с них начинается итог
Откройте схему компоновки и перейдите на вкладку Ресурсы. Слева — список доступных числовых полей из наборов данных, справа — выбранные ресурсы и выражение для каждого.
Порядок такой:
- Перенесите нужное поле вправо (стрелкой или двойным кликом).
- В столбце Выражение платформа подставит
Сумма(Поле)по умолчанию. - При необходимости замените функцию:
Количество,Среднее,Максимум,Минимум. - В столбце Рассчитывать по… оставьте пусто (итог по всем группировкам) либо выберите конкретные.
Ресурсом может быть не только поле набора данных, но и выражение: Сумма(Количество * Цена). Отдельное поле «Сумма» в запросе тогда не нужно — считайте прямо в ресурсе.
Разберём на примере. Отчёт по продажам: набор данных возвращает строки Склад, Номенклатура, Количество, Выручка. Объявляем два ресурса — Сумма(Количество) и Сумма(Выручка). В настройках ставим две группировки: сначала Склад, внутри Номенклатура. На выходе платформа сама посчитает выручку по каждой позиции, подытог по складу и общий итог внизу — всё из двух ресурсов, без единой строки кода.
Что важно понимать про агрегацию: функция в ресурсе применяется на каждом уровне группировки и в общем итоге. То есть Сумма(Выручка) в строке номенклатуры даст выручку по позиции, в строке склада — сумму по складу, а в подвале отчёта — общий итог. Вам не нужно писать это трижды, достаточно одного ресурса.
Где считается итог: столбец «Рассчитывать по…»
Этот столбец ограничивает, на каких группировках ресурс вообще появляется. Типичный сценарий — количество считать по товарам, но не суммировать его по складам, где лежат разные единицы измерения.
- Пусто — ресурс считается на всех уровнях и в общем итоге (поведение по умолчанию).
- Указана группировка — итог появится только на этом уровне и ниже; на остальных ячейка останется пустой.
Если количество складывается по разнородным строкам и даёт бессмысленное число — ограничьте ресурс через «Рассчитывать по…», а не прячьте колонку.
Отдельно отметим: группировки, по которым строится отчёт, задаются уже не здесь, а в пользовательских настройках — вкладка Настройки, элемент Группировки. Там вы перетаскиваете поля (Склад, Номенклатура, Период) и формируете иерархию. Ресурс сам «растечётся» по этой иерархии и посчитает итог на каждом её уровне.
Куда поставить итог: расположение строк и общие итоги
По умолчанию итог группировки выводится в подвале — строкой под детальными записями. Это меняется в двух местах.
Расположение итога конкретной группировки. В Настройки → Группировки выделите группировку и откройте её свойство Расположение. Значения:
| Значение | Что делает |
|---|---|
Авто | платформа решает сама (обычно — в конце) |
Начало | итоговая строка над детальными записями |
Конец | итоговая строка под записями |
Нет | итог не выводится совсем |
ОтдельноИВместе | две строки — отдельная шапка и общий подвал |
Общие итоги отчёта. В корне настроек (самый верхний элемент дерева, «Отчёт») есть параметры Расположение общих итогов по вертикали и по горизонтали. Значения те же — Начало, Конец, Нет. Поставьте Нет по горизонтали, если итоговая колонка справа в таблице не нужна.
Если общий итог «пропал», первым делом проверьте не ресурс, а именно эти два параметра в корне настроек: чаще всего там стоит Нет.
Для таблиц (кросс-отчётов) расположение по горизонтали отвечает за итоговую колонку, по вертикали — за итоговую строку. В линейном списке горизонтальный итог роли не играет.
В кросс-таблице группировки делятся на две оси: одни попадают в строки, другие в колонки. Ресурс тогда считается на пересечении — например, выручка по складу (строки) и месяцу (колонки). Итоговая колонка справа суммирует ресурс по всем месяцам строки, итоговая строка снизу — по всем складам колонки, а правая нижняя ячейка даёт общий итог. Все три считаются из одного ресурса; руками дублировать формулу не нужно.
Вычисляемые поля, проценты и нарастающий итог
Простого Сумма() хватает не всегда. Доля в общем итоге, процент выполнения, накопленный остаток — всё это считается через вычисляемые поля и функцию ВычислитьВыражение.
Вычисляемое поле добавляется на одноимённой вкладке схемы. Оно живёт на уровне строки, но внутри может обращаться к итогам соседних уровней.
Доля строки в общем итоге (процент):
Сумма / ВычислитьВыражение("Сумма(Сумма)", "ОбщийИтог") * 100
Здесь второй аргумент "ОбщийИтог" говорит: возьми сумму ресурса не по текущей строке, а по всему отчёту. Поле задайте как ресурс со Среднее или выводите построчно — для процентов суммировать его по группировкам смысла нет, поэтому через «Рассчитывать по…» ограничьте уровень.
Нарастающий итог (накопление сверху вниз):
ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая")
Третья–пятая позиции задают диапазон: от первой записи группировки до текущей. Получается классический running total — остаток, который растёт от строки к строке.
Для вложенных расчётов по массиву группировок есть ВычислитьВыражениеСГруппировкойМассив — она возвращает массив значений по дочерним группировкам. Применяется, когда нужно, например, найти максимум из подытогов внутри строки верхнего уровня.
Аргумент «Группировка» принимает не только "ОбщийИтог", но и имя конкретной группировки в кавычках — тогда расчёт идёт в её контексте. Пустая строка "" означает текущую группировку.
Частый случай — доля склада внутри всего отчёта и доля позиции внутри своего склада одновременно. Для первой берём "ОбщийИтог", для второй — имя группировки склада. Два вычисляемых поля с разным вторым аргументом решают задачу, не меняя запрос.
Ещё одна практическая функция — Вычислить (устаревший аналог) и уже упомянутая ВычислитьВыражение: они работают только в контексте компоновки, в теле отчёта на языке 1С их нет. Поэтому все нестандартные итоги — проценты, доли, накопления, ранги — живут в вычисляемых полях схемы, а не в коде модуля.
Функции агрегации: что выбрать под задачу
Пять базовых функций закрывают почти все отчёты. Разница — в том, что происходит при переходе на верхний уровень группировки.
| Функция | Что считает | Когда брать |
|---|---|---|
Сумма | складывает значения | деньги, количество, обороты |
Количество | число записей (строк) | сколько документов, позиций |
Количество(Различные Поле) | число уникальных значений | сколько разных контрагентов |
Среднее | среднее арифметическое | средний чек, средняя цена |
Максимум / Минимум | крайнее значение | последняя дата, пиковый остаток |
Две ловушки:
- Среднее от средних.
Среднее(Цена)на уровне склада даст среднее по позициям склада, а в общем итоге — среднее по складам, а не по всем позициям. Если нужно честное среднее по всей выборке, считайтеСумма(Выручка) / Сумма(Количество)вычисляемым полем, а не функциейСреднее. - Количество против Количество(Различные). Обычное
Количествопосчитает все строки, включая повторы. Для «сколько уникальных клиентов» обязательноКоличество(Различные Контрагент).
Условное оформление итоговых строк
Чтобы итог визуально отличался от детальных записей, используйте Настройки → Условное оформление. Один элемент оформления = одно правило (цвет, шрифт, рамка) + условие + область применения.
Выделить именно итоговые строки можно через Оформляемые поля и Область — в области указывается группировка, а не отдельные ячейки. Для подвала группировки задайте в области её имя; платформа применит оформление к итоговой строке этого уровня.
Шаги:
- Откройте Условное оформление, добавьте строку.
- В Оформление выберите цвет фона / жирный шрифт.
- В Условие при необходимости задайте правило (например,
Сумма < 0— подсветить убыток). - В Оформляемые поля перечислите ресурсы, которые красим.
- В Область укажите нужную группировку или общий итог.
Оставите условие пустым — оформление применится всегда. Это удобно для постоянной заливки итоговых строк серым.
Тонкий момент — отличить оформление итога от оформления детальных строк. Если задать область только именем группировки, правило ляжет и на её итог, и на вложенные записи. Чтобы покрасить именно подытоговую строку, в области явно указывают уровень группировки без детальных записей; в большинстве отчётов достаточно выбрать группировку и снять флажок с её детальных записей в списке области.
Макет оформления (вкладка Макеты в схеме) нужен редко — только когда стандартного условного оформления не хватает и надо жёстко задать свой шаблон вывода группировки. Для подсветки итогов это избыточно.
Почему итог не считается или задваивается
Разберём то, что реально ломает цифры, а не пересказ шагов.
Сумма.Нет. Поставьте Конец.ВычислитьВыражение не указан контекст. Второй аргумент должен быть "ОбщийИтог" или имя нужной группировки.Отдельно про соединения наборов данных: самая частая причина завышенных итогов — связь, которая размножает строки. Сумма при этом умножается на число дублей. Лечится либо группировкой в запросе до компоновки, либо правильной настройкой связи «один ко многим» между наборами.
Как не замедлить отчёт тяжёлыми итогами
Итоги сами по себе считаются быстро — на выборке, которую платформа уже получила. Тормозит обычно не агрегация, а объём данных и лишние вычисления.
- Фильтруйте в запросе, а не в компоновке. Отбор по периоду и организации в тексте запроса отсекает строки до компоновки; тот же отбор в настройках забирает все строки и фильтрует их в памяти.
- Не тащите лишние поля. Каждое поле в детальных записях — это строки в выборке. Если детали не нужны, уберите группировку «Детальные записи» и оставьте только итоговые уровни.
- Тяжёлые вычисляемые поля — экономно.
ВычислитьВыражениепо общему итогу для каждой строки заставляет платформу обходить выборку повторно. На больших отчётах это заметно; выносите такие расчёты только туда, где они реально нужны. - Автоматическое заполнение полей в наборе данных включает в выборку всё из запроса. Снимите флажок автозаполнения и оставьте только используемые поля, если запрос возвращает много колонок.
Прежде чем оптимизировать компоновку, замерьте запрос отдельно в консоли запросов. Если медленный он — никакие настройки итогов не помогут, проблема в индексах и соединениях.
Частые вопросы
Можно ли вывести итог без группировок, одной строкой?
Почему ресурс не считается на верхнем уровне, а на нижнем — да?
Как посчитать процент от итога по группировке, а не по всему отчёту?
ВычислитьВыражение вместо "ОбщийИтог" укажите имя нужной группировки в кавычках. Расчёт пойдёт в её контексте.Чем отличается Количество от Количество(Различные)?
Количество считает все записи, включая повторяющиеся значения. Количество(Различные Поле) — только уникальные. Для подсчёта разных контрагентов или номенклатуры нужен второй вариант.Как сделать нарастающий итог по строкам?
ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая") — оно накапливает значение от первой записи группировки до текущей.