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

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

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

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

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

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

Ниже разобраны все основные сценарии с примерами кода, условиями выбора и типичными ошибками, из-за которых сумма получается неверной или запрос выдаёт ошибку.

Сумма столбца в запросе через функцию СУММА

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

Пример запроса, который считает общую сумму продаж по всем документам:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Продажи.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Промежуточные и общие итоги через ИТОГИ ПО и ОБЩИЕ

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

ВЫБРАТЬ

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

Продажи.Сумма КАК Сумма

ИЗ

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

ИТОГИ

СУММА(Сумма)

ПО

ОБЩИЕ, Номенклатура

Результат такого запроса обходят через ВыборкаИзГруппировки: сначала получают выборку по группировке «ОБЩИЕ» (общий итог), затем — по группировке «Номенклатура» (итоги по каждой позиции), а внутри них — детальные записи.

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

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

Если данные уже собраны в таблицу значений (например, результат запроса выгружен методом Выгрузить() или таблица сформирована программно), сумму колонки считает метод Итог(). Это одна строка кода без цикла:

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

ОбщаяСумма = ТаблицаРезультата.Итог("Сумма");

Метод работает только с числовыми колонками. Если колонка содержит строки или составной тип, метод вернёт 0 или вызовет ошибку в зависимости от содержимого. Перед суммированием убедитесь, что колонка имеет числовой тип — при программном создании таблицы тип задаётся через ОписаниеТипов.

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

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

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

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

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

Такой пересчёт обычно размещают в обработчиках ПриИзменении полей «Количество» и «Цена» в модуле формы, либо в обработчике ОбработкаЗаполнения / ПередЗаписью в модуле объекта. В типовых конфигурациях для этого часто уже есть готовые процедуры пересчёта — используйте их, чтобы не дублировать логику и не нарушить работу механизмов скидок и НДС.

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

Итоги в отчётах на СКД без программирования

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

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

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

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

СУММА в запросе

Быстро, считается на сервере СУБД. Подходит для отчётов и выборок; результат нельзя корректировать интерактивно.

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

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

Ресурсы СКД

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

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

Штатный способ для документов. Считает только по загруженным строкам текущего объекта.

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

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

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

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

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

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

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

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

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

Сумма на контрольном наборе данных
Норма

Совпадает с ручным подсчётом или типовым отчётом

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

Расхождение — ищите дубли строк или неверный отбор

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

Числовой тип, NULL обработаны через ЕСТЬNULL

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

Строковый/составной тип, метод Итог() возвращает 0

Количество строк в выборке
Норма

Совпадает с ожидаемым числом документов/позиций

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

Строк больше из-за соединения таблиц — сумма завышена

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

Чем СУММА в запросе отличается от метода Итог()?

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

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

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

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

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

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

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

Почему после соединения таблиц сумма стала больше?

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

Итог

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

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