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