Как в иерархическом отчете 1С посчитать процент выполнения на основе булевых полей

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

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

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

Метод 1. Подготовка данных на уровне запроса

Для того чтобы система компоновки данных могла эффективно оперировать значениями типа Булево (Истина/Ложь) как числами, первым делом проанализируем структуру запроса. Платформа 1С не позволяет напрямую суммировать логические значения. Поэтому нам необходимо преобразовать каждый флаг в число 1 (если документ есть) или 0 (если документа нет).

Рассмотрим пример построения текста запроса. Вместо того чтобы просто выбирать поля документов, мы создадим вычисляемое поле прямо в тексте SQL-запроса 1С. Допустим, у нас есть 8 полей: Документ1, Документ2 и так далее.

Пропишем логику суммирования баллов для каждого студента:


ВЫБРАТЬ
    Студенты.Ссылка КАК Студент,
    Студенты.Родитель КАК Группа,
    (ВЫБОР КОГДА Студенты.Документ1 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ2 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ3 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ4 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ5 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ6 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ7 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ +
     ВЫБОР КОГДА Студенты.Документ8 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК КоличествоДокументов
ИЗ
    Справочник.Студенты КАК Студенты
ГДЕ
    НЕ Студенты.ЭтоГруппа

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

Метод 2. Использование вычисляемых полей СКД

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

Разберем шаги настройки:

  1. Переходим на вкладку Вычисляемые поля.
  2. Добавляем новое поле, например, ДокументыЧислом.
  3. В колонке «Выражение» прописываем аналогичную конструкцию: ВЫБОР КОГДА Поле1 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ + ....
  4. В колонке «Заголовок» указываем понятное название, например, «Кол-во док.».

Однако помните, что вычисляемые поля работают чуть медленнее, чем расчеты внутри запроса СУБД, поэтому для больших объемов данных (десятки тысяч студентов) предпочтительнее первый метод.

Метод 3. Математическая логика расчета в ресурсах

Теперь выясним причину, по которой простое суммирование не даст нам процента в иерархии. Процент — это отношение факта к плану. В нашем случае «план» для одного студента — это 8 документов. Для группы из 10 студентов «план» — это 80 документов.

Чтобы отчет корректно считал данные на любом уровне иерархии, нам нужно правильно настроить Ресурсы. Перейдем на вкладку «Ресурсы» и добавим поле ПроцентВыполнения. В поле «Выражение» нам необходимо использовать агрегатные функции:

Сумма(КоличествоДокументов) / (Количество(Студент) * 8) * 100

Проанализируем эту формулу:

Важный нюанс: Если в вашей базе данных могут быть группы без студентов («пустые ветки»), при расчете возникнет ошибка деления на ноль. Чтобы этого избежать, используем проверку:


ВЫБОР 
    КОГДА Количество(Студент) > 0 
    ТОГДА Сумма(КоличествоДокументов) / (Количество(Студент) * 8) * 100 
    ИНАЧЕ 0 
КОНЕЦ

Метод 4. Быстрый способ через функцию «Среднее»

Существует еще более элегантный способ, который часто упускают из виду. Если мы преобразуем каждое из 8 булевых полей в число (0 или 1), то среднее арифметическое всех этих полей, умноженное на 100, и будет искомым процентом.

Рассмотрим пример ресурса, если бы мы сделали 8 отдельных числовых полей в запросе:

Среднее(Поле1 + Поле2 + Поле3 + Поле4 + Поле5 + Поле6 + Поле7 + Поле8) / 8 * 100

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

Метод 5. Использование системных полей «Процент в иерархии»

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

Визуализация и условное оформление

Чтобы отчет был читаемым и наглядным (особенно для руководства или кураторов групп), полезно добавить цветовое выделение. Посмотрим, как это сделать:

  1. На вкладке Настройки перейдем на закладку Условное оформление.
  2. Добавим новое условие: ПроцентВыполнения Меньше 50. В оформлении выберем «Цвет текста» — Красный.
  3. Добавим второе условие: ПроцентВыполнения Равно 100. В оформлении выберем «Цвет фона» — Светло-зеленый.
  4. Для самого поля ПроцентВыполнения в настройках поля укажем Формат: ЧЦ=5; ЧДЦ=2 (чтобы видеть два знака после запятой и символ процента).

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

← На главную