Отчеты и Аналитика · 9 мин
Как суммировать ячейки в 1С: практическое руководство
Как суммировать ячейки в 1С: функция Сумма в запросах, итоги в табличных документах, СКД и код на встроенном языке. Пошаговые инструкции и разбор ошибок.
Задача суммирования ячеек возникает в 1С постоянно: при построении отчётов, выводе итогов по табличным частям документов, расчёте сумм в запросах и при программной обработке таблиц значений. В зависимости от того, где находятся данные — в табличном документе, запросе, таблице значений или отчёте на СКД, — применяются разные механизмы, и у каждого есть свои ограничения.
Ошибки при суммировании приводят к неверным итогам в отчётах и печатных формах, а значит — к неправильным управленческим и бухгалтерским решениям. Типичные проблемы: суммирование строкового представления чисел, пропуск итогов по группировкам, двойной учёт строк при соединении таблиц. Ниже разобраны все основные способы с точными действиями и проверками результата.
Суммирование в запросе через функцию СУММА
Самый надёжный способ просуммировать данные, хранящиеся в базе, — запрос с агрегатной функцией СУММА. Она складывает значения числового поля по всем строкам выборки или внутри группировки. Пример для суммы по табличной части документа:
ВЫБРАТЬ
СУММА(РеализацияТовары.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
РеализацияТовары.Ссылка = &Ссылка
Если нужен итог в разрезе контрагентов или периодов, добавьте группировку: поле, по которому группируете, указывается в секции СГРУППИРОВАТЬ ПО, а СУММА считается внутри каждой группы. Для вывода общих итогов поверх группировок используйте конструкцию ИТОГИ ПО — тогда запрос вернёт иерархическую выборку с промежуточными суммами.
Важные ограничения: СУММА игнорирует значения NULL, но если все значения в группе NULL, результат тоже будет NULL, а не ноль. Чтобы избежать этого, оберните поле в ЕСТЬNULL(Поле, 0). Также помните, что соединения таблиц перед суммированием могут задвоить строки — тогда сумма завысится кратно числу совпадений.
Суммирование колонки таблицы значений методом Итог
Когда данные уже загружены в таблицу значений (результат запроса, программно сформированная таблица), сумму колонки получают одной строкой кода:
ИтогоСумма = ТаблицаТоваров.Итог("Сумма");
Метод Итог() принимает имя или индекс колонки и возвращает сумму всех значений. Он работает только с числовыми колонками: если колонка строкового типа, результат будет некорректным или вызовет ошибку. Перед суммированием убедитесь, что тип колонки задан как Число — проверить можно через ТаблицаТоваров.Колонки.Найти("Сумма").ТипЗначения.
Для сумм по условию метод Итог не подходит — нужен либо отбор строк в цикле с накоплением, либо свёртка. Метод Свернуть() группирует таблицу по указанным колонкам и суммирует остальные числовые: ТаблицаТоваров.Свернуть("Номенклатура", "Количество,Сумма"). Это быстрый способ получить итоги по товарам без запроса.
// Сумма колонки с условием
Итого = 0;
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Если СтрокаТовара.СтавкаНДС = 20 Тогда
Итого = Итого + СтрокаТовара.Сумма;
КонецЕсли;
КонецЦикла;Суммирование ячеек в табличном документе
Табличный документ (макет, печатная форма, отчёт в режиме таблицы) поддерживает интерактивное суммирование, похожее на Excel. Выделите диапазон ячеек мышью — в строке состояния или на панели появится сумма выделенных числовых ячеек. Это работает в тонком клиенте и веб-клиенте для ячеек, содержащих числа.
Программно значение ячейки читается через область: ТабДок.Область("R10C5").Значение. Чтобы просуммировать столбец, перебирают строки в цикле и складывают значения. Учтите: в ячейке может храниться текст, даже если он выглядит как число. Перед сложением приведите значение функцией Число() или проверяйте тип через ТипЗнч().
При выводе итогов в печатную форму правильнее считать сумму заранее — в запросе или при обходе данных — и подставлять готовое значение в параметр макета, а не суммировать ячейки постфактум. Так итог не зависит от форматирования и видимости строк.
Итоги в отчётах на СКД
В системе компоновки данных суммирование настраивается без кода. Поле, которое нужно суммировать, добавляется на закладку «Ресурсы» — там для него выбирается выражение Сумма(Поле). После этого СКД автоматически считает итоги по каждой группировке отчёта и общий итог.
Если итог по группировке не выводится, проверьте настройки группировки: у неё должно быть включено отображение итогов (параметр «Расположение итогов» не должен быть «Нет»). Для общих итогов проверьте соответствующий элемент в настройках отчёта.
Для нестандартных расчётов в ресурсах доступны и другие агрегаты: Количество, Среднее, Максимум, Минимум, а также выражения на языке выражений СКД — например, Сумма(Количество * Цена), если сумма не хранится в данных напрямую.
- 1Откройте схему компоновки данных отчёта
- 2Перейдите на закладку «Ресурсы»
- 3Добавьте поле суммы и укажите выражение Сумма(ИмяПоля)
- 4Убедитесь, что в настройках группировок включены итоги
- 5Сформируйте отчёт и сверьте итог с контрольной суммой из исходных данных
Сумма по табличной части документа
Частая задача — показать на форме документа итог по колонке табличной части (например, «Сумма» по товарам). В управляемой форме у элемента таблицы включается свойство «Подвал», а у колонки — «Отображать в подвале» с функцией «Сумма». Платформа сама пересчитает итог при редактировании строк.
Программно итог по табличной части объекта получают тем же методом Итог: Объект.Товары.Итог("Сумма"). Этот приём используется в процедурах ПередЗаписью или ПриЗаписи для заполнения реквизита «СуммаДокумента» — стандартный паттерн типовых конфигураций.
Если итог в подвале табличной части на форме равен нулю, хотя строки заполнены, чаще всего колонка суммы не заполнена в данных (значение считается в другом поле) или у колонки в свойствах подвала не выбрана функция суммирования. Проверьте оба момента до изменения кода.
Проверка результата и типичные ошибки
Любую сумму стоит верифицировать независимым способом: итог запроса сверить с итогом табличной части на форме, итог СКД — с оборотно-сальдовой ведомостью или суммой по подвалу документа. Расхождение даже на копейки указывает на проблему с типами данных, округлением или задвоением строк.
Как проверить результат
Суммы совпадают до копейки
Расхождение — ищите NULL, типы данных или фильтры
Сумма равна сумме без соединения
Сумма выросла — строки дублируются
Сумма по группам сходится с общим итогом
Общий итог не равен сумме групп — проверьте ресурсы и отборы
Выбор способа под задачу
Как выбрать действие
Универсального способа нет: запрос оптимален для данных в базе, метод Итог — для таблиц в памяти, СКД — для отчётов, подвал формы — для интерактивной работы пользователя. Комбинирование подходов допустимо, но итог для проводок и регламентированных отчётов всегда считайте на уровне запроса или кода, а не по ячейкам готового документа.
Что важно запомнить
Суммирование в 1С выполняется функцией СУММА в запросе, методом Итог() у таблицы значений, ресурсами СКД и автосуммой табличного документа. Главные риски — строковые типы, NULL и задвоение строк при соединениях. Результат всегда сверяйте независимым способом.
Частые вопросы
Почему СУММА в запросе возвращает NULL вместо нуля?
Агрегатная функция возвращает NULL, если в группе нет ни одного числового значения — например, отбор не нашёл строк. Оберните результат в ЕСТЬNULL: ВЫБРАТЬ ЕСТЬNULL(СУММА(Поле), 0). Тогда при отсутствии данных получите ноль.
Как просуммировать только видимые строки табличной части с отбором?
Метод Итог() считает все строки независимо от отбора на форме. Нужно получить отобранные строки через НайтиСтроки() с теми же параметрами отбора и просуммировать их в цикле, либо сначала выгрузить отобранные строки в отдельную таблицу.
Можно ли суммировать ячейки по условию, как СУММЕСЛИ в Excel?
В запросе условие задаётся через ВЫБОР: СУММА(ВЫБОР КОГДА СтавкаНДС = 20 ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ). В коде — цикл с проверкой условия и накоплением. В СКД аналогичное выражение пишется в ресурсе на языке выражений компоновки.
Почему итог в СКД не совпадает с суммой детальных строк?
Частые причины: в ресурсе выбрано не Сумма, а другое выражение; на детальные записи действуют отборы, которых нет на уровне итогов; данные содержат дубли из-за соединений в наборе данных. Проверьте выражение ресурса и сформируйте отчёт без отборов для сравнения.
Как суммировать время или даты в 1С?
Напрямую агрегатные функции к датам не применяются. Даты переводят в числовое представление (например, разность в секундах через РАЗНОСТЬДАТ в запросе), суммируют числа, затем при необходимости конвертируют обратно. В коде даты складываются через смещение в секундах.
Метод Итог() выдаёт ошибку — в чём причина?
Чаще всего указано несуществующее имя колонки (проверьте регистр и опечатки) или колонка не числового типа. Проверьте состав колонок через цикл по Таблица.Колонки и убедитесь, что тип значения нужной колонки — Число.