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