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

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

Как вывести сумму строк в 1С

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

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

В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ERP) итоги по табличным частям обычно уже выведены автоматически: под таблицей товаров отображается сумма документа, количество и сумма НДС. Если итог пропал, не считается или нужен в нестандартном месте — придётся настроить форму, изменить запрос или добавить код.

Итоги по колонке табличной части на форме документа

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

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

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

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

Программный подсчёт суммы строк в коде

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

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

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

1c
СуммаУслуг = 0; Для Каждого Строка Из Объект.Товары Цикл Если Строка.ЭтоУслуга Тогда СуммаУслуг = СуммаУслуг + Строка.Сумма; КонецЕсли; КонецЦикла;

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

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

Если данные нужно просуммировать по многим документам — например, итог продаж по контрагентам за период, — правильный инструмент это запрос с агрегатной функцией СУММА(). Запрос выполняется на сервере и обрабатывает большие объёмы быстрее любого цикла.

1c
ВЫБРАТЬ Товары.Номенклатура, СУММА(Товары.Количество) КАК Количество, СУММА(Товары.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ГДЕ Товары.Ссылка.Дата МЕЖДУ &Начало И &Конец СГРУППИРОВАТЬ ПО Товары.Номенклатура

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

Итоги по иерархии и общие итоги

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

Сумма строк в отчёте на СКД

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

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

Типичные ошибки в СКД
01
Поле суммы добавлено в выборку, но не в ресурсы — итоги по группировкам пустые
02
В ресурсе использовано Максимум() вместо Сумма() — итог показывает одно значение вместо суммы
03
Отключены итоги у группировки в пользовательских настройках — суммы есть в данных, но не видны
04
Суммирование по соединённым наборам без проверки дублей — суммы задваиваются

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

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

Второй способ — формула в ячейке табло вида СУММ(R5C2:R10C2) — работает только если ячейки содержат числа, а не текст, и диапазон указан верно. При программном формировании строк диапазон часто «съезжает», поэтому формулы в табло используют редко, в основном в статичных формах.

Способы подсчёта суммы строк

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

Быстро и просто, но только одна колонка и без условий

Цикл по строкам

Гибкие условия и формулы, но медленнее на больших таблицах

Запрос с СУММА()

Оптимален для данных многих документов и регистров

Ресурсы СКД

Стандартно для отчётов, не требует кода, но зависит от настроек группировок

Проверка результата и ограничения

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

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

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

Итог под таблицей
Норма

Совпадает с суммой документа и обновляется при изменении строк

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

Итог не меняется при редактировании или расходится с проводками

Итог в отчёте СКД
Норма

Сумма по группе равна сумме детальных строк

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

Итог пустой, нулевой или больше суммы строк — проверяйте ресурсы и соединения

Сумма в запросе
Норма

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

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

Строк больше, чем ожидалось — лишнее поле в группировке

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

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

Нужен итог под таблицей документа на формеВключите подвал таблицы и итог колонки в конфигураторе
Сумма нужна в коде с условием по строкамИспользуйте цикл с накоплением или Итог() без условий
Суммируются данные многих документов или регистровПишите запрос с СУММА() и группировкой
Итог нужен в отчёте пользователяДобавьте ресурс Сумма() в схему компоновки данных

Часто задаваемые вопросы

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

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

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

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

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

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

Можно ли вывести сумму строк без изменения конфигурации?

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

Почему сумма в отчёте больше, чем сумма строк документов?

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

Итог

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

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