При построении сложных отчетов с использованием Системы Компоновки Данных (СКД) разработчики часто сталкиваются с особенностями визуализации графиков и диаграмм. Типичная ситуация: в отчете необходимо вывести две серии данных на одном графике. Первая серия представляет собой плавную кривую (например, синусоиду или график продаж), а вторая серия — набор отдельных точек (факты, события или референтные значения). Если значения по горизонтальной оси (оси X) у этих серий не совпадают, стандартный механизм СКД может «сломать» основную линию, сбрасывая её значение в ноль в тех точках, где данные есть только у второй серии. В этой статье мы подробно разберем, почему это происходит и как настроить корректное отображение графиков.
Разберем ситуацию более детально. Когда мы используем Линейную диаграмму в СКД, платформа 1С интерпретирует значения по оси X как категории (точки). Если в наборе данных для «Серии 1» есть значения для X=1, X=2, X=4, а для «Серии 2» — для X=3, СКД формирует общую шкалу категорий: 1, 2, 3, 4. Поскольку в «Серии 1» значение для точки X=3 отсутствует, система подставляет туда пустое значение или ноль. В результате линия основной серии либо прерывается, либо резко падает к нулевой отметке, что портит визуальное восприятие и вводит пользователя в заблуждение.
Проанализируем основные способы решения этой задачи, начиная от простых настроек интерфейса и заканчивая программными методами обработки данных.
Это самый быстрый и эффективный метод, доступный непосредственно в настройках СКД. Платформа предусматривает специальный параметр управления поведением линий диаграммы при отсутствии данных в промежуточных узлах.
Рассмотрим по шагам, как применить эту настройку:
Важный нюанс: при такой настройке СКД проигнорирует «пустоту» в данных одной серии и соединит имеющиеся точки прямой линией. Если ваша зависимость (например, синусоида) требует высокой точности, помните, что это соединение будет линейным, а не сглаженным по функции.
Прежде чем настраивать визуализацию, необходимо убедиться, что данные в СКД поступают в правильном формате. Рассмотрим разницу в обработке значений:
0, график обязательно отрисует точку на оси абсцисс. Свойство «Соединение не пропущенных» в этом случае не сработает, так как ноль — это тоже данные.NULL.Посмотрим на пример правильного формирования запроса. Если мы используем ЛЕВОЕ СОЕДИНЕНИЕ, важно не превращать NULL в 0 через функцию ЕСТЬNULL() в тех полях, которые отвечают за ресурс графика, если мы хотим, чтобы линия прошла «сквозь» эту точку.
Проанализируем пример кода в вычисляемых полях или запросе:
// Неправильно для графика:
ЕСТЬNULL(СуммаОборота, 0)
// Правильно для работы механизма пропуска точек:
СуммаОборота // Оставляем как есть, чтобы при отсутствии записи пришел NULL
Если ваша зависимость является математической (как синусоида в примере автора темы), то использование Линейной диаграммы изначально может быть не совсем верным. Разберем, в чем преимущество типа Точечная диаграмма (Scatter Chart).
В отличие от линейной, точечная диаграмма воспринимает ось X не как набор строковых категорий, а как числовую шкалу (координатную плоскость). В этом случае:
(x, y).Чтобы изменить тип, в настройках диаграммы СКД выберите ТипДиаграммы.Точечная. Это часто решает проблему без дополнительных манипуляций со свойствами соединения.
Иногда требования заказчика не позволяют просто соединить точки прямой (например, если разрыв слишком велик и это искажает смысл графика). В таком случае мы можем применить программный расчет промежуточных значений.
Рассмотрим алгоритм реализации:
Таким образом, для СКД данные станут «плотными», и в каждой категории X будут значения для обеих серий. Это гарантирует плавность графика без использования встроенных механизмов аппроксимации 1С.
Если стандартных возможностей настроек СКД недостаточно (например, нужно динамически менять поведение графика в зависимости от данных), мы можем обратиться к объекту диаграммы программно в модуле отчета. Для этого используется обработчик ПриКомпоновкеРезультата.
Посмотрим на пример того, как можно управлять свойствами отображения через код:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Стандартное формирование отчета
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь найдем диаграмму в табличном документе и настроим её
Для Каждого Рисунок Из Результат.Рисунки Цикл
ОбъектГрафик = Рисунок.Объект;
Если ТипЗнч(ОбъектГрафик) = Тип("Диаграмма") Тогда
// Устанавливаем режим сглаживания и способ соединения
ОбъектГрафик.СоединениеТочекПриПропущенныхЗначениях = СоединениеТочекПриПропущенныхЗначенияхДиаграммы.СоединятьНеПропущенные;
ОбъектГрафик.ТипСоединенияЛиний = ТипСоединенияЛинийДиаграммы.Сглаженная;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Использование свойства ТипСоединенияЛинийДиаграммы.Сглаженная в сочетании с пропуском пустых значений позволяет добиться наиболее эстетичного вида графика, особенно если речь идет о математических функциях или трендах.
Подведем итоги. Если ваш график «падает в ноль» или прерывается в СКД из-за несовпадения точек по оси X, наиболее правильным путем будет:
NULL, а не число 0.Эти действия позволят вам создавать профессиональные и понятные отчеты, которые корректно отображают зависимости данных без визуальных артефактов.