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

Разработка и Конфигурация · 9 мин

Как считать сумму в таблице 1С

Как посчитать сумму в таблице 1С: итоги в табличной части, Сумма() в запросе, СКД, сводная таблица и цикл в коде. Пошаговые инструкции и типичные ошибки.

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

Универсального «одного правильного» способа нет. Итог по колонке в форме считается одним действием, сумма по большой таблице в базе — совсем другим, и попытка решить задачу «в лоб» циклом там, где нужен запрос, приводит к медленной работе и лишней нагрузке на сервер. Ниже разобраны основные сценарии с конкретными действиями и кодом.

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

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

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

Если вы работаете как пользователь без доступа к конфигуратору, быстрый способ — выделить нужные строки таблицы мышью с зажатой клавишей Ctrl или Shift. В строке состояния внизу окна 1С покажет сумму, количество и среднее по выделенным числовым ячейкам. Это работает в большинстве типовых форм и не требует никаких настроек.

Итог по колонке через конфигуратор
  1. 1
    Откройте форму документа в конфигураторе и выделите таблицу формы
  2. 2
    В свойствах таблицы установите «Подвал» = Истина
  3. 3
    Для колонки укажите «ПутьКДаннымПодвала» на числовой реквизит формы
  4. 4
    В модуле формы при изменении табличной части пересчитывайте итог методом Итог()
  5. 5
    Сохраните конфигурацию и проверьте на документе с несколькими строками

Сумма в таблице значений: метод Итог() и цикл

Когда данные собраны в таблицу значений (ТаблицаЗначений) в коде, есть два подхода. Первый — встроенный метод Итог("ИмяКолонки"), который возвращает сумму по числовой колонке одной строкой: ВсегоСумма = ТЗ.Итог("Сумма");. Это быстрый и предпочтительный вариант, когда нужен общий итог без группировок.

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

СуммаОтгружено = 0;

Для Каждого СтрокаТЗ Из ТЗ Цикл

Если СтрокаТЗ.Отгружено Тогда

СуммаОтгружено = СуммаОтгружено + СтрокаТЗ.Сумма;

КонецЕсли;

КонецЦикла;

Если нужны суммы по группам (по контрагентам, складам, номенклатуре), не пишите вложенные циклы — используйте метод Свернуть("Контрагент", "Сумма"). Он сгруппирует таблицу и просуммирует указанные колонки. Учтите: метод изменяет саму таблицу, поэтому при необходимости сохранить исходные данные сначала сделайте ТЗГрупп = ТЗ.Скопировать().

bsl
ТЗГрупп = ТЗ.Скопировать();
ТЗГрупп.Свернуть("Контрагент", "Сумма, Количество");
ОбщийИтог = ТЗ.Итог("Сумма");

Как посчитать сумму запросом: СУММА() и группировка

Для данных, хранящихся в базе (документы, регистры накопления и сведений), правильный инструмент — запрос с агрегатной функцией СУММА(). Это принципиально быстрее, чем выгрузить все строки в таблицу значений и суммировать циклом: расчёт выполняется на стороне СУБД, а в клиент передаётся только результат.

ВЫБРАТЬ

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

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

ИЗ

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

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

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

ИТОГИ

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

ПО ОБЩИЕ

Конструкция ИТОГИ ... ПО ОБЩИЕ добавляет в результат запроса строку общего итога. Если нужны итоги по иерархии (например, по контрагенту и в целом), укажите ИТОГИ СУММА(СуммаПродаж) ПО Контрагент, ОБЩИЕ и обходите результат методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).

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

Сумма в отчёте на СКД и в сводной таблице

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

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

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

Способы посчитать сумму

Выделение ячеек мышью

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

Метод Итог() по таблице значений

Одна строка кода для общего итога в памяти. Не работает с условиями и группировками.

Запрос с СУММА() и ИТОГИ

Оптимален для данных в базе и больших объёмов. Требует написания текста запроса и навыков работы с выборками.

Ресурсы СКД

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

Проверка результата и типичные ошибки

После настройки суммирования результат стоит проверить на контрольном примере: возьмите документ или период с 2–3 строками, посчитайте сумму вручную и сверьте с тем, что показывает 1С. Расхождение даже на копейки обычно указывает на проблему с типами данных, отборами или округлением.

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

Типичные ошибки
01
Суммирование строковой колонки: Итог() и СУММА() вернут 0 или ошибку — приведите значения к типу Число заранее
02
Игнорирование NULL в запросе: итог становится NULL и ломает дальнейшие вычисления — используйте ЕСТЬNULL()
03
Цикл по регистру вместо виртуальной таблицы оборотов: отчёт работает минутами вместо секунд
04
Свернуть() по исходной таблице без копии: теряются детальные строки, которые нужны дальше по алгоритму
05
Неверный период в параметрах оборотов: сумма «не сходится» с обороткой из-за границы дат, включайте конец периода с точностью до секунды
Контрольные точки

Как проверить результат

Сверка с ручным расчётом
Норма

Итог совпадает с суммой 2–3 контрольных строк

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

Расхождение даже на копейки — проверяйте отбор, период и типы

Тип колонки
Норма

Число с нужной разрядностью

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

Строка или составной тип — сумма не считается

Период запроса
Норма

Границы совпадают с отчётом-эталоном

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

Конец периода обрезает документы последнего дня

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

Как быстро посмотреть сумму нескольких ячеек без настройки формы?

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

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

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

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

Метод Итог() условий не поддерживает. Либо перебирайте строки циклом с проверкой условия, либо сначала отберите строки через НайтиСтроки() или скопируйте таблицу с отбором через Скопировать(СтруктураОтбора) и примените Итог() к результату.

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

Итог("Колонка") возвращает одно число — сумму по колонке, не меняя таблицу. Свернуть("КолонкиГрупп", "СуммируемыеКолонки") изменяет саму таблицу: группирует строки и складывает значения, на выходе — сгруппированная таблица, а не число.

Почему итог в отчёте СКД пустой, хотя строки есть?

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

Как посчитать сумму по документам за период без отчёта?

Сделайте запрос к таблице документа с отбором ГДЕ Дата МЕЖДУ &Начало И &Конец и функцией СУММА() по нужному реквизиту. Если сумма хранится в табличной части, соединяйте с ней или суммируйте по ней с группировкой по ссылке. Для документов с проведением по регистрам точнее брать обороты регистра.

Итог

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

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