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

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

При разработке отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с математической дилеммой: как рассчитать показатель, который имеет смысл только для итогов по группе, но абсолютно бесполезен или даже ошибочен на уровне отдельных строк (детальных записей). Классический пример — расчет процента выполнения плана или отношения остатков. Если мы просто рассчитаем процент в каждой строке и просуммируем его в итогах, мы получим «цену на дрова», так как сумма процентов не равна проценту от общих сумм.

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

Метод 1: Настройка ресурса через колонку «Рассчитывать по»

Рассмотрим стандартную ситуацию. У нас есть группировка Склад, внутри которой находятся Номенклатура (детальные записи). Нам нужно посчитать отношение начального остатка к конечному в целом по складу. Логика расчета должна быть следующей: Сумма(НачальныйОстаток) / Сумма(КонечныйОстаток).

Для реализации этого метода выполним следующие шаги:

  1. Перейдем на закладку «Вычисляемые поля» и добавим новое поле, назовем его ПроцентОстатка. В выражении укажем 0. Это создаст поле-заглушку.
  2. Перейдем на закладку «Ресурсы». Здесь кроется основная хитрость. Мы добавим наше поле ПроцентОстатка в список ресурсов дважды.
  3. Для первой записи в колонке «Выражение» напишем нашу формулу. Важно предусмотреть проверку на деление на ноль:
    
    ВЫБОР 
        КОГДА Сумма(КонечныйОстаток) <> 0 
        ТОГДА 100 * (Сумма(НачальныйОстаток) / Сумма(КонечныйОстаток)) 
        ИНАЧЕ 0 
    КОНЕЦ
    
  4. В этой же первой записи в колонке «Рассчитывать по...» снимем все флажки и установим только один — напротив группировки Склад. Теперь СКД будет применять эту формулу только при расчете итогов по складу.
  5. Для второй записи того же ресурса ПроцентОстатка в выражении просто укажем 0 (или NULL, если хотим пустую ячейку). В колонке «Рассчитывать по...» установим флажки для всех остальных группировок, включая детальные записи.

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

Метод 2: Использование системной функции Уровень()

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

В выражении ресурса на закладке «Ресурсы» можно написать условие, которое проверяет глубину вложенности текущей строки. Например, если склад — это первый уровень группировки, формула примет вид:


ВЫБОР 
    КОГДА Уровень() = 1 
    ТОГДА Сумма(НачальныйОстаток) / Сумма(КонечныйОстаток) 
    ИНАЧЕ 0 
КОНЕЦ

Однако стоит помнить, что функция Уровень() зависит от настроек структуры отчета в пользовательском режиме. Если пользователь добавит новую вышестоящую группировку (например, Организация), уровни сместятся, и логика расчета может нарушиться. Поэтому данный метод хорош для жестко заданных структур.

Метод 3: Условное оформление для скрытия значений

Иногда расчет в детальных записях все же происходит (например, если этого требует логика других полей), но нам просто не нужно показывать его пользователю. В этом случае мы можем использовать механизм Условного оформления.

Посмотрим, как это настроить:

  1. На закладке «Настройки» перейдем в «Условное оформление».
  2. Добавим новое правило. В оформлении выберем параметр «Текст» и оставим его пустым.
  3. В условии укажем, что оформление применяется только для определенных уровней. В СКД для этого есть системное поле СистемныеПоля.Уровень или можно использовать условие по наличию значения в полях группировки.
  4. В области использования укажем только наше поле ПроцентОстатка.

Этот способ является наиболее «чистым» визуально, так как в ячейках вместо нулей будет пустота, что не отвлекает пользователя от анализа важных данных.

Метод 4: Продвинутый расчет через ВычислитьВыражение

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

Пример выражения для ресурса:

Сумма(Продажи) / ВычислитьВыражение("Сумма(Продажи)", "ОбщийИтог") * 100

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

Важные нюансы при работе с общими итогами

Проанализируем частую ошибку: программист настроил расчет по группировке Склад, но забыл про строку «Общие итоги» в самом конце отчета. Если в колонке «Рассчитывать по» для формулы процента не стоит флаг «Общие итоги», то в самом низу отчета будет выведен 0 или пустота.

Если же процент для всех складов в совокупности имеет смысл, обязательно продублируйте флажок «Рассчитывать по» для общих итогов. Если смысл имеет только средний процент по складам, то формула может измениться на Среднее(ВычислитьВыражениеСГруппировкойМассив(...)), что позволит избежать математических искажений при работе с «процентом от процента».

Таким образом, мы выяснили, что СКД предоставляет гибкий инструментарий для управления расчетами. Комбинируя настройки ресурсов с «Рассчитывать по» и условное оформление, можно добиться профессионального вида отчета, где каждая цифра находится на своем месте и не вводит пользователя в заблуждение.

← На главную