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

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

Как в 1С посчитать сумму по строке

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

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

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

Что значит «сумма по строке» в контексте 1С

Под «суммой по строке» обычно понимают одну из трёх задач. Первая — агрегирование: для каждого значения группировки (контрагент, товар, склад) посчитать сумму числового поля, то есть получить по одной строке-итогу на каждое значение. Вторая — суммирование по горизонтали, когда в одной строке несколько числовых колонок и нужно вывести их общий итог, например Сумма = Количество × Цена. Третья — итог по колонке табличной части документа, который пользователь видит в подвале формы.

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

Маршрут решения

Как выбрать способ

Данные в регистрах или документах, нужен отчётИспользуйте запрос с СУММА() и СГРУППИРОВАТЬ ПО или СКД с ресурсами
Нужен итог по колонке табличной части документаИспользуйте метод Итог("ИмяКолонки") или автоматический итог на форме
Данные уже в таблице значений в кодеСверните таблицу методом Свернуть() или пройдите циклом с накоплением
Нужна сумма нескольких колонок в одной строкеИспользуйте выражение Кол1 + Кол2 + Кол3 в запросе или вычисляемое поле в СКД

Сумма по строкам в запросе: СУММА и группировка

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

ВЫБРАТЬ

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

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

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

ИЗ

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

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

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

Ключевое правило: все поля в списке выборки либо должны входить в группировку, либо быть обёрнуты в агрегатную функцию (СУММА, МАКСИМУМ, КОЛИЧЕСТВО и т.д.). Если добавить поле без группировки и без агрегата, запрос вернёт ошибку. Если забыть группировку совсем — получите одну строку с общим итогом по всей выборке.

Для виртуальных таблиц оборотов и остатков суммирование часто можно упростить: поля-ресурсы уже имеют варианты с суффиксом «Оборот» (СуммаОборот, КоличествоОборот), и их достаточно просуммировать. При работе с таблицей движений документов (физической таблицей регистра) суммируют сам ресурс, но тогда важно отдельно учесть период и вид движения, иначе результат будет неверным.

Горизонтальная сумма: сложить несколько колонок в строке

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

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Товары.Сумма + Товары.СуммаНДС КАК СуммаСНДС

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка = &Ссылка

Подводный камень — значения NULL. Если хотя бы одно из слагаемых равно NULL (например, поле не заполнено после левого соединения), вся сумма станет NULL. Защититесь функцией ЕСТЬNULL: ЕСТЬNULL(Товары.Сумма, 0) + ЕСТЬNULL(Товары.СуммаНДС, 0). Это особенно актуально при соединениях таблиц, где для части строк нет соответствия.

Та же логика работает и в вычисляемых полях СКД: на закладке «Вычисляемые поля» создайте поле с выражением Сумма + СуммаНДС и выведите его в настройки отчёта.

Сумма по строке в СКД: ресурсы и итоги

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

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

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

Сумма колонки табличной части документа

Для табличной части документа итог по колонке в коде получают методом Итог(). Например, сумма по всем строкам товаров документа:

СуммаДокумента = Объект.Товары.Итог("Сумма");

На управляемой форме итог по колонке можно показать без кода: у элемента таблицы формы включите свойство «Отображать в подвале» (FooterVisible), а у колонки — «Отображать итог в подвале». Платформа сама пересчитает итог при редактировании строк. Это предпочтительный способ для форм: он не требует программного вмешательства и не ломается при изменении данных.

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

СуммаПоСкладу = 0;

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если СтрокаТовары.Склад = ОтборСклад Тогда

СуммаПоСкладу = СуммаПоСкладу + СтрокаТовары.Сумма;

КонецЕсли;

КонецЦикла;

