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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Анализ проблемы: почему возникают «дырки» в диаграмме

Рассмотрим стандартную ситуацию. У нас есть набор данных о продажах, где по оси Y откладывается сумма, по оси X — количество, а сериями выступают товары. Предположим, Товар №1 продавался только в количестве 1 штука, а Товар №2 — только в количестве 5 штук. При формировании диаграммы система строит две точки на оси X: «1 шт.» и «5 шт.».

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

Решение 1: Программная инициализация нулевых значений

Выясним причину такого поведения: для корректной работы алгоритма сжатия диаграммы необходимо, чтобы в каждой точке для каждой серии было явно прописано числовое значение. Если данных нет, их нужно создать программно. Рассмотрим эффективный метод «принудительной инициализации», предложенный опытными разработчиками.

Суть метода заключается в том, что перед установкой реальных данных из результата запроса мы проходим циклом по всем возможным сериям и устанавливаем для текущей точки значение 0. Посмотрим на пример кода, реализующего этот подход:


// Сформируем таблицу всех возможных направлений (серий)
ТЗСерий = РезультатЗапроса.Выгрузить();
ТЗСерий.Свернуть("Направление");

ВыборкаТочек = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТочек.Следующий() Цикл
    // Устанавливаем точку на диаграмме (например, количество продаж)
    Точка = РабочаяДиаграмма.УстановитьТочку(ВыборкаТочек.Количество);
    Точка.Текст = Строка(ВыборкаТочек.Количество);
    
    // ВАЖНО: Установим 0 для всех возможных серий в этой точке.
    // Это заставит систему увидеть базовое значение вместо NULL.
    Для каждого СтрСерия из ТЗСерий Цикл
        ТекущаяСерия = РабочаяДиаграмма.УстановитьСерию(СтрСерия.Направление);
        РабочаяДиаграмма.УстановитьЗначение(Точка, ТекущаяСерия, 0);
    КонецЦикла;
    
    // Теперь заполняем реальные данные для этой точки
    ВыборкаСерий = ВыборкаТочек.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаСерий.Следующий() Цикл
        Серия = РабочаяДиаграмма.УстановитьСерию(ВыборкаСерий.Направление);
        РабочаяДиаграмма.УстановитьЗначение(Точка, Серия, ВыборкаСерий.СуммаПродаж);
    КонецЦикла;
КонецЦикла;

Проанализируем этот код. Сначала мы создаем «заглушки» для всех серий в каждой точке. Когда система встречает 0, настройка ПропускатьБазовоеЗначение отрабатывает корректно: она не только не рисует столбец, но и исключает его из расчета геометрической ширины группы. Это позволяет «потеснить» оставшиеся столбцы друг к другу.

Решение 2: Настройка Системы компоновки данных (СКД)

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

  1. Игнорировать значения NULL: В дополнительных настройках отчета (вкладка «Другие настройки») убедитесь, что флаг Игнорировать значения NULL установлен. Однако, как мы выяснили выше, этого не всегда достаточно для гистограмм.
  2. Функция ЕСТЬNULL в запросе: Обязательно оборачивайте суммируемые поля в запросе: СУММА(ЕСТЬNULL(Продажи.Сумма, 0)). Это гарантирует наличие числового типа данных в результате.
  3. Дополнение периодов: Проверьте настройки группировок. Если используется группировка по периоду, убедитесь, что в поле «Тип дополнения» не выбрано принудительное создание дат, в которых не было движений.

Изменения в платформе 8.3.25 и выше

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

Во-первых, свойство «Базовое значение» теперь может настраиваться индивидуально для каждой оси значений. Если в вашей диаграмме используется несколько осей, проверьте свойства конкретной оси. В программном коде это доступно через коллекцию Диаграмма.ОсиЗначений.

Во-вторых, привычные «Полосы» (Stripes), которые использовались для выделения диапазонов, теперь официально переименованы в «Интервалы». Если ваша задача — визуально скрыть пустые области или выделить значимые данные, ищите настройки интервалов в свойствах шкалы значений.

Особенности работы с сериями и точками

Проанализируем ситуацию, когда серий слишком много. Даже при идеальной настройке «пропуска», если в одной точке выводится один товар, а в другой — сто, диаграмма будет выглядеть неравномерно.

Для улучшения визуального восприятия рекомендуем:

В завершение подчеркнем: секрет «плотной» диаграммы без пробелов кроется в явном указании 0 вместо NULL для каждой комбинации точка-серия и правильной настройке свойств осей в современных версиях 1С:Предприятия.

← На главную