Работа с графической информацией в 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С следует избегать автоматического привязывания ИсточникДанных. Программный метод через УстановитьЗначение() хоть и требует чуть больше кода, гарантирует точность отображения данных, позволяет гибко управлять оформлением и добавлять интерактивные расшифровки. Всегда помните о свойстве Обновление, чтобы формирование отчета не занимало лишнее время.