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