При разработке сложных отчетов на базе Системы компоновки данных (СКД) часто возникает специфическая задача: необходимо вывести все данные в строках отчета для детального анализа, но при этом определенные суммы не должны участвовать в расчете общих итогов или итогов по группировкам. Например, если в документе-регистраторе установлен признак НеУчитывать, сумма по этой строке должна отображаться в списке продаж менеджера, но не должна увеличивать общую сумму выручки в подвалах отчета. Дополнительно такие "исключенные" позиции часто требуется выделить цветом для визуального контроля.
В этой статье мы подробно разберем, как реализовать подобную логику, используя стандартные механизмы СКД без написания сложного программного кода.
Самый надежный способ управлять итогами в СКД — это использование логических выражений на закладке "Ресурсы". Компоновщик данных позволяет нам описывать алгоритм агрегации для каждого поля отдельно. Проанализируем, как это работает.
Для того чтобы в детальных записях выводилась полная сумма, а в итогах — сумма за вычетом исключенных документов, нам необходимо изменить стандартную формулу Сумма(СуммаПродаж). Мы применим конструкцию Выбор Когда... Тогда непосредственно в выражении ресурса.
Рассмотрим пошагово алгоритм настройки:
СуммаПродаж.
Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)
Это выражение принудительно обнуляет значения для итогов, если флаг НеУчитывать установлен в значение Истина. Однако здесь есть важный нюанс: если мы оставим такую формулу как основную, то и в детальных записях (в каждой строке) мы увидим "0" вместо реальной суммы, что противоречит нашей задаче. Чтобы этого избежать, воспользуемся колонкой "Рассчитывать по...".
СКД позволяет задавать разные формулы для одного и того же ресурса в зависимости от того, на каком уровне иерархии он рассчитывается. Это позволяет нам оставить "грязную" сумму в строках и "чистую" в итогах.
Разберем, как это настроить:
СуммаПродаж в ресурсы дважды.Детальные записи. В выражении напишем просто: Сумма(СуммаПродаж).Сотрудник, Месяц) и Общий итог. Здесь мы применим нашу формулу с фильтром:
Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)
Таким образом, система применит обычное суммирование для строк, но при расчете итогов по менеджеру или по месяцу будет игнорировать записи с установленным флагом НеУчитывать.
Согласно условию задачи, если в группировку попала хотя бы одна запись, которая не учитывается в итогах, ячейку итога нужно выделить цветом. Для этого мы воспользуемся механизмом "Условное оформление".
Проанализируем ситуацию: на уровне группировки (например, по менеджеру) нам нужно понять, есть ли среди его документов хотя бы один с флагом НеУчитывать = Истина. Поскольку НеУчитывать — это булево поле, мы можем применить к нему агрегатную функцию Максимум.
Выполним следующие действия:
Максимум(НеУчитывать) Равно Истина.СуммаПродаж.Почему это работает? В контексте группировки функция Максимум для булевых полей работает так: если есть хотя бы одно значение Истина, результат будет Истина. Это идеальный способ "прокинуть" информацию о наличии скрытых данных с уровня строк на уровень итогов.
Если структура отчета сложная (например, кросс-таблица), и простые условия в ресурсах не помогают, можно прибегнуть к функции ВычислитьВыражение. Рассмотрим пример, когда нам нужно получить итог по всей колонке, игнорируя определенные строки.
Выражение может выглядеть так:
ВычислитьВыражение("Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)", "ОбщийИтог")
Этот метод гарантирует, что расчет будет произведен по всему набору данных, независимо от текущих фильтров группировки, но с соблюдением нашего внутреннего условия по полю НеУчитывать.
При исключении данных из итогов с помощью Иначе 0, в пустых ячейках отчета может начать отображаться цифра "0". Это часто загромождает отчет и делает его нечитаемым. Чтобы в итогах вместо нуля была пустая ячейка, если данных нет или все они исключены, рекомендуется использовать NULL.
Посмотрим на исправленный пример формулы:
Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе NULL Конец)
Функция Сумма в СКД игнорирует значения типа NULL, поэтому если все продажи менеджера помечены как "не учитывать", итоговая ячейка останется пустой, а не заполненной нулями. Это делает визуальное восприятие отчета гораздо более качественным.
Если ваш отчет представлен в виде кросс-таблицы (где в колонках Вид продаж, а в строках Месяц и Сотрудник), помните, что итоги рассчитываются на пересечении. Чтобы суммы сходились и по вертикали, и по горизонтали, убедитесь, что формула с условием прописана для всех группировок в ресурсах, кроме Детальных записей.
Проанализировав эти методы, мы видим, что СКД предоставляет гибкий инструментарий для манипуляции итогами без необходимости изменения запроса или использования постобработки в коде 1С. Сочетание условий в ресурсах и агрегатных функций в условном оформлении позволяет решить задачу "победы над СКД" максимально эффективно.