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