При разработке отчетов на системе компоновки данных (СКД) в «1С:Предприятие» программисты часто сталкиваются с необходимостью визуализации данных. Одной из популярных задач является вывод информации в виде диаграмм. Однако стандартные настройки не всегда сразу дают желаемый результат. В этой статье мы подробно разберем две практические задачи: как правильно рассчитать и вывести процентное соотношение на круговой диаграмме (на примере пола пациентов) и как сгруппировать числовые показатели (возраст) по диапазонам для построения наглядных гистограмм.
Рассмотрим ситуацию, когда в информационной базе ведется учет пациентов, и нам необходимо вывести на круговой диаграмме соотношение мужчин и женщин в процентах. Пол пациента обычно хранится в виде значения перечисления.
Частой ошибкой начинающих разработчиков является использование функции КоличествоРазличные при настройке ресурса для поля Пол. Проанализируем, почему это приводит к неверному результату. Функция КоличествоРазличные подсчитывает количество уникальных значений перечисления, которые встретились в выборке. Так как уникальных значений всего два (мужской и женский, реже три — с учетом неопределенного), система для любой выборки вернет результат «50/50» или «33/33/33». Это не отражает реальное количество пациентов.
Выясним причину и исправим ее. Для построения корректного процентного соотношения необходимо подсчитывать общее количество записей по каждому полу. Выполним следующие шаги:
Ссылка) в список ресурсов.Количество(Ссылка) вместо функции КоличествоРазличные.Теперь система будет считать физическое количество мужчин и женщин в базе данных. Чтобы сама круговая диаграмма отображала данные именно в процентах, настроим ее свойства в СКД без написания кода:
Процент — на секторах диаграммы отобразятся только проценты (например, 45% и 55%).Серия + процент — выведет наименование пола и его долю (например, Мужской (45%) и Женский (55%)).Если вам требуется вывести процентное соотношение не только на графике, но и в сопутствующей таблице, можно рассчитать его программно в выражении ресурса. Разберем пример формулы расчета доли с использованием встроенной функции СКД ВычислитьВыражение:
Количество(Ссылка) * 100 / ВычислитьВыражение("Количество(Ссылка)", "ОбщийИтог")
Данная формула берет количество пациентов текущей группировки (например, только мужчин), умножает на 100 и делит на общее количество пациентов по всему отчету (область расчета — "ОбщийИтог"). Это позволяет динамически получать точный процент на любом уровне детализации.
Вторая важная задача — группировка непрерывных числовых данных в диапазоны. Если мы попытаемся вывести возраст каждого пациента на диаграмму напрямую, то получим хаотичный набор сотен мелких секторов или столбцов. Нам необходимо объединить их в группы (например: до 10 лет, 11-20 лет, 21-30 лет и т.д.).
Рассмотрим три эффективных способа реализации этой логики в СКД.
Этот способ удобен тем, что расчеты происходят непосредственно в схеме компоновки данных без изменения основного текста запроса. Сначала нам нужно корректно рассчитать возраст пациента. Рассчитывать возраст относительно жестко заданной текущей даты компьютера — плохая практика, так как при формировании отчета за прошлые периоды данные будут неактуальными. Лучше считать возраст относительно параметра отчета &КонецПериода.
Посмотрим на пример формулы расчета возраста на вкладке «Вычисляемые поля». Добавим поле Возраст со следующим выражением:
Год(&КонецПериода) - Год(ДатаРождения) - (Выбор Когда Месяц(&КонецПериода) < Месяц(ДатаРождения) Или (Месяц(&КонецПериода) = Месяц(ДатаРождения) И День(&КонецПериода) < День(ДатаРождения)) Тогда 1 Иначе 0 Конец)
Теперь создадим второе вычисляемое поле с именем ВозрастнаяГруппа. В колонке «Выражение» напишем конструкцию ВЫБОР, которая распределит полученный возраст по интервалам:
Выбор
Когда Возраст < 11 Тогда "До 10 лет"
Когда Возраст >= 11 И Возраст <= 20 Тогда "11-20 лет"
Когда Возраст >= 21 И Возраст <= 30 Тогда "21-30 лет"
Когда Возраст >= 31 И Возраст <= 40 Тогда "31-40 лет"
Иначе "Старше 40 лет"
Конец
Если требуется предоставить пользователю возможность самостоятельно менять границы возрастных групп в режиме «1С:Предприятие», лучше использовать механизм пользовательских полей. Разберем по шагам, как это настроить:
ВозрастнойДиапазон).Возраст Меньше 11 и введите значение представления: "До 10 лет".Возраст Больше или равно 11 И Возраст Меньше или равно 20, представление: "11-20 лет".Этот метод чрезвычайно гибок, так как не требует изменения кода конфигурации при смене маркетинговых или медицинских возрастных стандартов.
Для систем с высокой нагрузкой и миллионами записей обработка условий на уровне вычисляемых полей СКД может привести к замедлению работы. В таких случаях классификацию лучше перенести непосредственно в тело запроса к СУБД. Проанализируем пример запроса, выполняющего группировку:
ВЫБРАТЬ
Пациенты.Ссылка КАК Пациент,
РАЗНОСТЬДАТ(Пациенты.ДатаРождения, &КонецПериода, ГОД) КАК ВозрастПОЛНЫЙ
ПОМЕСТИТЬ ВТ_Возраст
ИЗ
Справочник.Пациенты КАК Пациенты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Возраст.Пациент КАК Пациент,
ВЫБОР
КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ < 11 ТОГДА "До 10 лет"
КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ МЕЖДУ 11 И 20 ТОГДА "11-20 лет"
КОГДА ВТ_Возраст.ВозрастПОЛНЫЙ МЕЖДУ 21 И 30 ТОГДА "21-30 лет"
ИНАЧЕ "Старше 30 лет"
КОНЕЦ КАК ВозрастнаяГруппа
ИЗ
ВТ_Возраст КАК ВТ_Возраст
Использование конструкции МЕЖДУ в запросе оптимизирует чтение данных СУБД, а итоговое поле ВозрастнаяГруппа сразу поступает в СКД в готовом для группировки виде.
После того как мы успешно настроили поле возрастной группы (одним из описанных выше способов), нам остается правильно вывести его на графическую схему:
ВозрастнаяГруппа (или пользовательское поле выбора). Поле «Серии» можно оставить пустым, если нам нужно простое распределение.Количество(Пациент).Использование правильных функций агрегации ресурсов и структурирование данных по интервалам позволяет создавать профессиональные и информативные аналитические отчеты в «1С:Предприятие».