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