К статье
Практический материал

Отчеты и Аналитика · 9 мин

Как суммировать значения в 1С: практическое руководство

Как суммировать значения в 1С: итоги в таблицах, запросы с СУММА, функция Сумма в СКД, сводные таблицы и типовые отчёты. Пошаговые инструкции и примеры кода.

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

Ошибки при суммировании приводят к неверным итогам в отчётах и расхождениям в учёте. Типичные причины: суммирование строк вместо чисел, двойной подсчёт из-за дублирующихся строк в соединении, игнорирование отборов по периоду и организации.

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

Быстрое суммирование в пользовательском режиме

Если нужно просто посмотреть сумму по колонке в списке документов или табличной части, не открывая конфигуратор, выделите нужные ячейки с зажатой клавишей Ctrl или Shift. В строке состояния (внизу окна) платформа покажет сумму выделенных числовых значений. Если строка состояния скрыта, включите её через меню «Вид».

Во многих типовых конфигурациях для динамических списков и табличных частей доступна команда вывода итогов — обычно она находится в меню «Ещё» и называется «Итоги» или «Показать итоги». После включения под таблицей появляется строка с суммами по числовым колонкам.

Для регулярного анализа лучше использовать типовые отчёты: «Оборотно-сальдовая ведомость», «Анализ счёта», отчёты по продажам и складским остаткам. Они уже содержат корректные итоги с учётом отборов и не требуют ручного суммирования.

Суммирование в запросе: функция СУММА

Основной инструмент суммирования при разработке — агрегатная функция СУММА в языке запросов. Она складывает значения числового поля по группе строк. Обязательное условие: все неагрегатные поля в выборке должны быть перечислены в предложении СГРУППИРОВАТЬ ПО.

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

СУММА(Продажи.Количество) КАК Количество,

СУММА(Продажи.Сумма) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура

Функция СУММА игнорирует значения NULL, но если все значения в группе NULL, результат тоже будет NULL. Чтобы получить ноль вместо NULL, оберните выражение в ЕСТЬNULL: СУММА(ЕСТЬNULL(Поле, 0)) или ЕСТЬNULL(СУММА(Поле), 0).

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

Суммирование таблицы значений в коде

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

Второй — метод Свернуть("КолонкаГруппировки", "СуммируемыеКолонки"). Он физически сворачивает таблицу: строки с одинаковыми значениями в колонках группировки объединяются, а числовые колонки суммируются. Учтите, что метод изменяет исходную таблицу — при необходимости сохраните копию через Скопировать().

// Сумма по одной колонке без изменения таблицы

ИтогоПоДокументу = ТаблицаТоваров.Итог("Сумма");

// Свёртка копии таблицы по контрагентам

Свод = ТаблицаТоваров.Скопировать();

Свод.Свернуть("Контрагент", "Сумма, Количество");

Для табличной части документа логика та же: Товары.Итог("Сумма") вернёт сумму по колонке. Именно так в типовых модулях рассчитывается «Сумма документа» — не перебором строк в цикле, а вызовом Итог(), что быстрее и надёжнее.

Типичные ошибки
01
Суммирование строкового поля вместо числового: результат — ошибка приведения типов или ноль. Проверяйте тип колонки
02
Использование Свернуть() на исходной таблице, которая ещё нужна в развёрнутом виде: данные теряются безвозвратно
03
Суммирование в цикле с обращением к базе на каждой итерации: медленно и создаёт лишнюю нагрузку

Сумма в отчётах на СКД

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

Если ресурс не добавлен, итоги по группировкам не считаются — это частая причина «пустых» итогов в отчёте. Для расчёта по части группировок в выражении ресурса можно указать параметр: Сумма(Сумма), по умолчанию расчёт идёт по всем группировкам.

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

Сравнение способов суммирования

СУММА в запросе

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

Итог() / Свернуть()

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

Ресурсы СКД

Лучший вариант для отчётов: итоги по группировкам считаются автоматически, пользователь может менять структуру отчёта

Итоги в пользовательском режиме

Быстрая разовая проверка без доработок, но не подходит для регламентных расчётов

Особые случаи: итоги по регистрам и по условию

Для регистров накопления не суммируйте таблицу движений вручную — используйте виртуальные таблицы Обороты и Остатки. Они считают итоги на стороне СУБД с учётом периода и отборов, что на больших объёмах быстрее в разы, чем выборка всех записей и суммирование в коде.

Суммирование по условию в запросе выполняется через ВЫБОР КОГДА: например, СУММА(ВЫБОР КОГДА ВидОперации = &Продажа ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ). Это позволяет в одном запросе получить несколько сумм по разным условиям без соединений.

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

Как проверить корректность суммы
  1. 1
    Сформируйте типовой отчёт за тот же период с теми же отборами и запомните итог
  2. 2
    Сравните с итогом своего запроса или свёртки — значения должны совпасть
  3. 3
    Проверьте граничные случаи: пустой период, отбор без данных — сумма должна быть 0, а не NULL
  4. 4
    Убедитесь, что в соединениях нет дублей: количество строк до суммирования соответствует ожиданиям

Производительность и ограничения

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

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

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

Контрольные точки

Как отличить корректный результат

Совпадение с типовым отчётом
Норма

Суммы равны при тех же отборах и периоде

Тревожный признак

Расхождение — ищите дубли в соединениях или разницу в отборах

Пустая выборка
Норма

Результат 0 или NULL, обработанный через ЕСТЬNULL

Тревожный признак

Ошибка исполнения или неинициализированная переменная

Тип итога
Норма

Число с нужной точностью

Тревожный признак

Строка или округление не по правилам конфигурации

Частые вопросы о суммировании в 1С

Как посчитать сумму колонки в табличной части документа?

Используйте метод Итог(): Объект.Товары.Итог("Сумма"). Он работает и на клиенте, и на сервере, не требует запроса и возвращает сумму по всем строкам табличной части. Для пересчёта при изменении строки вызывайте его в обработчике ПриИзменении.

Почему СУММА в запросе возвращает NULL?

Если группировка не нашла ни одной строки с непустым значением, результат — NULL. Оберните выражение в ЕСТЬNULL(СУММА(Поле), 0) либо обработайте NULL в коде после выборки. Также проверьте, не отсекает ли отбор все записи.

Как суммировать только часть строк таблицы значений?

Сначала отберите строки методом НайтиСтроки() с параметрами отбора, затем пройдите по полученному массиву в цикле и накопите сумму. Альтернатива — скопировать отобранные строки в новую таблицу и вызвать у неё Итог().

Чем отличается Итог() от Свернуть()?

Итог() только возвращает сумму по колонке, не меняя таблицу. Свернуть() изменяет саму таблицу: объединяет одинаковые строки и суммирует указанные колонки, удаляя остальные. Используйте Итог() для разовой цифры, Свернуть() — когда нужна свёрнутая таблица для дальнейшей работы.

Как вывести итоги по группам в отчёте на СКД?

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

Почему сумма в моём запросе больше, чем в типовом отчёте?

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

Итог

Что важно запомнить

Для данных в базе используйте СУММА в запросе с группировкой, для таблиц в памяти — Итог() и Свернуть(), для отчётов — ресурсы СКД. Всегда проверяйте результат сверкой с типовым отчётом, обрабатывайте NULL через ЕСТЬNULL и следите за дублями в соединениях.