Предположим клиент хочет видеть в отчете табличную часть документа и отдельной колонкой сумму всего документа. Тут проблемы нету: соединяем две таблицы и вперед. Проблема возникает когда надо получить итоги в отчете. Стандартная функция СУММА – будет возвращать сумму всех записей по колонке, соответственно сумма документа будет умножена на количество строк в табличной части. Для того чтобы избежать этого можно воспользоваться новыми агрегатными функциями, их было добавлено достаточно много, но нам понадобится функции ТаблицаЗначений, Массив и Сумма. Итак:
ТаблицаЗначений – формирует таблицу значений (сюрприз, сюрприз из колонок которые содержатся в итоговой таблицы после того как отработал процессор компоновки.
МАССИВ – формирует массив записей от группировок или берет 1-ую колонку таблицы значений
Для решения проблемы в выражении вычислении итогового ресурса суммы всех документов (Вкладка Ресурсы, поле Выражение) запишем:
Сумма(МАССИВ ( ТаблицаЗначений( Различные СуммаДокумента, Ссылка)))
,где: Ссылка – колонка ссылок на документ, а СуммаДокумента – это его сумма. Что у нас происходит в тот момент когда СКД пытается вычислить итог:
- Сначала формируется таблица значений из ссылки и суммы по детальным записям нижестоящих группировок. Модификатор Различные гарантирует, что в таблицу попадут только уникальные значения ссылок, что решает вопрос с задвоенными суммами. Обратите внимание на порядок следования колонок: сначала СуммаДокумента, потом Ссылка. Это важно для работы функции Массив!
- Формируется массив из отфильтрованных сумм. В данном случае берется первая колонка таблицы (см. документацию по этой функции), поэтому важно перечислить колонки именно в том порядке как указано в примере: сначала сумма, потом группировка
- Стандартная функция Сумма – вычисляет сумму колонки по нижестоящим детальным записям или итоговую сумму подставленного массива чисел.
Все. То что раньше решалось сложными запросами, ограничениями типа “рассчитывать по” или “ручным” дозаполнением итогов в коде после отработки СКД, теперь решает СКД. Более того использование новых агрегатных функций позволяет снять ограничение на использование любых группировок и отдать их формирование на откуп пользователя.