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

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

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

В данной статье мы подробно разберем, почему возникает такая ситуация, и рассмотрим единственно верный и стабильный способ заполнения диаграмм в табличных документах — ручное управление сериями, точками и значениями. Для этой задачи есть набор инструментов для разработки и тестирования 1С.

Анализ проблемы: почему ИсточникДанных может подводить

Рассмотрим типичную ситуацию. Программист создает ТаблицаЗначений, наполняет её данными и пытается присвоить её диаграмме, находящейся внутри рисунка табличного документа. На форме (в объекте типа "Диаграмма") это работает корректно, так как платформа автоматически сопоставляет колонки. Но в контексте ТабличныйДокумент механизм автоматического связывания работает иначе: он более чувствителен к типам данных, структуре колонок и внутренним индексам макета. Часто это приводит к эффекту «полтергейста», когда при каждом обновлении графики меняются случайным образом.

Чтобы избежать этой нестабильности, мы откажемся от автоматизации в пользу полного контроля над объектом диаграммы — в этом поможет конструктор рабочих столов и интерфейсов для 1С.

Пошаговое решение: программное заполнение диаграммы

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

Шаг 1. Инициализация объектов

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


ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет"); // Замените на имя вашего макета
ГрафикОбласть = Макет.ПолучитьОбласть("График");
// Обращаемся к рисунку с именем "D1", который содержит объект Диаграмма
Диаграмма = ГрафикОбласть.Рисунки.D1.Объект;

Шаг 2. Подготовка и оптимизация

Перед заполнением крайне важно подготовить объект. Если мы этого не сделаем, старые данные из макета могут смешаться с новыми. Также необходимо использовать свойство Обновление. Если оставить его в значении Истина, то при каждой установке новой точки 1С будет пытаться перерисовать график, что на больших объемах данных приведет к колоссальным задержкам.


Диаграмма.Обновление = Ложь; // Выключаем перерисовку на время заполнения
Диаграмма.Очистить();      // Полностью удаляем предыдущие серии и точки
Диаграмма.СерииВСтроках = Ложь; 
Диаграмма.ОтображатьЗаголовок = Ложь;

Шаг 3. Подготовка данных

Предположим, у нас есть таблица значений, содержащая измерения (то, что пойдет в легенду и на ось X) и ресурсы (числовые показатели). Рассмотрим пример формирования такой таблицы:


ТЗДанных = Новый ТаблицаЗначений;
ТЗДанных.Колонки.Добавить("Склад");
ТЗДанных.Колонки.Добавить("Период");
ТЗДанных.Колонки.Добавить("Остаток");

НовСтр = ТЗДанных.Добавить();
НовСтр.Склад = "Склад №1";
НовСтр.Период = "Январь";
НовСтр.Остаток = 150;

НовСтр = ТЗДанных.Добавить();
НовСтр.Склад = "Склад №1";
НовСтр.Период = "Февраль";
НовСтр.Остаток = 210;

Шаг 4. Цикл заполнения диаграммы

Теперь перейдем к самому главному — распределению данных. Мы будем использовать методы УстановитьСерию(), УстановитьТочку() и УстановитьЗначение(). Выясним важный нюанс: методы установки серии и точки возвращают объект, который затем передается в метод установки значения — для проверки алгоритма подойдёт инструмент для пошаговой отладки кода 1С.


Для Каждого ТекСтр Из ТЗДанных Цикл
    // Серия — это обычно то, что отображается в легенде (например, Склад)
    ТекущаяСерия = Диаграмма.УстановитьСерию(ТекСтр.Склад);
    
    // Точка — это деление на горизонтальной оси (например, Месяц или Дата)
    ТекущаяТочка = Диаграмма.УстановитьТочку(ТекСтр.Период);
    
    // Устанавливаем конкретное числовое значение на пересечении серии и точки
    Диаграмма.УстановитьЗначение(ТекущаяТочка, ТекущаяСерия, ТекСтр.Остаток);
КонецЦикла;

Шаг 5. Завершение и вывод

После завершения цикла необходимо вернуть диаграмму в режим обновления и вывести область в итоговый табличный документ.


Диаграмма.Обновление = Истина; // Включаем отрисовку
ТабДокумент.Вывести(ГрафикОбласть);
ТабДокумент.Показать("Отчет по остаткам");

Дополнительные возможности и тонкая настройка

Рассмотрим более глубокие настройки, которые сделают ваш график профессиональным и интерактивным.

Управление цветами серий

Если вам нужно, чтобы определенные данные всегда подсвечивались конкретным цветом (например, "План" — синим, а "Факт" — красным), вы можете перебирать коллекцию серий после заполнения:


Для Каждого Серия Из Диаграмма.Серии Цикл
    Если Серия.Значение = "Склад №1" Тогда
        Серия.Цвет = WebЦвета.Зеленый;
    Иначе
        Серия.Цвет = WebЦвета.Оранжевый;
    КонецЕсли;
КонецЦикла;

Добавление расшифровки

Диаграммы в 1С поддерживают интерактивность. Вы можете сделать так, чтобы при клике на столбик графика открывался документ или отчет. Для этого в методе УстановитьЗначение используется четвертый параметр:

Диаграмма.УстановитьЗначение(ТекущаяТочка, ТекущаяСерия, ТекСтр.Значение, ТекСтр.СсылкаНаОбъект);

Теперь при двойном клике пользователь перейдет к объекту расшифровки.

Работа с осью времени

Если в качестве точек вы используете реальные значения типа Дата, проанализируйте возможность включения шкалы времени. Это позволит платформе автоматически соблюдать пропорции на оси X. Если между двумя точками разница в 10 дней, а между следующими — 1 день, на графике это будет визуально отражено (расстояние между точками будет разным), что дает более честную картину динамики.

Фиксация масштаба

Чтобы графики не "прыгали" при применении фильтров в отчете, полезно устанавливать статические границы шкалы значений:


Диаграмма.ОбластьЗначений.СтатическоеМаксимальноеЗначение = 1000;
Диаграмма.ОбластьЗначений.СтатическоеМинимальноеЗначение = 0;

Подведем итоги

Мы выяснили, что для стабильного вывода диаграммы в табличный документ 1С следует избегать автоматического привязывания ИсточникДанных. Программный метод через УстановитьЗначение() хоть и требует чуть больше кода, гарантирует точность отображения данных, позволяет гибко управлять оформлением и добавлять интерактивные расшифровки. Всегда помните о свойстве Обновление, чтобы формирование отчета не занимало лишнее время.

← На главную