Как в СКД настроить процентную диаграмму и сгруппировать показатели по интервалам

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

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

Часть 1. Отображение процентного соотношения на диаграмме (Пол пациентов)

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

Частой ошибкой начинающих разработчиков является использование функции КоличествоРазличные при настройке ресурса для поля Пол. Проанализируем, почему это приводит к неверному результату. Функция КоличествоРазличные подсчитывает количество уникальных значений перечисления, которые встретились в выборке. Так как уникальных значений всего два (мужской и женский, реже три — с учетом неопределенного), система для любой выборки вернет результат «50/50» или «33/33/33». Это не отражает реальное количество пациентов.

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

  1. Перейдем на вкладку «Ресурсы» в схеме компоновки данных.
  2. Добавим поле пола или уникальный идентификатор пациента (например, Ссылка) в список ресурсов.
  3. В качестве выражения укажем функцию Количество(Ссылка) вместо функции КоличествоРазличные.

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

  1. Перейдем на вкладку «Настройки» и выберем элемент структуры «Диаграмма».
  2. В правой нижней части экрана найдем вкладку «Другие настройки».
  3. Найдем параметр «Состав подписей» и установим для него одно из значений:
    • Процент — на секторах диаграммы отобразятся только проценты (например, 45% и 55%).
    • Серия + процент — выведет наименование пола и его долю (например, Мужской (45%) и Женский (55%)).

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

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

Данная формула берет количество пациентов текущей группировки (например, только мужчин), умножает на 100 и делит на общее количество пациентов по всему отчету (область расчета — "ОбщийИтог"). Это позволяет динамически получать точный процент на любом уровне детализации.

Часть 2. Группировка числовых данных по интервалам (Возраст пациентов)

Вторая важная задача — группировка непрерывных числовых данных в диапазоны. Если мы попытаемся вывести возраст каждого пациента на диаграмму напрямую, то получим хаотичный набор сотен мелких секторов или столбцов. Нам необходимо объединить их в группы (например: до 10 лет, 11-20 лет, 21-30 лет и т.д.).

Рассмотрим три эффективных способа реализации этой логики в СКД.

Способ А: Использование вычисляемого поля СКД

Этот способ удобен тем, что расчеты происходят непосредственно в схеме компоновки данных без изменения основного текста запроса. Сначала нам нужно корректно рассчитать возраст пациента. Рассчитывать возраст относительно жестко заданной текущей даты компьютера — плохая практика, так как при формировании отчета за прошлые периоды данные будут неактуальными. Лучше считать возраст относительно параметра отчета &КонецПериода.

Посмотрим на пример формулы расчета возраста на вкладке «Вычисляемые поля». Добавим поле Возраст со следующим выражением:


Год(&КонецПериода) - Год(ДатаРождения) - (Выбор Когда Месяц(&КонецПериода) < Месяц(ДатаРождения) Или (Месяц(&КонецПериода) = Месяц(ДатаРождения) И День(&КонецПериода) < День(ДатаРождения)) Тогда 1 Иначе 0 Конец)

Теперь создадим второе вычисляемое поле с именем ВозрастнаяГруппа. В колонке «Выражение» напишем конструкцию ВЫБОР, которая распределит полученный возраст по интервалам:


Выбор 
    Когда Возраст < 11 Тогда "До 10 лет"
    Когда Возраст >= 11 И Возраст <= 20 Тогда "11-20 лет"
    Когда Возраст >= 21 И Возраст <= 30 Тогда "21-30 лет"
    Когда Возраст >= 31 И Возраст <= 40 Тогда "31-40 лет"
    Иначе "Старше 40 лет"
Конец

Способ Б: Пользовательское поле вида «Выбор»

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

  1. В режиме конфигуратора или в режиме предприятия откройте вкладку «Настройки», затем перейдите на вкладку «Пользовательские поля».
  2. Добавьте новое поле с типом «Новое поле выбора...».
  3. Задайте для него имя (например, ВозрастнойДиапазон).
  4. В табличной части вариантов добавьте строки для каждого интервала:
    • Для первой строки укажите отбор: Возраст Меньше 11 и введите значение представления: "До 10 лет".
    • Для второй строки укажите отбор: Возраст Больше или равно 11 И Возраст Меньше или равно 20, представление: "11-20 лет".
    • Повторите операцию для всех нужных диапазонов.

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

Способ В: Классификация на уровне SQL-запроса

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


ВЫБРАТЬ
    Пациенты.Ссылка КАК Пациент,
    РАЗНОСТЬДАТ(Пациенты.ДатаРождения, &КонецПериода, ГОД) КАК ВозрастПОЛНЫЙ
ПОМЕСТИТЬ ВТ_Возраст
ИЗ
    Справочник.Пациенты КАК Пациенты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Возраст.Пациент КАК Пациент,
    ВЫБОР
        КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ < 11 ТОГДА "До 10 лет"
        КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ МЕЖДУ 11 И 20 ТОГДА "11-20 лет"
        КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ МЕЖДУ 21 И 30 ТОГДА "21-30 лет"
        ИНАЧЕ "Старше 30 лет"
    КОНЕЦ КАК ВозрастнаяГруппа
ИЗ
    ВТ_Возраст КАК ВТ_Возраст

Использование конструкции МЕЖДУ в запросе оптимизирует чтение данных СУБД, а итоговое поле ВозрастнаяГруппа сразу поступает в СКД в готовом для группировки виде.

Часть 3. Как вывести интервалы на диаграмму СКД

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

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

Использование правильных функций агрегации ресурсов и структурирование данных по интервалам позволяет создавать профессиональные и информативные аналитические отчеты в «1С:Предприятие».

← На главную