Разработка и Конфигурация · 11 мин
Как заполнить диаграмму Ганта данными в 1С
Как программно заполнить диаграмму Ганта в 1С: точки, интервалы, связи, ресурсы. Примеры кода на встроенном языке, типичные ошибки и проверка результата.
Диаграмма Ганта в 1С — это элемент формы, связанный с объектом встроенного языка ДиаграммаГанта. Она применяется для визуализации производственных графиков, планов ремонтов, загрузки оборудования, расписаний сотрудников и проектных работ. В отличие от обычных таблиц, данные в неё нельзя просто «привязать» через источник — диаграмму заполняют программно, создавая точки, интервалы и связи между ними.
Основная сложность для начинающих разработчиков — понять модель данных объекта. Диаграмма Ганта состоит из трёх сущностей: точки (строки по вертикали, например сотрудники или станки), интервалы (горизонтальные полосы с датой начала и окончания) и связи (стрелки зависимостей между интервалами). Пока создана хотя бы одна точка с интервалом — диаграмма остаётся пустой.
Ниже разобран полный цикл: от добавления элемента на форму до заполнения данными из запроса, настройки внешнего вида и проверки результата. Примеры приводятся на встроенном языке 1С и подходят для управляемых форм типовых и самописных конфигураций.
Что нужно подготовить перед заполнением диаграммы
Прежде чем писать код, определите, что будет отображаться по осям диаграммы. Вертикальная ось — это точки: сотрудники, рабочие центры, проекты, заказы. Горизонтальная ось — всегда время. Каждая полоса на диаграмме — интервал, привязанный к одной точке и имеющий дату начала и дату окончания. Если в ваших данных нет даты окончания, её нужно вычислить (например, начало плюс длительность операции).
Источником данных обычно служит запрос к регистру сведений (графики работы), регистру накопления или табличной части документа. Убедитесь, что запрос возвращает минимум три поля: идентификатор точки (ссылка на справочник), дату начала и дату окончания. Дополнительно полезно выгрузить текст подписи и признак для раскраски интервалов.
Добавление диаграммы Ганта на форму
Откройте форму в конфигураторе и добавьте реквизит формы с типом ДиаграммаГанта, например с именем «Диаграмма». Затем перетащите этот реквизит в дерево элементов формы — платформа автоматически создаст поле вида «Диаграмма Ганта». Растяните элемент на нужный размер: при маленькой высоте полосы будут слипаться, и пользователю придётся постоянно масштабировать.
В свойствах элемента обратите внимание на флажки «АвтоМаксимальноеЗначение» и «АвтоМинимальноеЗначение» (у самого объекта диаграммы). Если они включены, платформа сама подберёт временной диапазон по данным. Для плановых отчётов удобнее задавать границы вручную через свойства НачалоПолногоИнтервала и КонецПолногоИнтервала, чтобы диаграмма всегда показывала, например, текущую неделю, даже если данных мало.
Базовый код заполнения: точки и интервалы
Минимальный рабочий пример выглядит так: очищаем диаграмму, добавляем точку, добавляем ей интервал с датами. Важно вызывать метод Обновить() после заполнения — без него на форме изменения могут не отобразиться.
Процедура ЗаполнитьДиаграмму() Экспорт
Диаграмма.Очистить();
Точка = Диаграмма.Точки.Добавить();
Точка.Текст = "Станок №1";
Интервал = Точка.Интервалы.Добавить();
Интервал.Начало = '20260115080000';
Интервал.Конец = '20260115120000';
Интервал.Текст = "Заказ 101";
Диаграмма.Обновить();
КонецПроцедурыМетод Очистить() обязателен при повторном заполнении: без него старые точки и интервалы останутся, и диаграмма задвоится. Если диаграмма заполняется по кнопке «Сформировать» или при изменении отбора, очистка должна быть первой строкой процедуры.
Обратите внимание: интервал создаётся у конкретной точки, а не у диаграммы в целом. Частая ошибка новичков — попытка добавить интервал в коллекцию Диаграмма.Интервалы, которой не существует. Строгая иерархия: Диаграмма → Точки → Точка → Интервалы → Интервал.
Заполнение диаграммы данными из запроса
В реальной задаче данные берутся из информационной базы. Типовой подход — выполнить запрос, сгруппировать результат по точкам и в цикле создавать интервалы. Чтобы не создавать точку повторно для каждой строки выборки, удобно хранить соответствие «ссылка → созданная точка».
Процедура ЗаполнитьИзЗапроса()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Сотрудник, ДатаНачала, ДатаОкончания, Задача ИЗ РегистрСведений.НазначенияЗадач";
Выборка = Запрос.Выполнить().Выбрать();
Диаграмма.Очистить();
СоответствиеТочек = Новый Соответствие;
Пока Выборка.Следующий() Цикл
Точка = СоответствиеТочек[Выборка.Сотрудник];
Если Точка = Неопределено Тогда
Точка = Диаграмма.Точки.Добавить();
Точка.Значение = Выборка.Сотрудник;
Точка.Текст = Строка(Выборка.Сотрудник);
СоответствиеТочек.Вставить(Выборка.Сотрудник, Точка);
КонецЕсли;
Интервал = Точка.Интервалы.Добавить();
Интервал.Начало = Выборка.ДатаНачала;
Интервал.Конец = Выборка.ДатаОкончания;
Интервал.Текст = Строка(Выборка.Задача);
КонецЦикла;
Диаграмма.Обновить();
КонецПроцедурыСвойство Точка.Значение стоит заполнять всегда, даже если подпись формируется отдельно. По значению точки потом удобно искать строку при обработке интерактивных событий — например, когда пользователь перетаскивает интервал мышью и нужно понять, к какому сотруднику он относится.
Если данных много (тысячи интервалов), заполнение и отрисовка могут занять заметное время. В таком случае ограничивайте выборку периодом и отборами до запроса, а не фильтруйте уже в цикле — это сократит и время выполнения, и нагрузку на клиентское приложение.
Иерархия точек и группировка строк
Диаграмма Ганта поддерживает иерархические точки: например, «Цех → Рабочий центр» или «Проект → Этап». Для этого у коллекции точек используется метод Добавить() уже у родительской точки: РодительскаяТочка.Точки.Добавить(). Дочерние точки отображаются вложенными, а родительская может сворачиваться.
При иерархическом заполнении удобно использовать выборку из запроса с обходом по группировкам: внешний цикл создаёт родительские точки, внутренний — дочерние с интервалами. Учтите, что интервалы можно добавлять и родительской точке — тогда полоса будет отображаться на уровне группы, что подходит для суммарной загрузки.
Связи между интервалами и настройка внешнего вида
Связи показывают зависимости «окончание — начало» между операциями: например, сборка не может начаться, пока не закончена заготовка. Связь создаётся у объекта диаграммы методом Диаграмма.Связи.Добавить(), после чего у связи задаются свойства Начало и Конец — это ссылки на объекты интервалов, а не даты. Именно поэтому созданные интервалы нужно сохранять в переменные или соответствие.
Для раскраски интервалов используется свойство Интервал.Цвет (тип «Цвет»). Типовой сценарий — красить по статусу задачи: выполненные зелёным, просроченные красным, плановые серым. Цвет подписей, шрифт и прозрачность настраиваются через свойства точек и самой диаграммы, а шкалу времени — через коллекцию Диаграмма.ОбластьПостроения.ШкалаВремени.Элементы, где можно добавить уровни «День» и «Час» с собственными форматами.
Если связей много, диаграмма превращается в «паутину» и перестаёт читаться. Ограничьтесь связями только между критичными операциями или дайте пользователю флажок «Показывать связи», по которому коллекция связей очищается и заполняется заново.
Интерактивное редактирование и сохранение изменений
Диаграмма Ганта позволяет пользователю перетаскивать и растягивать интервалы мышью. Чтобы эти изменения не потерялись, нужно обработать событие формы ПриОкончанииРедактированияИнтервала (или аналогичное для вашей версии платформы): в обработчике из параметров события берутся интервал с новыми датами и его точка, после чего изменения записываются в регистр или документ.
Если редактирование не предусмотрено, отключите его явно, установив у элемента формы свойство, запрещающее интерактивное изменение, либо не создавая обработчиков. Иначе пользователь перетащит полосу, увидит новые даты на экране и будет уверен, что данные сохранены — хотя в базе ничего не изменилось.
Проверка результата и типичные ошибки
После заполнения проверьте диаграмму по нескольким признакам: все ли точки видны, попадают ли интервалы в отображаемый период, корректны ли подписи. Самая частая причина «пустой» диаграммы — интервалы созданы, но их даты лежат вне видимого диапазона, либо забыт вызов Обновить(), либо реквизит формы не связан с элементом.
Как проверить результат
Каждая точка содержит полосы с корректными датами и подписями
Точки есть, но полос нет — проверьте даты и видимый период
Диаграмма полностью перестраивается без дублей
Точки и интервалы задваиваются — нет вызова Очистить()
После отпускания мыши даты сохраняются в базе
Даты на экране изменились, в базе старые — нет обработчика события
FAQ: частые вопросы по заполнению диаграммы Ганта в 1С
Можно ли заполнить диаграмму Ганта без программирования?
Нет. В отличие от табличных документов и динамических списков, у диаграммы Ганта нет механизма автоматической привязки к источнику данных. Заполнение всегда выполняется кодом на встроенном языке. В типовых конфигурациях (например, в отчётах по загрузке ресурсов) этот код уже написан — пользователю достаточно задать отборы и сформировать отчёт.
Почему диаграмма пустая, хотя код выполнился без ошибок?
Чаще всего даты интервалов находятся вне отображаемого диапазона: проверьте свойства начала и конца полного интервала диаграммы либо включите автоматический подбор границ. Также убедитесь, что интервалы добавлены именно к точкам и вызван метод Обновить().
Как сделать подпись внутри полосы интервала?
Заполните свойство Интервал.Текст — платформа выведет его на полосе, если хватает места. Для узких интервалов текст обрезается, поэтому дублируйте информацию в расшифровке или подсказке. Форматирование подписи настраивается через шрифт и цвет соответствующих свойств.
Как показать на диаграмме текущее время?
Используйте коллекцию линий текущего времени или добавьте вертикальную линию через элементы оформления шкалы времени — в зависимости от версии платформы доступны разные механизмы. Универсальный способ — периодически обновлять диаграмму по таймеру формы, чтобы положение линии соответствовало текущему моменту.
Сколько интервалов выдерживает диаграмма без тормозов?
Точного ограничения платформа не документирует, но на практике тысячи интервалов уже заметно замедляют отрисовку в тонком клиенте. Ограничивайте выборку периодом и отборами, группируйте мелкие операции и давайте пользователю настройки детализации.
Можно ли выгрузить диаграмму Ганта в картинку или печатную форму?
Да, объект диаграммы можно вставить в табличный документ через область рисунка либо сохранить программно доступными средствами платформы. Учтите, что качество и масштаб при печати зависят от текущих настроек отображения, поэтому перед выводом задайте нужный временной диапазон и размеры.
Что важно запомнить
Диаграмма Ганта в 1С заполняется только программно: очистка, создание точек, добавление интервалов с датами, вызов Обновить(). Данные берите запросом с ограничением периода, точки кэшируйте в соответствии, а интерактивные изменения сохраняйте через обработчики событий с проверкой пересечений.