Как избежать разрывов линий в графиках СКД при несовпадении точек по оси X

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

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

Выясним причину проблемы

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

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

Способ 1: Использование свойства «Соединение точек при пропущенных значениях»

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

Рассмотрим по шагам, как применить эту настройку:

  1. Перейдем на закладку «Настройки» в схеме компоновки данных.
  2. Выберем элемент «Диаграмма» в структуре отчета.
  3. В нижней части экрана откроем вкладку «Дополнительные настройки».
  4. Найдем параметр «Соединение точек при пропущенных значениях».
  5. Установим значение «Соединять не пропущенные».

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

Способ 2: Разграничение NULL и числового нуля

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

Посмотрим на пример правильного формирования запроса. Если мы используем ЛЕВОЕ СОЕДИНЕНИЕ, важно не превращать NULL в 0 через функцию ЕСТЬNULL() в тех полях, которые отвечают за ресурс графика, если мы хотим, чтобы линия прошла «сквозь» эту точку.

Проанализируем пример кода в вычисляемых полях или запросе:


// Неправильно для графика:
ЕСТЬNULL(СуммаОборота, 0) 

// Правильно для работы механизма пропуска точек:
СуммаОборота // Оставляем как есть, чтобы при отсутствии записи пришел NULL

Способ 3: Переход к использованию «Точечной диаграммы»

Если ваша зависимость является математической (как синусоида в примере автора темы), то использование Линейной диаграммы изначально может быть не совсем верным. Разберем, в чем преимущество типа Точечная диаграмма (Scatter Chart).

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

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

Способ 4: Интерполяция данных на уровне запроса

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

Рассмотрим алгоритм реализации:

  1. Создадим временную таблицу со всеми возможными значениями X, которые встречаются и в первой, и во второй сериях.
  2. Для первой серии (синусоиды) программно вычислим значения Y во всех новых точках X, которые пришли из второй серии.
  3. Объединим данные.

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

Способ 5: Программная настройка объекта «Диаграмма»

Если стандартных возможностей настроек СКД недостаточно (например, нужно динамически менять поведение графика в зависимости от данных), мы можем обратиться к объекту диаграммы программно в модуле отчета. Для этого используется обработчик ПриКомпоновкеРезультата.

Посмотрим на пример того, как можно управлять свойствами отображения через код:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Стандартное формирование отчета
    СтандартнаяОбработка = Ложь;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    Результат = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    // Теперь найдем диаграмму в табличном документе и настроим её
    Для Каждого Рисунок Из Результат.Рисунки Цикл
        ОбъектГрафик = Рисунок.Объект;
        Если ТипЗнч(ОбъектГрафик) = Тип("Диаграмма") Тогда
            // Устанавливаем режим сглаживания и способ соединения
            ОбъектГрафик.СоединениеТочекПриПропущенныхЗначениях = СоединениеТочекПриПропущенныхЗначенияхДиаграммы.СоединятьНеПропущенные;
            ОбъектГрафик.ТипСоединенияЛиний = ТипСоединенияЛинийДиаграммы.Сглаженная;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Резюме

Подведем итоги. Если ваш график «падает в ноль» или прерывается в СКД из-за несовпадения точек по оси X, наиболее правильным путем будет:

  1. Проверить, что отсутствующие данные — это действительно NULL, а не число 0.
  2. Включить свойство «Соединение не пропущенных» в настройках диаграммы.
  3. Рассмотреть переход на Точечную диаграмму, если значения по оси X являются числами или датами.

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

← На главную