Порядок действий для суммы по строкам в запросе
  1. 1
    Определите поле группировки (по чему сворачиваем) и поле суммирования (что считаем)
  2. 2
    Напишите запрос: поле группировки в выборку и в СГРУППИРОВАТЬ ПО, числовое поле оберните в СУММА()
  3. 3
    Добавьте отбор через ГДЕ или параметры виртуальной таблицы, чтобы не суммировать лишнее
  4. 4
    Оберните слагаемые в ЕСТЬNULL, если возможны пустые значения
  5. 5
    Проверьте результат: сверьте общий итог с отчётом-эталоном или с суммой детальных записей

Суммирование в макете и печатной форме

В табличном документе (макете) суммы по строкам обычно вычисляют заранее в коде и выводят готовым параметром. Но есть и встроенный механизм: если область макета содержит ячейки с числовыми значениями, можно воспользоваться свойством области или вычислить сумму программно, перебирая строки табличного документа через Область(НомерСтроки, НомерКолонки).Текст с преобразованием в число.

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

Избегайте суммирования по тексту ячеек табличного документа: форматирование (разделители разрядов, пробелы, символ валюты) может привести к ошибкам преобразования в число или к молчаливому получению нуля.

Типичные ошибки и как их найти

Самая частая ошибка — неверная группировка. Лишнее поле в СГРУППИРОВАТЬ ПО дробит результат на более мелкие строки, чем ожидалось; недостающее поле, наоборот, склеивает разные сущности в одну сумму. Контрольный приём: временно выведите запрос без группировки и сравните количество детальных строк с количеством строк результата.

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

Третья типичная проблема — потеря строк из-за внутреннего соединения или условия ГДЕ, отсекающего записи с нулевыми и пустыми значениями. Если в итоге не хватает строк, проверьте тип соединения и условия отбора.

Типичные ошибки
01
Группировка по лишнему полю — результат разбивается на мелкие строки, итоги по каждой меньше ожидаемых
02
Соединение с детальной таблицей без предварительной свёртки — суммы задваиваются или умножаются
03
Сложение полей без ЕСТЬNULL — вся сумма становится NULL из-за одного пустого значения
04
Суммирование ресурса из физической таблицы движений без учёта вида движения и периода — итог неверен
05
Расчёт суммы по тексту ячеек табличного документа — форматирование ломает преобразование в число

Как проверить, что сумма посчитана правильно

Базовая проверка — сходимость итогов. Общий итог по сгруппированному результату должен равняться сумме по детальным записям без группировки при тех же отборах. Если суммы не сходятся, ищите потерянные или задвоенные строки.

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

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

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

Общий итог сгруппированного запроса против суммы детальных записей
Норма

Суммы совпадают до копейки

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

Расхождение — потеряны или задвоены строки

Количество строк результата
Норма

Строк столько, сколько различных значений поля группировки

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

Строк больше — лишнее поле в группировке; меньше — строки отсечены отбором

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

Числа, пустых значений нет

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

NULL или пусто — не обработаны пустые слагаемые или неверный ресурс СКД

Итог

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

Сумма по строке в запросе — это СУММА() плюс корректная группировка; в СКД — ресурсы с агрегатом Сумма; в табличной части — Итог() или итог подвала формы; в строке с несколькими колонками — арифметическое выражение с ЕСТЬNULL. Проверяйте результат сходимостью общего итога с детальными данными.

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

Как посчитать сумму по строке без группировки, если нужна одна общая сумма?

Используйте СУММА() без предложения СГРУППИРОВАТЬ ПО — запрос вернёт одну строку с общим итогом по всей выборке. Отборы при этом сохраняются в ГДЕ или в параметрах виртуальной таблицы.

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

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

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

Штатного метода для выделенных строк нет. Получите выделенные строки через Элементы.Товары.ВыделенныеСтроки на форме и пройдите по ним циклом с накоплением суммы нужной колонки.

Чем отличается Итог() табличной части от суммы в запросе по тому же документу?

Итог() считает по данным объекта в памяти, включая несохранённые изменения на форме. Запрос читает данные из базы — до записи документа результаты могут различаться. Для проведённых документов без незаписанных правок значения совпадут.

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

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

Почему после добавления соединения суммы в отчёте увеличились?

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