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

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

Как сложить числа в массиве 1С

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

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

Выбор способа зависит от контекста: типа элементов (числа, строки, значения из таблицы значений), требований к производительности и того, где выполняется код — на сервере или на клиенте. Ниже разобраны рабочие варианты с примерами кода, ограничениями и типичными ошибками.

Базовый способ: суммирование в цикле

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

МассивЧисел = Новый Массив;

МассивЧисел.Добавить(10);

МассивЧисел.Добавить(25.5);

МассивЧисел.Добавить(4);

Сумма = 0;

Для Каждого Элемент Из МассивЧисел Цикл

Сумма = Сумма + Элемент;

КонецЦикла;

// Сумма = 39.5

Цикл «Для Каждого» подходит, когда индекс элемента не нужен. Если требуется пропускать часть элементов по позиции или обращаться к соседним значениям, используйте классический цикл со счётчиком, помня, что индексация массивов в 1С начинается с нуля.

Сумма = 0;

Для Индекс = 0 По МассивЧисел.ВГраница() Цикл

Сумма = Сумма + МассивЧисел[Индекс];

КонецЦикла;

Оформление суммирования в виде функции

Если суммирование встречается в коде неоднократно, вынесите его в отдельную функцию общего модуля. Это убирает дублирование и упрощает поддержку: исправление логики делается в одном месте.

Функция СуммаМассива(МассивЧисел) Экспорт

Результат = 0;

Для Каждого Элемент Из МассивЧисел Цикл

Если ТипЗнч(Элемент) = Тип("Число") Тогда

Результат = Результат + Элемент;

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

Проверка типа внутри функции защищает от падения кода, если в массив случайно попали строки или Неопределено. Такой защитный вариант оправдан, когда массив формируется из внешних данных — файлов, ответов веб-сервисов, пользовательского ввода.

Порядок действий
  1. 1
    Убедитесь, что элементы массива имеют числовой тип или приведите их через Число()
  2. 2
    Объявите переменную-накопитель и присвойте ей 0
  3. 3
    Пройдите по массиву циклом Для Каждого и прибавляйте элемент к накопителю
  4. 4
    После цикла проверьте результат на тестовом наборе с известной суммой

Сумма через таблицу значений и метод Итог

Если данные изначально представимы в виде таблицы — например, вы строками собираете суммы по документам, — выгоднее использовать таблицу значений вместо массива. У таблицы есть встроенный метод Итог(), который считает сумму по колонке одним вызовом.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Для Каждого Элемент Из МассивЧисел Цикл

Строка = ТЗ.Добавить();

Строка.Сумма = Элемент;

КонецЦикла;

Итого = ТЗ.Итог("Сумма");

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

Сравнение вариантов

Цикл Для Каждого

Подходит всегда, минимум кода. Ограничение — сумму считаете вручную, легко забыть инициализацию переменной.

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

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

Запрос с СУММА()

Оптимально, когда данные уже в базе. Не применимо к массиву, сформированному в оперативной памяти.

Обработка строк и нечисловых значений

Массив может содержать строки с числами — например, после разбора CSV-файла или строки, введённой пользователем. Прямое сложение строки и числа вызовет ошибку, поэтому значения нужно приводить к числу.

Сумма = 0;

Для Каждого Элемент Из МассивСтрок Цикл

ОписаниеЧисла = Новый ОписаниеТипов("Число");

Значение = ОписаниеЧисла.ПривестиЗначение(Элемент);

Сумма = Сумма + Значение;

КонецЦикла;

Метод ПривестиЗначение() не падает на некорректных строках — он вернёт 0. Это безопаснее, чем прямой вызов Число(), который выбрасывает исключение на пустой строке или тексте. Учтите, что нечисловые элементы в этом случае молча превращаются в ноль: если важно не потерять данные, логируйте такие элементы отдельно.

Сумма с условием и фильтрация элементов

Часто нужно сложить не все элементы, а только удовлетворяющие условию: положительные значения, суммы по конкретному контрагенту, значения выше порога. Условие ставится прямо внутрь цикла.

СуммаПоложительных = 0;

Для Каждого Элемент Из МассивЧисел Цикл

Если Элемент > 0 Тогда

СуммаПоложительных = СуммаПоложительных + Элемент;

КонецЕсли;

КонецЦикла;

Если условий несколько и по каждому нужна своя сумма, заведите несколько накопителей или соответствие, где ключ — признак группы, а значение — накопленная сумма. Это избавляет от повторных проходов по массиву.

При накоплении нескольких сумм по группам удобно использовать Соответствие: перед прибавлением проверяйте наличие ключа и при отсутствии записывайте 0. Это заменяет десятки отдельных переменных и легко расширяется при появлении новых групп.
ПЗ
Практическое замечание

Производительность и большие массивы

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

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

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

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

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

Типичные ошибки при суммировании

Большинство проблем при сложении элементов массива связано не с самим циклом, а с подготовкой данных и инициализацией переменных. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Не инициализирована переменная суммы — ошибка «Переменная не определена» при первом обращении
02
Использование Количество() вместо ВГраница() как верхней границы цикла — выход за границы массива
03
Сложение строковых представлений чисел без приведения типа — ошибка преобразования
04
Округление внутри цикла вместо округления итога — накопление погрешности на денежных суммах
05
Выгрузка больших данных из базы в массив вместо агрегации запросом — лишняя нагрузка на сервер

Отдельно отметим работу с денежными суммами: при сложении значений с плавающей точностью промежуточные округления внутри цикла искажают итог. Округляйте только финальный результат функцией Окр() до нужной разрядности.

Проверка результата

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

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

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

Пустой массив
Норма

Функция возвращает 0 без ошибок

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

Ошибка выполнения или возврат Неопределено

Массив со строковыми числами
Норма

Строки приводятся к числам и корректно суммируются

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

Ошибка преобразования значения к числу

Сумма дробных значений
Норма

Итог совпадает с контрольным расчётом после округления

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

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

Итог

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

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

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

Есть ли в 1С встроенная функция суммы массива?

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

Как сложить только числа, если в массиве смешанные типы?

Проверяйте тип каждого элемента через ТипЗнч() и сравнение с Тип("Число") внутри цикла. Нечисловые элементы пропускайте или приводите через ОписаниеТипов.ПривестиЗначение(), который вернёт 0 вместо ошибки.

Что вернёт суммирование пустого массива?

Если переменная-накопитель инициализирована нулём, цикл просто не выполнится ни разу, и результат будет 0. Если переменную не инициализировать, получите ошибку обращения к неопределённой переменной ещё до проверки массива.

Как посчитать сумму массива структур по одному полю?

В цикле обращайтесь к нужному свойству структуры: Сумма = Сумма + Элемент.СуммаДокумента. Если структуры могут не содержать ключ, проверяйте его наличие методом Свойство() перед обращением.

Что быстрее: цикл по массиву или запрос к базе?

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

Как избежать ошибок округления при сложении денежных сумм?

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