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

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

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

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

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

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

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

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

ВЫБРАТЬ

СУММА(РеализацияТовары.Сумма) КАК Сумма

ИЗ

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

ГДЕ

РеализацияТовары.Ссылка = &Ссылка

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

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

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

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

ИтогоСумма = ТаблицаТоваров.Итог("Сумма");

Метод Итог() принимает имя или индекс колонки и возвращает сумму всех значений. Он работает только с числовыми колонками: если колонка строкового типа, результат будет некорректным или вызовет ошибку. Перед суммированием убедитесь, что тип колонки задан как Число — проверить можно через ТаблицаТоваров.Колонки.Найти("Сумма").ТипЗначения.

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

bsl
// Сумма колонки с условием
Итого = 0;
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
	Если СтрокаТовара.СтавкаНДС = 20 Тогда
		Итого = Итого + СтрокаТовара.Сумма;
	КонецЕсли;
КонецЦикла;

Суммирование ячеек в табличном документе

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

Программно значение ячейки читается через область: ТабДок.Область("R10C5").Значение. Чтобы просуммировать столбец, перебирают строки в цикле и складывают значения. Учтите: в ячейке может храниться текст, даже если он выглядит как число. Перед сложением приведите значение функцией Число() или проверяйте тип через ТипЗнч().

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

Итоги в отчётах на СКД

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

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

Для нестандартных расчётов в ресурсах доступны и другие агрегаты: Количество, Среднее, Максимум, Минимум, а также выражения на языке выражений СКД — например, Сумма(Количество * Цена), если сумма не хранится в данных напрямую.

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

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

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

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

Если итог в подвале табличной части на форме равен нулю, хотя строки заполнены, чаще всего колонка суммы не заполнена в данных (значение считается в другом поле) или у колонки в свойствах подвала не выбрана функция суммирования. Проверьте оба момента до изменения кода.
ПЗ
Практическое замечание

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

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

Типичные ошибки
01
Суммирование строковых значений: числа, хранящиеся как строки, дают неверный результат — приводите тип через Число() или на уровне запроса
02
Соединение таблиц перед СУММА без предварительной группировки: строки дублируются, итог завышается кратно
03
Игнорирование NULL: сумма группы из NULL-значений даёт NULL, а не 0 — используйте ЕСТЬNULL
04
Суммирование по видимым строкам табличного документа при установленном отборе: скрытые строки выпадают из расчёта
05
Ручной пересчёт итога в коде при включённом автоподвале на форме: двойной учёт и путаница при отладке
Контрольные точки

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

Итог запроса против формы документа
Норма

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

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

Расхождение — ищите NULL, типы данных или фильтры

Итог после соединения таблиц
Норма

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

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

Сумма выросла — строки дублируются

Итог СКД по группировкам
Норма

Сумма по группам сходится с общим итогом

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

Общий итог не равен сумме групп — проверьте ресурсы и отборы

Выбор способа под задачу

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

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

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

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

Итог

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

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

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

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

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

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

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

Можно ли суммировать ячейки по условию, как СУММЕСЛИ в Excel?

В запросе условие задаётся через ВЫБОР: СУММА(ВЫБОР КОГДА СтавкаНДС = 20 ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ). В коде — цикл с проверкой условия и накоплением. В СКД аналогичное выражение пишется в ресурсе на языке выражений компоновки.

Почему итог в СКД не совпадает с суммой детальных строк?

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

Как суммировать время или даты в 1С?

Напрямую агрегатные функции к датам не применяются. Даты переводят в числовое представление (например, разность в секундах через РАЗНОСТЬДАТ в запросе), суммируют числа, затем при необходимости конвертируют обратно. В коде даты складываются через смещение в секундах.

Метод Итог() выдаёт ошибку — в чём причина?

Чаще всего указано несуществующее имя колонки (проверьте регистр и опечатки) или колонка не числового типа. Проверьте состав колонок через цикл по Таблица.Колонки и убедитесь, что тип значения нужной колонки — Число.