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