При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартный механизм суммирования ресурсов работает некорректно для специфических показателей. Типичный пример — поле Остаток. Система по умолчанию складывает значения остатков за каждый месяц (или по каждой группировке), что в итоге дает бессмысленную цифру. В этой статье мы разберем по шагам, как либо полностью скрыть итоги по конкретной колонке, либо заставить СКД выводить в итогах правильный «конечный остаток» вместо суммы.
Рассмотрим самый простой и правильный с точки зрения архитектуры СКД способ. Если нам нужно, чтобы итоги считались по всем полям, кроме, например, Остаток, мы должны заглянуть в настройки ресурсов. Многие пытаются просто удалить выражение или оставить его пустым, но это приводит к синтаксической ошибке, так как ресурс обязан иметь агрегатную функцию.
Алгоритм действий:
Остаток.Контрагент, Номенклатура, ПериодСекунда), но не будем добавлять пустую строку (которая символизирует общий итог) и не будем выбирать значение «Все».Проанализируем ситуацию: теперь система будет рассчитывать сумму остатка внутри каждой группы, но, дойдя до самого нижнего уровня — общего итога по всему отчету — она не найдет инструкции для расчета и просто оставит ячейку пустой. Это элегантное решение, не требующее написания кода.
Бывают случаи, когда настройки ресурсов по каким-то причинам менять нельзя (например, ресурс используется в других вычислениях). В такой ситуации мы можем прибегнуть к визуальному сокрытию данных. Разберем, как это сделать с помощью механизмов оформления.
Порядок настройки:
СистемныеПоля.Уровень и установим условие В списке или Равно 0 (в большинстве стандартных структур 0 — это уровень общих итогов).Остаток.Таким образом, данные физически будут рассчитаны, но пользователь увидит в итоговой строке пустую ячейку. Этот метод универсален и подходит для любых типов полей.
Если задача стоит не «скрыть», а «показать правильно», нам необходимо объяснить СКД природу данных. Выясним причину, почему система суммирует остатки. По умолчанию любое числовое поле для СКД — это просто величина, которую можно складывать. Чтобы получить в итоге значение на конец периода, нужно настроить Роли в наборе данных.
Рассмотрим процесс детально:
Остаток и нажмем на карандаш.Конечный остаток.Период или Регистратор), чтобы система понимала хронологию.После этой настройки СКД перестанет арифметически складывать значения 550 + 0 + 0. Вместо этого она возьмет значение из последней временной точки периода. В общих итогах отобразится актуальный остаток на дату окончания отчета.
Для продвинутых пользователей существует способ управления итогами через выражения ресурсов. Если мы хотим, чтобы в группировках была сумма, а в общих итогах — значение последнего элемента, мы можем прописать формулу в колонке Выражение на вкладке Ресурсы.
Посмотрим на пример такого выражения:
ВычислитьВыражение("Сумма(Остаток)", "Месяц", "Группировка", "Последняя")
В данном случае функция ВычислитьВыражение заставляет СКД при расчете итога обратиться к последней записи в группировке Месяц. Это позволяет гибко управлять тем, что именно попадет в подвал отчета.
Разберем типичную ошибку, упомянутую в обсуждениях. Когда разработчик пытается в ресурсах для поля Остаток просто удалить текст в колонке Выражение, 1С выдает «Синтаксическую ошибку». Это происходит потому, что механизм компоновки данных ожидает там обязательную агрегатную функцию (Сумма(), Максимум(), Среднее()). Если вы хотите оставить поле без итогов, используйте Метод 1 (ограничение по группировкам) или Метод 2 (условное оформление), но никогда не оставляйте поле ресурса с пустым выражением, если само поле добавлено в список ресурсов.
Используя предложенные методики, вы сможете добиться профессионального вида отчетов, где итоги выводятся только там, где они действительно имеют смысл.