Как получить корректную сумму ресурса у задвоенных записей. Использование новых агрегатных функций. Доступно, по-моему с 14 релиза 8.2.

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

Для решения проблемы в выражении вычислении итогового ресурса суммы всех документов (Вкладка Ресурсы, поле Выражение) запишем:

Сумма(МАССИВ ( ТаблицаЗначений( Различные СуммаДокумента, Ссылка)))

,где: Ссылка – колонка ссылок на документ, а СуммаДокумента – это его сумма. Что у нас происходит в тот момент когда СКД пытается вычислить итог:

  1. Сначала формируется таблица значений из ссылки и суммы по детальным записям нижестоящих группировок. Модификатор Различные гарантирует, что в таблицу попадут только уникальные значения ссылок, что решает вопрос с задвоенными суммами. Обратите внимание на порядок следования колонок: сначала СуммаДокумента, потом Ссылка. Это важно для работы функции Массив!
  2. Формируется массив из отфильтрованных сумм. В данном случае берется первая колонка таблицы (см. документацию по этой функции), поэтому важно перечислить колонки именно в том порядке как указано в примере:  сначала сумма, потом группировка
  3. Стандартная функция Сумма – вычисляет сумму колонки по нижестоящим детальным записям или итоговую сумму подставленного массива чисел.

Все. То что раньше решалось сложными запросами, ограничениями типа “рассчитывать по” или “ручным” дозаполнением итогов в коде после отработки СКД, теперь решает СКД. Более того использование новых агрегатных функций позволяет снять ограничение на использование любых группировок и отдать их формирование на откуп пользователя.

Подписаться
Уведомить о
guest
6 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
also
10 лет назад

Спасибо за статью, новые функции 8.2.14 действительно очень хороши!

Evgeniy
Evgeniy
10 лет назад

Хорошая статья, вот только если в таблице будут присутствовать несколько значений почитается только 1но.. Например 2ве единицы одной номенклатуре в сумме выдаст только одну единицу.

Evgeniy
Evgeniy
10 лет назад

Приведу пример для понятности:), Есть товар1 с ценой 10 и товар 2ва с ценой 10. В сумме будет так же будет 10.

Evgeniy
Evgeniy
10 лет назад

Простите не так понял значит. Статья действительно хорошая, похоже просто не там пытался применить. Кстати в моем случае вопрос решился правильной группировкой, может кто столкнется с похожей проблемой.

echo77
echo77
9 лет назад

На самом деле все на много проще – соединением наборов данных