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

Отчеты и Аналитика · 12 мин

Как просуммировать колонку в 1С: рабочие способы для пользователя и разработчика

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

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

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

Ниже разобраны все основные сценарии — от простого просмотра суммы в форме до программного суммирования с условиями. Примеры применимы к типовым конфигурациям на управляемых формах (УТ, ERP, БП, ЗУП) и к самописным решениям.

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

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

Если строка состояния не отображается, проверьте, что выделяете именно числовые ячейки: текстовые значения и пустые ячейки в расчёт не попадают. Выделять можно как непрерывный диапазон, так и отдельные ячейки с зажатой клавишей Ctrl — сумма пересчитается автоматически.

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

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

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

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

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

Как получить сумму по табличной части без стандартного итога
  1. 1
    Откройте документ и перейдите на вкладку с табличной частью
  2. 2
    Через меню «Ещё» выберите «Вывести список» и отметьте нужные колонки
  3. 3
    В сформированном табличном документе выделите колонку целиком
  4. 4
    Считайте сумму в строке состояния внизу окна

Итоги в отчётах на СКД: группировки и ресурсы

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

Если нужная колонка выводится, но итог по ней не считается, откройте настройки отчёта («Ещё → Изменить вариант» или кнопка «Настройки»), перейдите на закладку «Ресурсы» и убедитесь, что поле присутствует в списке ресурсов. Для пользовательского поля дополнительно проверьте выражение агрегирования — там должна быть функция Сумма(...), а не Максимум или Количество.

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

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

Суммирование колонки в запросе: функция СУММА()

В языке запросов 1С суммирование выполняет агрегатная функция СУММА(). Она применяется к числовому полю и требует либо группировки остальных полей через СГРУППИРОВАТЬ ПО, либо отсутствия неагрегатных полей в выборке.

// Сумма по всем строкам без группировки

ВЫБРАТЬ

СУММА(Товары.Сумма) КАК СуммаИтог

ИЗ

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

ГДЕ

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

// Сумма с группировкой по контрагентам

ВЫБРАТЬ

Реализация.Контрагент КАК Контрагент,

СУММА(Реализация.СуммаДокумента) КАК Сумма

ИЗ

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

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

Реализация.Контрагент

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

Суммировать можно и вычисляемые выражения: СУММА(Строки.Количество * Строки.Цена). Это удобно, когда итоговой колонки в таблице нет, но есть составляющие. Учитывайте, что умножение на NULL даст NULL, и такая строка выпадет из суммы — при сомнительных данных используйте ЕСТЬNULL внутри выражения.

bsl
Запрос = Новый Запрос("ВЫБРАТЬ ЕСТЬNULL(СУММА(Т.Сумма), 0) КАК Итог ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Т ГДЕ Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Итог = Запрос.Выполнить().Выгрузить()[0].Итог;

Программное суммирование: метод Итог() и цикл с условием

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

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

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

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

ИтогПоУсловию = 0;

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

Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда

ИтогПоУсловию = ИтогПоУсловию + Строка.Сумма;

КонецЕсли;

КонецЦикла;

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

Способы суммирования в коде

Итог("Колонка")

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

Цикл с условием

Гибкие условия любой сложности, но больше кода и медленнее на больших таблицах

Свернуть()

Группировка плюс суммы сразу по нескольким колонкам; меняет саму таблицу, работайте с копией

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

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

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

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

Три источника ошибок встречаются чаще всего. Первый — NULL в суммируемой колонке: строки молча выпадают из расчёта. Второй — смешение валют: суммировать колонку с суммами в разных валютах без приведения к единой бессмысленно, хотя технически платформа это позволит. Третий — суммирование по детальным строкам при наличии иерархии: в запросах с итогами по группам легко получить задвоение, если соединить таблицу с самой собой.

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

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

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

Сумма по запросу против итога отчёта
Норма

Значения совпадают до копеек при одинаковых отборах

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

Расхождение — различаются отборы, периоды или учтены помеченные на удаление

Наличие NULL в колонке
Норма

СУММА() обёрнута в ЕСТЬNULL, пустые значения обработаны

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

Итог меньше ожидаемого или равен NULL

Валюта суммируемых строк
Норма

Все суммы в одной валюте либо приведены к ней

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

Смешаны рубли и валютные суммы — итог бессмыслен

Как выбрать подходящий способ

Выбор инструмента определяется тем, где лежат данные и что нужно на выходе. Разовая проверка на экране — выделение ячеек и строка состояния. Регулярная аналитика — отчёт с ресурсами и группировками. Интеграция в обработку или печатную форму — запрос с СУММА() или метод Итог().

Для больших объёмов (сотни тысяч строк) предпочтителен запрос: агрегация выполняется на сервере СУБД и не перегоняет данные в клиентский код. Цикл по выгруженной таблице на таких объёмах работает заметно медленнее и расходует память.

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

Как выбрать действие

Данные уже на экране, сумма нужна один разВыделите колонку и посмотрите сумму в строке состояния
Нужна регулярная аналитика с итогами по группамНастройте отчёт СКД: добавьте поле в ресурсы и группировки
Сумма нужна в коде без условийИспользуйте Таблица.Итог("ИмяКолонки")
Нужны условия отбора строк или большой объёмНапишите запрос с СУММА() и ГДЕ либо цикл с проверкой условия
Итог

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

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

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

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

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

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

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

Можно ли вывести итог по колонке в динамическом списке?

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

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

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

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

В модуле формирования печатной формы накапливайте сумму в переменной при выводе строк, затем подставляйте её в параметр области подвала макета. Либо вычислите сумму заранее запросом и передайте готовое значение в параметр макета.

Что быстрее на больших данных: Итог(), цикл или запрос?

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