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

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

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

Способы посчитать сумму по табличной части документа в 1С: метод Итог(), цикл по строкам, итоги в форме, запросы и типовые ошибки при расчёте.

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

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

Метод Итог() — самый простой способ

У табличной части документа есть встроенный метод Итог(), который принимает имя колонки и возвращает сумму по всем строкам. Это стандартное решение, когда нужно просто сложить значения одной числовой колонки без дополнительных условий.

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

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

ИтогоКоличество = Объект.Товары.Итог("Количество");

Метод работает и в модуле объекта, и в модуле формы, и во внешней обработке — везде, где есть доступ к табличной части. Колонка должна иметь числовой тип, иначе результат будет некорректным или вызовет ошибку.

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

Расчёт суммы в цикле с условиями

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

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

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрокаТовара.Отменено Тогда

Продолжить;

КонецЕсли;

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

КонецЦикла;

Цикл незаменим, когда сумма по строке не хранится в реквизите, а вычисляется из других полей — например, «Количество × Цена» со скидкой. Также в цикле удобно параллельно считать количество позиций, максимальную цену или собирать список номенклатуры.

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

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

Вывод итога по колонке на форме документа

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

Порядок настройки: откройте форму документа в конфигураторе, выделите табличное поле, в свойствах установите «Подвал» (Footer) в значение «Истина», затем для нужной колонки задайте путь к данным итога или включите автоматический итог. В управляемых формах это делается через свойства колонки таблицы формы.

Альтернатива — вычисляемый реквизит формы (например, «ИтогоСумма»), который обновляется в обработчиках ПриИзменении колонок и ПослеУдаления строк табличной части. Так делают, когда итог нужно выводить в отдельном поле над таблицей или использовать в дальнейших расчётах на форме.

Порядок действий для итога на форме
  1. 1
    Откройте форму документа в конфигураторе и выделите таблицу с табличной частью
  2. 2
    Включите свойство «Подвал» (Footer) у таблицы
  3. 3
    Для числовой колонки включите отображение итога в подвале
  4. 4
    Если нужен итог с условиями — добавьте реквизит формы и обновляйте его в обработчиках изменения строк
  5. 5
    Проверьте: добавьте и удалите строки, итог должен пересчитываться автоматически

Сумма через запрос

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| СУММА(РеализацияТовары.Сумма) КАК СуммаИтого

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары

|ГДЕ

| РеализацияТовары.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

СуммаИтого = Результат.СуммаИтого;

КонецЕсли;

Важно понимать разницу: Итог() и цикл работают с данными объекта в памяти, включая ещё не записанные изменения, а запрос читает только то, что сохранено в базе. Если документ открыт и изменён, но не записан, запрос вернёт старую сумму.

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

Сравнение способов расчёта суммы

Метод Итог()

Быстро и коротко, но только по одной колонке и без условий. Работает с данными в памяти.

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

Гибкие условия и вычисления по строкам. Медленнее на больших таблицах, требует больше кода.

Итог на форме

Вообще без кода, но только для отображения пользователю, результат нельзя использовать в логике.

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

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

Особенности в типовых конфигурациях

В типовых решениях (Бухгалтерия, Управление торговлей, ERP) итоговая сумма документа — это не просто сумма колонки «Сумма». Она может включать или не включать НДС в зависимости от флага «Сумма включает НДС», пересчитываться из валюты в валюту учёта по курсу, уменьшаться на скидки и зависеть от вида операции.

Поэтому при доработках не стоит вставлять собственный расчёт Итог("Сумма") вместо типовых механизмов. В типовых модулях есть процедуры пересчёта табличных частей (например, обработки вида «РассчитатьСуммуТабличнойЧасти» в общих модулях работы с документами), которые учитывают все эти факторы. Правильный подход — вызвать типовую процедуру или посмотреть, как сумма выводится в шапку документа, и повторить эту логику.

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

Типичные ошибки и проверка результата

Первая распространённая ошибка — суммирование колонки, в которой есть пустые или незаполненные значения, с последующим удивлением, почему итог не сходится с ожиданием. Вторая — использование Итог() по колонке «Сумма», когда в конфигурации сумма строки вычисляется, но не хранится, и реквизит заполняется только при проведении.

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

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

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

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

Сумма из кода против итога на форме
Норма

Значения совпадают до копейки

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

Расхождение на сумму НДС или на отменённые строки

Итог по документу против печатной формы
Норма

Одинаковая итоговая сумма

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

Печатная форма считает по-другому — проверьте типовой макет

Повторный расчёт после изменения строк
Норма

Итог пересчитывается автоматически

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

Сумма устарела — не подключены обработчики изменения табличной части

FAQ

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

Обойдите коллекцию выделенных строк формы через Элементы.Товары.ВыделенныеСтроки, получите данные каждой строки по идентификатору методом НайтиПоИдентификатору() и сложите значения нужной колонки в цикле. Метод Итог() здесь не подходит, так как он работает со всей табличной частью.

Почему Итог("Сумма") возвращает ноль, хотя в строках есть значения?

Чаще всего колонка «Сумма» — это реквизит, который заполняется только при записи или проведении, а на форме сумма отображается как вычисляемое поле. Либо имя колонки указано с опечаткой. Проверьте в конфигураторе состав реквизитов табличной части и посчитайте сумму в цикле как Количество × Цена.

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

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

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

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

Как округлить итоговую сумму до целых рублей?

Примените функцию Окр() к готовому результату: ИтогОкругленный = Окр(Объект.Товары.Итог("Сумма"), 0). Не округляйте суммы отдельных строк перед сложением — это даёт накопленную погрешность. Учтите, что в учётных документах произвольное округление может вызвать расхождения с расчётом НДС, поэтому в типовых конфигурациях ориентируйтесь на их правила округления.

Чем отличается Итог() табличной части от Итог() таблицы значений?

Синтаксис одинаковый, но табличная часть привязана к объекту документа и хранит данные в базе, а таблица значений — произвольная структура в памяти. Для таблицы значений дополнительно доступны методы Свернуть() и итоги по группам, что удобно для промежуточных расчётов перед выводом в отчёт.

Итог

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

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