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

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

Как сделать сумму в 1С Предприятие

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

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

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

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

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

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

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

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

КоличествоВсего = Объект.Товары.Итог("Количество");

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

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

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

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

ВЫБРАТЬ

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

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

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

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

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

Несколько важных правил. Во-первых, если поле может принимать значение NULL (например, при левом соединении), СУММА вернёт NULL, а не ноль — используйте ЕСТЬNULL(СУММА(Поле), 0). Во-вторых, суммировать можно только числовые поля; попытка применить СУММА к строке вызовет ошибку исполнения запроса. В-третьих, для подсчёта итогов с иерархией и общих итогов используется предложение ИТОГИ ПО с ключевым словом ОБЩИЕ.

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

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

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

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

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

Для итогов по иерархии (например, сумма по группе номенклатуры с учётом вложенных групп) убедитесь, что группировка построена по иерархическому полю и тип группировки — «Иерархия» или «Элементы и иерархия». Иначе суммы по родительским группам будут пустыми.

Программное суммирование в коде

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

// Простая сумма колонки

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

// Группировка с суммированием

ТаблицаТоваров.Свернуть("Номенклатура", "Количество,Сумма");

// Сумма с условием — через цикл

СуммаОблагаемая = 0;

Для Каждого Строка Из ТаблицаТоваров Цикл

Если Строка.СтавкаНДС <> Перечисления.СтавкиНДС.БезНДС Тогда

СуммаОблагаемая = СуммаОблагаемая + Строка.Сумма;

КонецЕсли;

КонецЦикла;

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

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

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

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

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

Одна строка кода для данных уже в памяти. Не умеет группировать — только общая сумма колонки.

Свернуть() таблицы значений

Группировка с суммированием без запроса. Уничтожает детальные строки исходной таблицы.

Цикл с накоплением

Максимальная гибкость: условия, накопительные итоги. Медленнее остальных на больших объёмах.

Ресурс СКД

Без кода, автоматические итоги по группировкам. Применим только внутри отчётов на СКД.

Сумма в печатной форме и в формулах ячеек

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

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

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

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

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

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

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

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

Совпадает с итогом отчёта по тому же регистру за тот же период

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

Расходится — проверяйте отборы, период и дубли от соединений

Итог табличной части
Норма

Равен сумме значений колонки при ручном пересчёте нескольких строк

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

Меньше ожидаемого — часть строк имеет пустую сумму или другой тип

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

Общий итог равен сумме итогов группировок верхнего уровня

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

Итоги групп не сходятся с общим — проверяйте выражение ресурса и отборы

Сумма в печатной форме
Норма

Равна итогу документа на экране

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

Отличается — итог посчитан не по тем строкам, что выведены

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

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

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

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

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

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

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

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

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

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

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

Как вывести общий итог в конце отчёта СКД?

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

Можно ли суммировать время или даты функцией СУММА?

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

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

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

Итог

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

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