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