Разработка и Конфигурация · 9 мин
Как сложить числа в массиве 1С
Как сложить числа в массиве 1С: цикл Для Каждого, свёртка массива, функция суммы, обработка строк и пустых значений. Примеры кода и типичные ошибки.
Задача сложить все числа массива возникает в 1С постоянно: подсчёт итогов по строкам документа, накопление сумм в обработках, агрегация данных перед выводом в отчёт. Встроенной функции «СуммаМассива» в языке нет, поэтому суммирование делается вручную — циклом или через промежуточные структуры данных.
Выбор способа зависит от контекста: типа элементов (числа, строки, значения из таблицы значений), требований к производительности и того, где выполняется код — на сервере или на клиенте. Ниже разобраны рабочие варианты с примерами кода, ограничениями и типичными ошибками.
Базовый способ: суммирование в цикле
Самый универсальный подход — объявить переменную для накопления суммы и пройти по массиву циклом. Переменную обязательно инициализируйте нулём, иначе при первом обращении к неопределённому значению возникнет ошибка.
МассивЧисел = Новый Массив;
МассивЧисел.Добавить(10);
МассивЧисел.Добавить(25.5);
МассивЧисел.Добавить(4);
Сумма = 0;
Для Каждого Элемент Из МассивЧисел Цикл
Сумма = Сумма + Элемент;
КонецЦикла;
// Сумма = 39.5
Цикл «Для Каждого» подходит, когда индекс элемента не нужен. Если требуется пропускать часть элементов по позиции или обращаться к соседним значениям, используйте классический цикл со счётчиком, помня, что индексация массивов в 1С начинается с нуля.
Сумма = 0;
Для Индекс = 0 По МассивЧисел.ВГраница() Цикл
Сумма = Сумма + МассивЧисел[Индекс];
КонецЦикла;
Оформление суммирования в виде функции
Если суммирование встречается в коде неоднократно, вынесите его в отдельную функцию общего модуля. Это убирает дублирование и упрощает поддержку: исправление логики делается в одном месте.
Функция СуммаМассива(МассивЧисел) Экспорт
Результат = 0;
Для Каждого Элемент Из МассивЧисел Цикл
Если ТипЗнч(Элемент) = Тип("Число") Тогда
Результат = Результат + Элемент;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Проверка типа внутри функции защищает от падения кода, если в массив случайно попали строки или Неопределено. Такой защитный вариант оправдан, когда массив формируется из внешних данных — файлов, ответов веб-сервисов, пользовательского ввода.
- 1Убедитесь, что элементы массива имеют числовой тип или приведите их через Число()
- 2Объявите переменную-накопитель и присвойте ей 0
- 3Пройдите по массиву циклом Для Каждого и прибавляйте элемент к накопителю
- 4После цикла проверьте результат на тестовом наборе с известной суммой
Сумма через таблицу значений и метод Итог
Если данные изначально представимы в виде таблицы — например, вы строками собираете суммы по документам, — выгоднее использовать таблицу значений вместо массива. У таблицы есть встроенный метод Итог(), который считает сумму по колонке одним вызовом.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Для Каждого Элемент Из МассивЧисел Цикл
Строка = ТЗ.Добавить();
Строка.Сумма = Элемент;
КонецЦикла;
Итого = ТЗ.Итог("Сумма");
Тот же приём работает с табличными частями документов: Док.Товары.Итог("Сумма") — стандартный способ получить итог документа без ручного цикла. Массив здесь вообще не нужен.
Сравнение вариантов
Подходит всегда, минимум кода. Ограничение — сумму считаете вручную, легко забыть инициализацию переменной.
Удобно при нескольких колонках и группировках. Избыточно, если нужна одна сумма по простому массиву.
Оптимально, когда данные уже в базе. Не применимо к массиву, сформированному в оперативной памяти.
Обработка строк и нечисловых значений
Массив может содержать строки с числами — например, после разбора CSV-файла или строки, введённой пользователем. Прямое сложение строки и числа вызовет ошибку, поэтому значения нужно приводить к числу.
Сумма = 0;
Для Каждого Элемент Из МассивСтрок Цикл
ОписаниеЧисла = Новый ОписаниеТипов("Число");
Значение = ОписаниеЧисла.ПривестиЗначение(Элемент);
Сумма = Сумма + Значение;
КонецЦикла;
Метод ПривестиЗначение() не падает на некорректных строках — он вернёт 0. Это безопаснее, чем прямой вызов Число(), который выбрасывает исключение на пустой строке или тексте. Учтите, что нечисловые элементы в этом случае молча превращаются в ноль: если важно не потерять данные, логируйте такие элементы отдельно.
Сумма с условием и фильтрация элементов
Часто нужно сложить не все элементы, а только удовлетворяющие условию: положительные значения, суммы по конкретному контрагенту, значения выше порога. Условие ставится прямо внутрь цикла.
СуммаПоложительных = 0;
Для Каждого Элемент Из МассивЧисел Цикл
Если Элемент > 0 Тогда
СуммаПоложительных = СуммаПоложительных + Элемент;
КонецЕсли;
КонецЦикла;
Если условий несколько и по каждому нужна своя сумма, заведите несколько накопителей или соответствие, где ключ — признак группы, а значение — накопленная сумма. Это избавляет от повторных проходов по массиву.
При накоплении нескольких сумм по группам удобно использовать Соответствие: перед прибавлением проверяйте наличие ключа и при отсутствии записывайте 0. Это заменяет десятки отдельных переменных и легко расширяется при появлении новых групп.
Производительность и большие массивы
Для массивов в сотни и тысячи элементов разница между способами суммирования незаметна. Вопрос производительности становится актуальным при сотнях тысяч элементов или когда суммирование выполняется внутри другого цикла — например, при обходе большой выборки из базы.
Главное правило: если данные уже хранятся в информационной базе, сумму считайте запросом с агрегатной функцией СУММА(), а не выгрузкой в массив с последующим циклом. Запрос выполнит агрегацию на стороне СУБД и вернёт одно число вместо перекачки всех строк в память сервера 1С.
Как выбрать действие
Типичные ошибки при суммировании
Большинство проблем при сложении элементов массива связано не с самим циклом, а с подготовкой данных и инициализацией переменных. Ниже — ошибки, которые встречаются чаще всего.
Отдельно отметим работу с денежными суммами: при сложении значений с плавающей точностью промежуточные округления внутри цикла искажают итог. Округляйте только финальный результат функцией Окр() до нужной разрядности.
Проверка результата
После реализации суммирования проверьте код на контрольных наборах: пустом массиве (сумма должна быть 0, а не ошибка), массиве из одного элемента и наборе с заранее известным итогом. Пустой массив — частый источник сбоев, если код дальше делит на полученную сумму.
Как проверить результат
Функция возвращает 0 без ошибок
Ошибка выполнения или возврат Неопределено
Строки приводятся к числам и корректно суммируются
Ошибка преобразования значения к числу
Итог совпадает с контрольным расчётом после округления
Расхождение в копейках из-за округления внутри цикла
Что важно запомнить
Сумма массива в 1С считается циклом Для Каждого с инициализированным нулём накопителем. Для табличных частей и таблиц значений используйте метод Итог(), для данных из базы — запрос с СУММА(). Всегда проверяйте тип элементов и поведение на пустом массиве.
Частые вопросы
Есть ли в 1С встроенная функция суммы массива?
Нет, штатной функции суммирования массива во встроенном языке нет. Сумму считают циклом либо переносят данные в таблицу значений и используют метод Итог(). Для данных из базы применяют агрегатную функцию СУММА() в запросе.
Как сложить только числа, если в массиве смешанные типы?
Проверяйте тип каждого элемента через ТипЗнч() и сравнение с Тип("Число") внутри цикла. Нечисловые элементы пропускайте или приводите через ОписаниеТипов.ПривестиЗначение(), который вернёт 0 вместо ошибки.
Что вернёт суммирование пустого массива?
Если переменная-накопитель инициализирована нулём, цикл просто не выполнится ни разу, и результат будет 0. Если переменную не инициализировать, получите ошибку обращения к неопределённой переменной ещё до проверки массива.
Как посчитать сумму массива структур по одному полю?
В цикле обращайтесь к нужному свойству структуры: Сумма = Сумма + Элемент.СуммаДокумента. Если структуры могут не содержать ключ, проверяйте его наличие методом Свойство() перед обращением.
Что быстрее: цикл по массиву или запрос к базе?
Цикл по массиву в памяти работает быстро, но если данные приходится ради суммы выгружать из базы, запрос с СУММА() эффективнее: агрегация выполняется на стороне СУБД без передачи всех строк на сервер приложений.
Как избежать ошибок округления при сложении денежных сумм?
Не округляйте каждый элемент внутри цикла — складывайте исходные значения, а функцию Окр() применяйте один раз к итоговой сумме. Для денежных полей также задавайте в описании типов точность, соответствующую валютным требованиям.