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