В практике разработки на платформе 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 КОНЕЦ) КАК КоличествоДокументов
ИЗ
Справочник.Студенты КАК Студенты
ГДЕ
НЕ Студенты.ЭтоГруппа
Почему это важно: такой подход позволяет СКД на этапе компоновки результата мгновенно суммировать поле КоличествоДокументов по любым уровням иерархии (группа, поток, ВУЗ) без лишних вычислений в коде.
Если по каким-то причинам мы не хотим менять основной запрос или данные приходят из внешнего источника, мы можем воспользоваться механизмом вычисляемых полей на соответствующей вкладке в конструкторе СКД. Это позволяет оставить запрос «чистым», а логику преобразования перенести в настройки компоновки.
Разберем шаги настройки:
ДокументыЧислом.ВЫБОР КОГДА Поле1 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ + ....Однако помните, что вычисляемые поля работают чуть медленнее, чем расчеты внутри запроса СУБД, поэтому для больших объемов данных (десятки тысяч студентов) предпочтительнее первый метод.
Теперь выясним причину, по которой простое суммирование не даст нам процента в иерархии. Процент — это отношение факта к плану. В нашем случае «план» для одного студента — это 8 документов. Для группы из 10 студентов «план» — это 80 документов.
Чтобы отчет корректно считал данные на любом уровне иерархии, нам нужно правильно настроить Ресурсы. Перейдем на вкладку «Ресурсы» и добавим поле ПроцентВыполнения. В поле «Выражение» нам необходимо использовать агрегатные функции:
Сумма(КоличествоДокументов) / (Количество(Студент) * 8) * 100
Проанализируем эту формулу:
Сумма(КоличествоДокументов) — складывает все «единички» (сданные документы) всех студентов, попавших в текущую группировку.Количество(Студент) — считает количество записей (студентов) в этой группе.* 8 — умножает количество студентов на максимально возможное количество документов.Важный нюанс: Если в вашей базе данных могут быть группы без студентов («пустые ветки»), при расчете возникнет ошибка деления на ноль. Чтобы этого избежать, используем проверку:
ВЫБОР
КОГДА Количество(Студент) > 0
ТОГДА Сумма(КоличествоДокументов) / (Количество(Студент) * 8) * 100
ИНАЧЕ 0
КОНЕЦ
Существует еще более элегантный способ, который часто упускают из виду. Если мы преобразуем каждое из 8 булевых полей в число (0 или 1), то среднее арифметическое всех этих полей, умноженное на 100, и будет искомым процентом.
Рассмотрим пример ресурса, если бы мы сделали 8 отдельных числовых полей в запросе:
Среднее(Поле1 + Поле2 + Поле3 + Поле4 + Поле5 + Поле6 + Поле7 + Поле8) / 8 * 100
Функция Среднее в СКД обладает замечательным свойством: она автоматически учитывает иерархию и количество строк, избавляя нас от необходимости вручную прописывать знаменатель в формуле.
Если задача стоит иначе — например, нужно понять, какой вклад в общую массу документов внесла конкретная группа (относительно всех групп), — мы можем воспользоваться встроенными возможностями СКД. В настройках отчета (вкладка «Выбранные поля») у поля-ресурса можно нажать правую кнопку мыши и выбрать пункт Процент в группе или Процент в иерархии. Платформа сама вычислит долю текущей строки в общем итоге вышестоящей группировки.
Чтобы отчет был читаемым и наглядным (особенно для руководства или кураторов групп), полезно добавить цветовое выделение. Посмотрим, как это сделать:
ПроцентВыполнения Меньше 50. В оформлении выберем «Цвет текста» — Красный.ПроцентВыполнения Равно 100. В оформлении выберем «Цвет фона» — Светло-зеленый.ПроцентВыполнения в настройках поля укажем Формат: ЧЦ=5; ЧДЦ=2 (чтобы видеть два знака после запятой и символ процента).Таким образом, мы не только посчитали сухие цифры, но и создали полноценный аналитический инструмент, который сразу подсвечивает проблемные зоны в иерархии учебного процесса.