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