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

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

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

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

Постановка задачи и анализ исходных данных

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

Для решения этой задачи нам потребуется механизм вычисляемых полей и ресурсов СКД.

Шаг 1. Разделение данных и агрегирование в Ресурсах

Первая и самая важная ошибка многих начинающих разработчиков — попытка написать формулу расчета процента непосредственно на вкладке Вычисляемые поля в виде простого деления:

Выполнено / План * 100

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

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

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


Количество(Различные Выбор Когда СостояниеМероприятия В(&СостоянияВыполнения) Тогда Регистратор Конец) / Количество(Различные Выбор Когда СостояниеМероприятия В(&СостоянияПлана) Тогда Регистратор Конец) * 100

Если состояния определяются признаком (реквизитом) справочника, например, булевым флагом ПлановоеСостояние, то формула упрощается и становится более универсальной:


Количество(Различные Выбор Когда Не СостояниеМероприятия.ПлановоеСостояние Тогда Регистратор Конец) / Количество(Различные Выбор Когда СостояниеМероприятия.ПлановоеСостояние Тогда Регистратор Конец) * 100

Данные выражения мы помещаем строго в колонку Выражение на вкладке Ресурсы для нашего вычисляемого поля.

Шаг 2. Почему при делении «числа на число» получается пустота?

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

  1. Влияние NULL в арифметических операциях. В СКД (как и в SQL) любое арифметическое действие с участием NULL дает результат NULL. Если хотя бы по одному из условий (план или факт) возвращается пустое значение, весь результат расчета превратится в пустоту. Чтобы этого избежать, необходимо принудительно преобразовывать NULL в ноль с помощью функции ЕСТЬNULL еще на уровне запроса или использовать проверку в самом выражении ресурса.
  2. Отсутствие проверки деления на ноль. Если знаменатель равен нулю, СКД возвращает пустое значение. Чтобы отчет выглядел профессионально, необходимо явно прописать условие проверки знаменателя.

Безопасный и правильный вариант выражения на вкладке Ресурсы должен выглядеть следующим образом:


Выбор 
    Когда Количество(Различные Выбор Когда СостояниеМероприятия.ПлановоеСостояние Тогда Регистратор Конец) = 0 
    Тогда 0 
    Иначе Количество(Различные Выбор Когда Не СостояниеМероприятия.ПлановоеСостояние Тогда Регистратор Конец) / Количество(Различные Выбор Когда СостояниеМероприятия.ПлановоеСостояние Тогда Регистратор Конец) * 100 
Конец

Шаг 3. Борьба с дублированием колонки процента в группировках

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

Рассмотрим несколько способов решения этой проблемы.

Способ 1. Использование настройки «Рассчитывать по...» (Рекомендуемый)

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

Разберем его по шагам:

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

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

Способ 2. Управление группировками колонок вручную

Если по каким-то причинам первый способ не подходит, можно воспользоваться методом, предложенным в сообщении 11 обсуждения на форуме. Для этого:

  1. В настройках отчета на вкладке Структура отключите вывод общих итогов по горизонтали.
  2. Добавьте отдельную группировку в колонках таблицы, которая будет отвечать исключительно за вывод общего итога, и настройте вывод ресурса только для нее.

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

Способ 3. Использование Условного оформления

Если вам нужно физически сохранить колонку в структуре, но скрыть конкретные нелогичные значения (сделать их визуально пустыми), можно использовать механизм условного оформления:

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

Альтернативные методы расчета процентов

Стоит помнить, что в СКД есть мощные встроенные инструменты, позволяющие избежать написания сложных формул вручную:

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

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

← На главную