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