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

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

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

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

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

Основная проблема новичков — не само сложение, а типы данных. Если складываемые значения имеют разные типы (число и строка) или одно из значений равно NULL, результат будет ошибкой или неожиданным итогом. Поэтому дальше разберём каждый способ отдельно, с примерами кода и проверкой результата.

Материал подходит для платформы 1С:Предприятие 8.3 и актуальных типовых конфигураций. Синтаксис встроенного языка и языка запросов в этой части стабилен и одинаково работает в «Бухгалтерии», «Управлении торговлей», «Зарплате и управлении персоналом» и самописных конфигурациях.

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

Самый простой случай — сложение в модуле формы, объекта или общем модуле. Используется обычный оператор «+»:

А = 10;

Б = 25.5;

Итог = А + Б; // 35.5

Если значения хранятся в реквизитах объекта, обращайтесь к ним по имени. Например, в модуле документа сумма по строкам и шапке может складываться так: ОбщаяСумма = СуммаТоваров + СуммаУслуг;. Порядок операций стандартный: сначала умножение и деление, потом сложение; для изменения приоритета используйте скобки.

Частая ситуация — накопление суммы в цикле. Здесь важно заранее инициализировать переменную нулём, иначе при первом обращении получите ошибку «Переменная не определена»:

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

Для Каждого Строка Из ТабличнаяЧасть Цикл

ИтоговаяСумма = ИтоговаяСумма + Строка.Сумма;

КонецЦикла;

Для строк табличной части есть и более короткий путь — метод Итог(): ИтоговаяСумма = Объект.Товары.Итог("Сумма");. Он быстрее и надёжнее ручного цикла, так как не требует контроля типов внутри каждой строки.

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

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

ВЫБРАТЬ

Продажи.Контрагент,

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

ИЗ

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

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

Продажи.Контрагент

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

Внутри запроса можно складывать и отдельные поля без агрегации — обычным знаком «+»: ВЫБРАТЬ Товары.Цена * Товары.Количество + Товары.СуммаДоставки КАК ИтоговаяСумма. Это построчное вычисление, а СУММА — агрегат по группе; не путайте эти два механизма.

Как просуммировать колонку запросом
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Выберите таблицу (регистр или документ) и нужное числовое поле
  3. 3
    Оберните поле в СУММА() и добавьте СГРУППИРОВАТЬ ПО по измерениям
  4. 4
    Добавьте ЕСТЬNULL вокруг поля, если возможны пустые значения
  5. 5
    Выполните запрос и сверьте итог с контрольными данными в базе

Сумма по колонке табличной части и таблицы значений

Для табличных частей документов и таблиц значений в коде предусмотрен метод Итог("ИмяКолонки"). Он возвращает сумму по указанной числовой колонке без цикла:

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

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

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

&НаКлиенте

Процедура ТоварыКоличествоПриИзменении(Элемент)

Строка = Элементы.Товары.ТекущиеДанные;

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

КонецПроцедуры

Помните, что итог по табличной части, вычисленный на клиенте, — это только отображение. Записываемые в базу итоговые реквизиты (например, «СуммаДокумента») должны пересчитываться и на сервере, иначе при программном проведении документа без открытия формы значение останется старым.

Типичные ошибки при сложении
01
Сложение числа и строки без преобразования типа — получаете ошибку выполнения или конкатенацию вместо суммы
02
Игнорирование NULL в запросах — СУММА возвращает NULL, и итоговый отчёт показывает пустоту вместо нуля
03
Пересчёт итога только на клиенте — при программном проведении документа сумма в базе не обновляется
04
Накопление суммы в цикле без инициализации переменной нулём — ошибка «Переменная не определена»
05
Округление промежуточных значений в цикле — копеечные расхождения с итогом, посчитанным одним выражением

Итоги в отчётах на СКД и динамических списках

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

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

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

Где каким способом складывать

Оператор «+» в коде

Для двух-трёх переменных и построчных пересчётов. Не подходит для суммирования по базе — это было бы медленно

Метод Итог() табличной части

Для колонки табличной части документа или таблицы значений. Не работает с запросами и регистрами

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

Для агрегации данных из базы с группировкой. Требует обработки NULL через ЕСТЬNULL

Ресурсы СКД

Для отчётов: итоги по группам и общий итог считаются автоматически. Не применимо вне механизма СКД

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

После любого суммирования сверьте результат с независимым источником. Для документа — с итогом, который видит пользователь в форме; для запроса — со стандартным отчётом по тому же регистру за тот же период. Совпадение до копейки — признак корректного расчёта.

Если итоги расходятся на копейки, причина почти всегда в округлении. Проверьте, где применяется функция Окр() или метод Округлить(): округлять нужно финальную сумму, а не каждое слагаемое в цикле. Расхождение в крупных суммах обычно означает потерю строк — проверьте отборы, соединения таблиц и условия В ГРУППИРОВКЕ.

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

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

Итог по документу
Норма

СуммаДокумента совпадает с суммой Итог("Сумма") по табличной части

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

Расхождение — итог пересчитан не везде или строки изменились после пересчёта

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

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

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

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

Значение вместо NULL
Норма

В выборке числа или нули

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

Пустые ячейки — не применён ЕСТЬNULL

Копейки
Норма

Итог сходится до копейки

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

Расхождение на копейки — округление внутри цикла

Ограничения и когда нужен специалист

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

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

Частые вопросы

Как сложить два числа в 1С, если одно из них строка?

Сначала преобразуйте строку функцией Число(): Итог = А + Число(СтрокаСЧислом). Если строка может содержать нечисловое значение, оберните преобразование в Попытка/Исключение, чтобы при ошибке присвоить ноль и не прерывать выполнение кода.

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

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

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

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

Чем СУММА в запросе отличается от Сумма() в СКД?

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

Почему итог расходится на копейки с суммой по строкам?

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

Можно ли складывать числа прямо в консоли кода без конфигуратора?

Да, во внешних инструментах вроде консоли кода можно выполнить выражение А + Б и сразу увидеть результат. Это удобно для проверки формул на реальных данных базы без изменения конфигурации, но такие вычисления ничего не записывают в базу.

Итог

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

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