Отчеты и Аналитика · 9 мин
Как суммировать значения в 1С: практическое руководство
Как суммировать значения в 1С: итоги в таблицах, запросы с СУММА, функция Сумма в СКД, сводные таблицы и типовые отчёты. Пошаговые инструкции и примеры кода.
Суммирование значений — одна из самых частых задач в 1С: нужно посчитать итог по документу, вывести сумму продаж за период, свернуть таблицу значений или получить итог в отчёте. В зависимости от того, где вы работаете — в пользовательском режиме, в запросе, в коде или в СКД — применяются разные инструменты, и у каждого есть свои ограничения.
Ошибки при суммировании приводят к неверным итогам в отчётах и расхождениям в учёте. Типичные причины: суммирование строк вместо чисел, двойной подсчёт из-за дублирующихся строк в соединении, игнорирование отборов по периоду и организации.
Ниже разобраны основные способы суммирования: от простого подсчёта выделенных ячеек до агрегатных функций в запросах и свёртки таблиц значений в коде. Для каждого способа указано, когда он подходит и на что обратить внимание.
Быстрое суммирование в пользовательском режиме
Если нужно просто посмотреть сумму по колонке в списке документов или табличной части, не открывая конфигуратор, выделите нужные ячейки с зажатой клавишей Ctrl или Shift. В строке состояния (внизу окна) платформа покажет сумму выделенных числовых значений. Если строка состояния скрыта, включите её через меню «Вид».
Во многих типовых конфигурациях для динамических списков и табличных частей доступна команда вывода итогов — обычно она находится в меню «Ещё» и называется «Итоги» или «Показать итоги». После включения под таблицей появляется строка с суммами по числовым колонкам.
Для регулярного анализа лучше использовать типовые отчёты: «Оборотно-сальдовая ведомость», «Анализ счёта», отчёты по продажам и складским остаткам. Они уже содержат корректные итоги с учётом отборов и не требуют ручного суммирования.
Суммирование в запросе: функция СУММА
Основной инструмент суммирования при разработке — агрегатная функция СУММА в языке запросов. Она складывает значения числового поля по группе строк. Обязательное условие: все неагрегатные поля в выборке должны быть перечислены в предложении СГРУППИРОВАТЬ ПО.
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
СУММА(Продажи.Количество) КАК Количество,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура
Функция СУММА игнорирует значения NULL, но если все значения в группе NULL, результат тоже будет NULL. Чтобы получить ноль вместо NULL, оберните выражение в ЕСТЬNULL: СУММА(ЕСТЬNULL(Поле, 0)) или ЕСТЬNULL(СУММА(Поле), 0).
Для получения общих итогов и итогов по иерархии используйте предложение ИТОГИ ПО. Оно добавляет в результат запроса строки с промежуточными суммами, которые удобно обходить в коде через ВыборкаИзГруппировки.
Суммирование таблицы значений в коде
Когда данные уже собраны в таблицу значений, применяются два подхода. Первый — метод Итог("ИмяКолонки"), который возвращает сумму по колонке без изменения таблицы. Он подходит, когда нужна одна итоговая цифра.
Второй — метод Свернуть("КолонкаГруппировки", "СуммируемыеКолонки"). Он физически сворачивает таблицу: строки с одинаковыми значениями в колонках группировки объединяются, а числовые колонки суммируются. Учтите, что метод изменяет исходную таблицу — при необходимости сохраните копию через Скопировать().
// Сумма по одной колонке без изменения таблицы
ИтогоПоДокументу = ТаблицаТоваров.Итог("Сумма");
// Свёртка копии таблицы по контрагентам
Свод = ТаблицаТоваров.Скопировать();
Свод.Свернуть("Контрагент", "Сумма, Количество");
Для табличной части документа логика та же: Товары.Итог("Сумма") вернёт сумму по колонке. Именно так в типовых модулях рассчитывается «Сумма документа» — не перебором строк в цикле, а вызовом Итог(), что быстрее и надёжнее.
Сумма в отчётах на СКД
В системе компоновки данных суммирование настраивается без кода. На закладке «Ресурсы» конструктора СКД добавьте поле, например Сумма, и укажите выражение Сумма(Сумма). После этого ресурс автоматически суммируется по любым группировкам отчёта и выводит общий итог.
Если ресурс не добавлен, итоги по группировкам не считаются — это частая причина «пустых» итогов в отчёте. Для расчёта по части группировок в выражении ресурса можно указать параметр: Сумма(Сумма), по умолчанию расчёт идёт по всем группировкам.
Для нестандартных итогов, например суммы только по проведённым документам, корректнее фильтровать данные в самом запросе набора данных, а не пытаться «вычесть» лишнее на уровне ресурса.
Сравнение способов суммирования
Оптимально для данных из базы: быстро, сразу с группировкой. Требует знания языка запросов
Подходит для таблиц значений, уже загруженных в память. Не тянет данные из базы, но расходует память на больших таблицах
Лучший вариант для отчётов: итоги по группировкам считаются автоматически, пользователь может менять структуру отчёта
Быстрая разовая проверка без доработок, но не подходит для регламентных расчётов
Особые случаи: итоги по регистрам и по условию
Для регистров накопления не суммируйте таблицу движений вручную — используйте виртуальные таблицы Обороты и Остатки. Они считают итоги на стороне СУБД с учётом периода и отборов, что на больших объёмах быстрее в разы, чем выборка всех записей и суммирование в коде.
Суммирование по условию в запросе выполняется через ВЫБОР КОГДА: например, СУММА(ВЫБОР КОГДА ВидОперации = &Продажа ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ). Это позволяет в одном запросе получить несколько сумм по разным условиям без соединений.
При работе с валютными суммами суммируйте каждую валюту отдельно или предварительно пересчитывайте в валюту учёта по курсу. Сложение сумм в разных валютах «в лоб» — грубая ошибка, ведущая к искажению отчётности.
- 1Сформируйте типовой отчёт за тот же период с теми же отборами и запомните итог
- 2Сравните с итогом своего запроса или свёртки — значения должны совпасть
- 3Проверьте граничные случаи: пустой период, отбор без данных — сумма должна быть 0, а не NULL
- 4Убедитесь, что в соединениях нет дублей: количество строк до суммирования соответствует ожиданиям
Производительность и ограничения
Суммирование на уровне запроса почти всегда быстрее, чем выгрузка данных и подсчёт в цикле. Цикл с накоплением переменной оправдан только при сложной логике на строку, которую нельзя выразить в запросе, либо при обработке данных, не хранящихся в базе.
У метода Свернуть есть ограничение: он складывает только числовые колонки, а колонки, не указанные ни в группировках, ни в суммируемых, удаляются из таблицы. Планируйте структуру таблицы заранее.
На очень больших выборках итоги по регистрам могут рассчитываться заметно дольше, если отключено хранение итогов или период не закрыт. В таких случаях проверьте настройки итогов регистра в разделе администрирования.
Как отличить корректный результат
Суммы равны при тех же отборах и периоде
Расхождение — ищите дубли в соединениях или разницу в отборах
Результат 0 или NULL, обработанный через ЕСТЬNULL
Ошибка исполнения или неинициализированная переменная
Число с нужной точностью
Строка или округление не по правилам конфигурации
Частые вопросы о суммировании в 1С
Как посчитать сумму колонки в табличной части документа?
Используйте метод Итог(): Объект.Товары.Итог("Сумма"). Он работает и на клиенте, и на сервере, не требует запроса и возвращает сумму по всем строкам табличной части. Для пересчёта при изменении строки вызывайте его в обработчике ПриИзменении.
Почему СУММА в запросе возвращает NULL?
Если группировка не нашла ни одной строки с непустым значением, результат — NULL. Оберните выражение в ЕСТЬNULL(СУММА(Поле), 0) либо обработайте NULL в коде после выборки. Также проверьте, не отсекает ли отбор все записи.
Как суммировать только часть строк таблицы значений?
Сначала отберите строки методом НайтиСтроки() с параметрами отбора, затем пройдите по полученному массиву в цикле и накопите сумму. Альтернатива — скопировать отобранные строки в новую таблицу и вызвать у неё Итог().
Чем отличается Итог() от Свернуть()?
Итог() только возвращает сумму по колонке, не меняя таблицу. Свернуть() изменяет саму таблицу: объединяет одинаковые строки и суммирует указанные колонки, удаляя остальные. Используйте Итог() для разовой цифры, Свернуть() — когда нужна свёрнутая таблица для дальнейшей работы.
Как вывести итоги по группам в отчёте на СКД?
Добавьте поле на закладку «Ресурсы» с выражением Сумма(Поле) и создайте группировку в настройках отчёта. СКД автоматически посчитает сумму на каждом уровне группировки и общий итог. Если итогов нет — чаще всего ресурс просто не добавлен.
Почему сумма в моём запросе больше, чем в типовом отчёте?
Наиболее вероятная причина — дублирование строк при соединении таблиц: если к строке присоединяется несколько строк из другой таблицы, её сумма учитывается многократно. Сверните каждую таблицу во временные таблицы до соединения и сравните результат снова.
Что важно запомнить
Для данных в базе используйте СУММА в запросе с группировкой, для таблиц в памяти — Итог() и Свернуть(), для отчётов — ресурсы СКД. Всегда проверяйте результат сверкой с типовым отчётом, обрабатывайте NULL через ЕСТЬNULL и следите за дублями в соединениях.