Как в 1С построить линейный график без лишних точек при отсутствии данных?

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

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

Анализ проблемы: почему появляются лишние точки

Прежде чем переходить к решению, проанализируем, как 1С работает с осями диаграммы. Система строит единую шкалу аргументов (ось Х) для всех серий (товаров), представленных в отчете. Если мы строим график по датам, 1С собирает все уникальные даты из всех наборов данных. Если у «Товара №1» есть цена на 1-е число, а у «Товара №2» цена появилась только 5-го числа, 1С все равно создаст точку для «Товара №2» на 1-е число, но значение в ней будет неопределено (NULL или 0). Наша задача — научить систему не отрисовывать эти «пустые» места как нулевые значения.

Решение через Систему компоновки данных (СКД)

Самый простой и эффективный способ решить задачу — воспользоваться штатными настройками Системы компоновки данных. Начиная с последних версий платформы 8.3, в СКД реализованы механизмы интерполяции данных. Рассмотрим по шагам, как это настроить:

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

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

Программное управление свойствами диаграммы

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


// Предположим, Диаграмма - это реквизит формы или элемент на форме
Диаграмма.ПропускатьБазовоеЗначение = Истина;
Диаграмма.БазовоеЗначение = 0; // Значение, которое считаем "пустым"

// Устанавливаем способ соединения точек
// Доступные варианты: НеСоединять, СоединятьНеПропущенные, ОставлятьПустоеМесто
Диаграмма.ТипСоединенияТочекПриПропущенныхЗначениях = ТипСоединенияТочекПриПропущенныхЗначениях.СоединятьНеПропущенные;

// Обновляем отображение
Диаграмма.Обновить();

Проанализируем работу этих свойств. Свойство ТипСоединенияТочекПриПропущенныхЗначениях.СоединятьНеПропущенные заставляет систему визуально проводить линию от последней «нормальной» точки к следующей существующей, игнорируя временной интервал, в котором данных нет. Это создает эффект плавного графика без провалов к нулю.

Почему настройки могут не работать: версии и режимы совместимости

Бывают ситуации, когда вы установили все настройки, но график по-прежнему отображается некорректно. Выясним возможные причины:

  1. Режим совместимости конфигурации: Если ваша конфигурация работает в режиме совместимости с версиями 8.3.14 и ниже, новые алгоритмы отрисовки графиков могут быть недоступны. Проверьте свойство конфигурации «Режим совместимости».
  2. Обновление платформы: Функционал интерполяции активно дорабатывался в версиях 8.3.20+. Если вы используете старую учебную версию или устаревший релиз платформы, настройки могут присутствовать в интерфейсе, но не влиять на визуализацию. Рекомендуется использовать актуальные версии (например, 8.3.24 и выше).
  3. Дополнение периодов в запросе: Если в тексте запроса СКД используется предложение ПЕРИОДАМИ, система сама генерирует пустые строки для каждой даты. Это может конфликтовать с механизмом пропуска значений. Для «чистого» графика лучше передавать в СКД только те даты, когда реально были движения (приходы или изменения цен).

Альтернативный вариант: Использование Точечной диаграммы

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

В точечной диаграмме каждая серия данных имеет свои собственные координаты X и Y. Это означает, что «Товар №1» может иметь точки на 1-е и 10-е число, а «Товар №2» — на 5-е и 15-е. Система не будет пытаться создать пустую точку для «Товара №2» на 1-е число, так как у каждой линии своя независимая временная ось. Линии будут соединять только реально существующие узлы, что полностью исключает проблему «лишних точек».

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

Подготовка данных в запросе

Чтобы диаграмма выглядела максимально корректно, иногда полезно нормализовать данные еще на уровне SQL-запроса. Если мы хотим видеть точки только в моменты «приходов», мы должны исключить соединение с календарем. Рассмотрим пример логики:


ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Дата,
    ЦеныНоменклатуры.Номенклатура КАК Товар,
    ЦеныНоменклатуры.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.Номенклатура В (&СписокТоваров)
// Важно: не используем соединение с таблицей дат, 
// если не хотим видеть пустые значения между изменениями цен.

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

← На главную