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