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