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

Быстрый старт · 9 мин

Как складывать в 1С: все способы сложения чисел

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

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

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

Ниже разобраны все практические сценарии сложения: от простого «2 + 2» в коде до групповых итогов в запросах и пересчёта сумм документа. Отдельно показано, как проверить результат и какие ошибки встречаются чаще всего.

Сложение чисел в коде на встроенном языке

Базовый способ — оператор «+». Он работает с числами, датами (прибавление секунд) и строками (конкатенация), поэтому результат зависит от типов операндов. Если оба операнда — числа, получится число; если хотя бы один — строка, выполнится склеивание текста, а не арифметика.

Типичный пример накопления суммы в цикле по табличной части:

СуммаИтого = 0;

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

СуммаИтого = СуммаИтого + СтрокаТовары.Количество * СтрокаТовары.Цена;

КонецЦикла;

Для прибавления к переменной удобна краткая форма через оператор присваивания с выражением: Переменная = Переменная + Значение. Отдельного оператора «+=» во встроенном языке нет — это частая ошибка тех, кто переходит с других языков.

Для сложения с датами оператор «+» прибавляет секунды: НоваяДата = ТекущаяДата + 3600 сдвинет время на час. Для прибавления дней, месяцев и лет надёжнее использовать функцию ДобавитьМесяц или явно умножать секунды: Дата + 7 24 3600.

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

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

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

ВсегоНДС = Товары.Итог("СуммаНДС");

Метод Итог работает и на клиенте, и на сервере, возвращает число и корректно обрабатывает пустую табличную часть — вернёт ноль. В типовых конфигурациях реквизит «СуммаДокумента» обычно пересчитывается именно так в процедуре обработки заполнения или при изменении строк.

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

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

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

ВЫБРАТЬ

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

СУММА(Продажи.Количество) КАК Количество,

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

ИЗ

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

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

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

ИТОГИ

СУММА(Количество),

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

ПО ОБЩИЕ

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

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

Сложение в отчётах на СКД

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

Если нужно сложить несколько полей в один ресурс, выражение пишется составным: Сумма(СуммаОборот) + Сумма(СуммаНДСОборот). Важно, чтобы агрегатная функция оборачивала каждое поле, а не всё выражение целиком на неагрегированных данных.

Для пользовательских полей на закладке «Пользовательские поля» тоже доступна арифметика: можно создать поле-выражение вида Цена * Количество и затем суммировать его как ресурс. Это удобно, когда формула нужна только в отчёте и не должна храниться в данных.

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

Точность, округление и денежные суммы

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

Правильный подход — округлять каждую строку до копеек функцией Окр(Значение, 2) до сложения, а не округлять только итог. Тогда сумма по документу совпадёт с суммой, которую видит пользователь в строках, и не возникнет расхождений при проведении и в отчётах.

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

Типичные ошибки при сложении в 1С
01
Сложение строки с числом через «+» — получается склейка текста вместо суммы; используйте Число() или числовые реквизиты
02
Игнорирование NULL в запросах — итог пропадает; оборачивайте в ЕСТЬNULL
03
Округление только итога, а не строк — копеечные расхождения между документом и отчётом
04
Попытка использовать «+=» — такого оператора нет, пишите Переменная = Переменная + Значение
05
Суммирование в запросе без группировки при наличии неагрегированных полей — ошибка исполнения запроса

Проверка результата сложения

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

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

Контрольные точки

Как проверить корректность суммы

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

Итог("Сумма") равен сумме строк, видимых в документе

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

Расхождение на копейки — ищите неокруглённые значения в строках

Итог запроса
Норма

Сумма по группам равна общему итогу, нет пустых значений

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

Пустой итог или NULL — добавьте ЕСТЬNULL

Ресурс в СКД
Норма

Итог группировки равен сумме детальных записей

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

Итог завышен или занижен — проверьте выражение ресурса и связи наборов данных

FAQ

Как сложить значения двух реквизитов в форме документа?

В модуле формы напишите выражение вида ИтоговаяСумма = Объект.СуммаТоваров + Объект.СуммаУслуг и разместите его в обработчике, который вызывается при изменении исходных полей (ПриИзменении). Чтобы итог обновлялся сразу у пользователя, пересчёт должен выполняться на клиенте или в вызове сервера из клиентского обработчика.

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

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

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

Отдельного типа «длительность» в 1С нет, поэтому длительность хранят как число секунд или как дату. Сложение дат оператором «+» прибавляет секунды: Дата + 600 добавит десять минут. Для интервалов в днях и месяцах используйте ДобавитьМесяц или умножение секунд на нужный коэффициент.

Можно ли сложить значения перечисления или булево?

Нет, арифметика применима только к числам, датам и строкам (для строк это конкатенация). Если нужно посчитать количество истинных значений, преобразуйте булево в число через выражение ВЫБОР КОГДА Поле ТОГДА 1 ИНАЧЕ 0 КОНЕЦ в запросе и суммируйте результат.

Как посчитать нарастающий итог по строкам?

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

Почему сумма в отчёте не совпадает с суммой документов на копейки?

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

Итог

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

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