Как в СКД исключить суммы из итогов по условию, сохранив их в детальных записях, и настроить цветовую индикацию

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке сложных отчетов на базе Системы компоновки данных (СКД) часто возникает специфическая задача: необходимо вывести все данные в строках отчета для детального анализа, но при этом определенные суммы не должны участвовать в расчете общих итогов или итогов по группировкам. Например, если в документе-регистраторе установлен признак НеУчитывать, сумма по этой строке должна отображаться в списке продаж менеджера, но не должна увеличивать общую сумму выручки в подвалах отчета. Дополнительно такие "исключенные" позиции часто требуется выделить цветом для визуального контроля.

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

Метод 1. Настройка выражения ресурса с условием

Самый надежный способ управлять итогами в СКД — это использование логических выражений на закладке "Ресурсы". Компоновщик данных позволяет нам описывать алгоритм агрегации для каждого поля отдельно. Проанализируем, как это работает.

Для того чтобы в детальных записях выводилась полная сумма, а в итогах — сумма за вычетом исключенных документов, нам необходимо изменить стандартную формулу Сумма(СуммаПродаж). Мы применим конструкцию Выбор Когда... Тогда непосредственно в выражении ресурса.

Рассмотрим пошагово алгоритм настройки:

  1. Перейдем на закладку "Ресурсы" в схеме компоновки данных.
  2. Найдем наше поле СуммаПродаж.
  3. В колонке "Выражение" заменим стандартную сумму на следующее выражение:

Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)

Это выражение принудительно обнуляет значения для итогов, если флаг НеУчитывать установлен в значение Истина. Однако здесь есть важный нюанс: если мы оставим такую формулу как основную, то и в детальных записях (в каждой строке) мы увидим "0" вместо реальной суммы, что противоречит нашей задаче. Чтобы этого избежать, воспользуемся колонкой "Рассчитывать по...".

Метод 2. Разделение формул для разных уровней группировок

СКД позволяет задавать разные формулы для одного и того же ресурса в зависимости от того, на каком уровне иерархии он рассчитывается. Это позволяет нам оставить "грязную" сумму в строках и "чистую" в итогах.

Разберем, как это настроить:

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

Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)

Таким образом, система применит обычное суммирование для строк, но при расчете итогов по менеджеру или по месяцу будет игнорировать записи с установленным флагом НеУчитывать.

Метод 3. Реализация цветовой индикации итогов

Согласно условию задачи, если в группировку попала хотя бы одна запись, которая не учитывается в итогах, ячейку итога нужно выделить цветом. Для этого мы воспользуемся механизмом "Условное оформление".

Проанализируем ситуацию: на уровне группировки (например, по менеджеру) нам нужно понять, есть ли среди его документов хотя бы один с флагом НеУчитывать = Истина. Поскольку НеУчитывать — это булево поле, мы можем применить к нему агрегатную функцию Максимум.

Выполним следующие действия:

  1. Перейдем на закладку "Настройки", выберем нужный отчет или конкретную группировку.
  2. Откроем вкладку "Условное оформление".
  3. Добавим новый элемент оформления. В качестве цвета фона выберем, например, светло-красный.
  4. В условии укажем: Максимум(НеУчитывать) Равно Истина.
  5. В области использования выберем поле СуммаПродаж.

Почему это работает? В контексте группировки функция Максимум для булевых полей работает так: если есть хотя бы одно значение Истина, результат будет Истина. Это идеальный способ "прокинуть" информацию о наличии скрытых данных с уровня строк на уровень итогов.

Метод 4. Использование функции ВычислитьВыражение для сложных расчетов

Если структура отчета сложная (например, кросс-таблица), и простые условия в ресурсах не помогают, можно прибегнуть к функции ВычислитьВыражение. Рассмотрим пример, когда нам нужно получить итог по всей колонке, игнорируя определенные строки.

Выражение может выглядеть так:


ВычислитьВыражение("Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе 0 Конец)", "ОбщийИтог")

Этот метод гарантирует, что расчет будет произведен по всему набору данных, независимо от текущих фильтров группировки, но с соблюдением нашего внутреннего условия по полю НеУчитывать.

Важные рекомендации по работе с NULL

При исключении данных из итогов с помощью Иначе 0, в пустых ячейках отчета может начать отображаться цифра "0". Это часто загромождает отчет и делает его нечитаемым. Чтобы в итогах вместо нуля была пустая ячейка, если данных нет или все они исключены, рекомендуется использовать NULL.

Посмотрим на исправленный пример формулы:

Сумма(Выбор Когда НеУчитывать = Ложь Тогда СуммаПродаж Иначе NULL Конец)

Функция Сумма в СКД игнорирует значения типа NULL, поэтому если все продажи менеджера помечены как "не учитывать", итоговая ячейка останется пустой, а не заполненной нулями. Это делает визуальное восприятие отчета гораздо более качественным.

Особенности кросс-таблиц

Если ваш отчет представлен в виде кросс-таблицы (где в колонках Вид продаж, а в строках Месяц и Сотрудник), помните, что итоги рассчитываются на пересечении. Чтобы суммы сходились и по вертикали, и по горизонтали, убедитесь, что формула с условием прописана для всех группировок в ресурсах, кроме Детальных записей.

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

← На главную