При разработке интерфейсов для планирования ресурсов в 1С программисты часто сталкиваются с необходимостью визуализировать данные во времени. Традиционным инструментом для этого является Диаграмма Ганта. Однако на "обычных формах" (ОФ) её возможности могут показаться ограниченными по сравнению с современным объектом Планировщик, доступным в управляемом интерфейсе. В данной статье мы разберем, как правильно понимать структуру диаграммы Ганта, и рассмотрим альтернативный способ создания интерактивного календаря с помощью табличного документа.
Для эффективной работы с диаграммой необходимо четко разделять три базовых измерения, по которым строятся данные. Давайте проанализируем их структуру:
Рассмотрим ситуацию, когда разработчик использует ДиаграммаГанта.УстановитьСерию("Командировка"). В этом случае "Командировка" становится названием категории. Визуально она отображается в легенде диаграммы. Если легенда скрыта, пользователь может не понять, что означает конкретная цветная полоска, если только разработчик не настроил дополнительные свойства интервала.
Часто возникает вопрос: можно ли вместо простой цветной линии вывести текстовую информацию, например, номер заказа или фамилию клиента? Вопреки распространенному мнению, объект ИнтервалДиаграммыГанта позволяет это сделать. Рассмотрим, как программно настроить отображение текста:
Во время заполнения диаграммы данными, когда мы получаем объект интервала через метод ПолучитьИнтервал, мы можем установить следующие свойства:
// Пример настройки интервала
НовыйИнтервал = ДиаграммаГанта.ПолучитьИнтервал(ТекущаяТочка, ТекущаяСерия, НомерИнтервала);
НовыйИнтервал.Текст = "Заказ №123: Иванов И.И."; // Текст поверх полоски
НовыйИнтервал.Подсказка = "Детальная информация о заказе..."; // Всплывающая подсказка
НовыйИнтервал.Цвет = WebЦвета.СветлоЗеленый;
Важно помнить, что если полоска интервала слишком короткая (узкий временной диапазон), текст может не поместиться. В этом случае рекомендуется использовать Подсказку или выносить важные реквизиты в расшифровку.
Если стандартная диаграмма Ганта не подходит под требования дизайна (например, нужен классический вид сетки календаря 7x5), на обычных формах лучшим решением будет использование поля табличного документа. Рассмотрим пошагово, как реализовать формирование сетки месяца программно.
Для начала создадим макет (например, с именем МакетКалендарь), где определим две области: ДеньЗаполнен (ячейка с числом месяца) и ДеньПустой (пустая ячейка для заполнения пространства до и после текущего месяца). В области ДеньЗаполнен добавим параметр ДеньЧислом.
Проанализируем алгоритм заполнения такого календаря:
// Процедура формирования сетки месяца
Процедура ОбновитьКалендарь()
Макет = ПолучитьМакет("МакетКалендарь");
ДеньЗаполнен = Макет.ПолучитьОбласть("ДеньЗаполнен|Колонка");
ДеньПустой = Макет.ПолучитьОбласть("ДеньПустой|Колонка");
// Определяем границы текущего месяца
НачДата = НачалоМесяца(РабочаяДата);
КонДата = КонецМесяца(РабочаяДата);
ТекДата = НачДата;
// Вычисляем, сколько пустых ячеек нужно в первой неделе
ПустыхДнейВНачале = ДеньНедели(НачДата) - 1;
// Создаем временный документ для формирования строки (недели)
ТабДокНеделя = Новый ТабличныйДокумент;
// Заполняем начало первой недели пустыми ячейками
Для й = 1 по ПустыхДнейВНачале Цикл
ТабДокНеделя.Присоединить(ДеньПустой);
КонецЦикла;
ПервыйДень = Истина;
Пока ТекДата <= КонДата Цикл
ТекДеньНедели = ДеньНедели(ТекДата);
// Если наступил понедельник и это не самый первый день цикла,
// выводим накопленную неделю в основной документ
Если Не ПервыйДень И ТекДеньНедели = 1 Тогда
ЭлементыФормы.ПолеТабличногоДокумента.Вывести(ТабДокНеделя);
ТабДокНеделя = Новый ТабличныйДокумент;
КонецЕсли;
// Заполняем параметры дня
ДеньЗаполнен.Параметры.ДеньЧислом = День(ТекДата);
// Выделяем выходные цветом
Если ТекДеньНедели = 6 Или ТекДеньНедели = 7 Тогда
ДеньЗаполнен.Область().ЦветФона = WebЦвета.Розовый;
Иначе
ДеньЗаполнен.Область().ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
КонецЕсли;
ТабДокНеделя.Присоединить(ДеньЗаполнен);
ТекДата = ТекДата + 60*60*24; // Переход к следующему дню
ПервыйДень = Ложь;
КонецЦикла;
// Дозаполняем последнюю неделю пустыми ячейками до воскресенья
ОстатокДней = 7 - ДеньНедели(КонДата);
Для й = 1 по ОстатокДней Цикл
ТабДокНеделя.Присоединить(ДеньПустой);
КонецЦикла;
// Выводим финальную строку
ЭлементыФормы.ПолеТабличногоДокумента.Вывести(ТабДокНеделя);
КонецПроцедуры
Выясним, почему этот метод часто оказывается эффективнее диаграммы Ганта на старых версиях платформы:
Выбор (двойной клик по ячейке) можно открывать документы, создавать новые задачи или выводить детальные отчеты.Рассмотрим еще один продвинутый способ для обычных форм — Поле HTML-документа. Если стандартных средств 1С недостаточно для реализации "красивого" календаря в стиле Google, можно использовать мощь веб-технологий. Вы можете загрузить в поле HTML готовую библиотеку на JavaScript (например, FullCalendar) и передавать в нее данные из 1С в формате JSON. Это позволит реализовать плавную анимацию, Drag-and-drop (перетаскивание задач мышкой) и адаптивную верстку, что практически невозможно сделать стандартными методами ОФ.
Подводя итог, выбор инструмента зависит от бизнес-задачи. Если нужен строгий график производства с зависимостями между задачами — используйте Диаграмму Ганта, предварительно разобравшись в сериях и интервалах. Если же требуется наглядный ежедневник или календарь планирования — оптимальным выбором станет Табличный документ или HTML-поле.