ДиаграммаГанта.По умолчанию

Конструкторы

Синтаксис и применение ДиаграммаГанта.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ДиаграммаГанта
Полное описание, параметры и ограничения

ДиаграммаГанта.По умолчанию

ДиаграммаГанта (GanttChart)

По умолчанию

Синтаксис:
Новый ДиаграммаГанта
Методическая информация

Практические примеры

Разместить заголовок и легенду двух собственных диаграмм и проверить PNG

Один полный учебный процесс: три свои задачи → столбцы4/2 и actual план → штатные режимы → четыре нормализованные области → неизменные данные6/5 → два настоящих PNG в памяти.

Где и как запускать

Полный модуль своей управляемой формы ОсновнаяФорма: толстый управляемый Windows клиент8.5.1.1343, весь native build/области/PNG/readback на сервере собственной новой пустой файловойИБ; только authored source/runtime0.

Подготовка

  1. Только будущая ручная подготовка в своей отдельной Windows VM. Создайте новую пустую файловуюИБ точно C:\1C85_OwnLayoutLab\b942d45e-42bc-4788-b3cb-36d5a624f127\Base, новую CF УчебноеРазмещениеДиаграмм85, платформа8.5.1.1343, управляемое приложение/Такси, совместимостьНеИспользовать. Здесь ИБ/VM/каталог/1С/PNG не создавались и не запускались.

  2. Создайте одного своего пользователя Размещение85Ученик и одну собственную роль с полными правами только новойИБ, включая администрирование для штатного списка пользователей. Прикладных справочников/документов/регистров/планов/разделителей/подписок/заданий/внешних источников/расширений нет. Все прочие модули пусты, никаких обработчиков, записывающих данные/настройки/файлы, не добавляйте.

  3. Обработки → МоиДиаграммы85: без реквизитов объекта, табличных частей и макетов. Создайте ровно одну управляемую форму ОсновнаяФорма, назначьте основной формой обработки. Основной код целиком вставьте в ее модуль, не внутрь процедуры. Отключите сохранение данных формы в настройках.

  4. Реквизиты формы: График85 Диаграмма; План85 ДиаграммаГанта; КартинкаГрафика85 иКартинкаПлана85 Картинка; Готово85/Остановка85 Булево; Профиль85 Строка10; ПаспортДанных85 Строка1000; ЧасыЗадач85/ЧасыЗанято85 Число6,2; Состояние85 Строка1000. Только собственные неперсистентные данные формы, не реквизиты объектаБД.

  5. Создайте четыре настоящих элемента ПолеФормы: ПолеГрафика85 видПолеДиаграммы/ПутьГрафик85; ПолеПлана85 видПолеДиаграммыГанта/ПутьПлан85; ПредпросмотрГрафика85 иПредпросмотрПлана85 видПолеКартинки/одноименные путиКартинкаГрафика85 иКартинкаПлана85. Они видимы, остальные показатели многострочные/только чтение; не декорации и не колонки таблицы. Не назначайте интерактивных изменений/расшифровок/файловых команд графикам.

  6. Две собственные команды/кнопки ПрофильСправа85 иПрофильСнизу85 с одноименными действиями(Команда), ИзменяетСохраняемыеДанныеЛожь. События формы ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) иПриОткрытии(Отказ) назначьте одноименным actual handlers. Обработчики не вызываются вручную.

  7. Общие модули → УчебноеРазмещение85: СерверДа, ГлобальныйНет, КлиентНет, ВнешнееСоединениеНет, ПривилегированныйНет, ВызовСервераНет. Supporting module own-layout-server-guard вставьте полностью. Он доступен только серверному коду собственной формы и проверяет пустоту/версию/точныйFile-путь/пользователя/метаданные до создания графиков.

  8. Сохраните CF, обновите только свою новуюИБ и вручную запустите толстый управляемый Windows клиент8.5.1.1343 своим единственным пользователем. Стандартный путь открытия собственной обработки: Главное меню → Все функции/Функции для технического специалиста → Обработки → МоиДиаграммы85 → Открыть; если этот режим выключен, включите его вручную только в своем учебном клиенте. Не предполагайте меню или подсистемы другой конфигурации.

  9. Нажмите сначала ПрофильСправа85. Код на сервере создает свои literal задачиA09–11/СтолА, B10–12/СтолА, C13–15/СтолБ; это часы10октября2026, не расписание работников. Серии/точки/интервалы получают ownUUID-коды, каждая фактическая native запись проверяется.

  10. Затем ПрофильСнизу85. Сначала проверяются текущие own данные и предыдущий паспорт. Кандидаты создаются заново, штатное размещение Right/Bottom считывается до перехода в УказываетсяРасположение. Четыре области получают точные координаты0..1, после оформления и получения картинок сверяются все actual значения.

  11. Сравните на своей форме два графика и оба PNG-предпросмотра. Вручную проверьте читаемость заголовков, легенд, отсутствие обрезания/перекрытия с областью построения, при изменении размера окна/масштаба Windows. Static readback подтверждает значения API, не фактические размеры текста или качество renderer. PNG не сохраняются на диск.

  12. При отказе подготовки прежние видимые графики не заменялись. При отказе принятия возможна частичная последовательная замена. Оба clienthandlers проверяют свой stickyОстановка85 до RPC и при любой ошибке RPC устанавливают его локально: возврат исключения с сервера не доказывает синхронизацию измененногоformstate. Не повторяйте команды и не восстанавливайте неизвестное состояние автоматически; исследуйте только свою одноразовую форму.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвоюФорму85();
    Готово85 = Ложь;
    Остановка85 = Ложь;
    ПаспортДанных85 = "";
    Состояние85 = "Нажмите ПрофильСправа85: только три собственные задачи в памяти";
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоюФорму85()
    УчебноеРазмещение85.ПроверитьСвойСтендРазмещения85();
    Если Элементы.ПолеГрафика85.Вид <> ВидПоляФормы.ПолеДиаграммы
        Или Элементы.ПолеГрафика85.ПутьКДанным <> "График85"
        Или Элементы.ПолеПлана85.Вид <> ВидПоляФормы.ПолеДиаграммыГанта
        Или Элементы.ПолеПлана85.ПутьКДанным <> "План85"
        Или Элементы.ПредпросмотрГрафика85.Вид <> ВидПоляФормы.ПолеКартинки
        Или Элементы.ПредпросмотрГрафика85.ПутьКДанным <> "КартинкаГрафика85"
        Или Элементы.ПредпросмотрПлана85.Вид <> ВидПоляФормы.ПолеКартинки
        Или Элементы.ПредпросмотрПлана85.ПутьКДанным <> "КартинкаПлана85" Тогда
        ВызватьИсключение "Не совпали четыре собственных настоящих поля и их пути к данным";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
    Состояние85 = "Сначала ПрофильСправа85, затем ПрофильСнизу85; не изменяйте графики вручную";
#Иначе
    Отказ = Истина;
#КонецЕсли
КонецПроцедуры

&НаКлиенте
Процедура ПрофильСправа85(Команда)
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПрофильСправа85" Тогда
        ВызватьИсключение "Нужна настоящая собственная команда профиля справа";
    КонецЕсли;
    Если Остановка85 Тогда
        ВызватьИсключение "СТОП: после прежнего отказа повторять собственную команду нельзя";
    КонецЕсли;
    Попытка
        ПерестроитьНаСервере85("Справа");
    Исключение
        Остановка85 = Истина;
        Состояние85 = "СТОП на клиенте: серверный результат или синхронизация формы не подтверждены. " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПрофильСнизу85(Команда)
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПрофильСнизу85" Тогда
        ВызватьИсключение "Нужна настоящая собственная команда профиля снизу";
    КонецЕсли;
    Если Остановка85 Тогда
        ВызватьИсключение "СТОП: после прежнего отказа повторять собственную команду нельзя";
    КонецЕсли;
    Попытка
        ПерестроитьНаСервере85("Снизу");
    Исключение
        Остановка85 = Истина;
        Состояние85 = "СТОП на клиенте: серверный результат или синхронизация формы не подтверждены. " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервере
Процедура ПерестроитьНаСервере85(Профиль)
    ПроверитьСвоюФорму85();
    Если Остановка85 Или Профиль <> "Справа" И Профиль <> "Снизу" Тогда
        ВызватьИсключение "Неизвестный профиль либо прежний частичный отказ; автоматического продолжения нет";
    КонецЕсли;
    Если Не Готово85 И Профиль <> "Справа" Тогда
        ВызватьИсключение "Первым должен быть собственный профиль справа";
    КонецЕсли;
    Если Готово85 Тогда
        ДоВидимых = ПрочитатьСвоиДанные85(График85, План85);
        Если ДоВидимых.Паспорт <> ПаспортДанных85 Тогда
            ВызватьИсключение "Данные текущих собственных графиков изменились; заменять их нельзя";
        КонецЕсли;
    КонецЕсли;
    Попытка
        Задачи = СобственныеЗадачи85();
        ГрафикКандидат = СоздатьСвойГрафик85(Задачи);
        ПланКандидат = СоздатьСвойПлан85(Задачи);
        До = ПрочитатьСвоиДанные85(ГрафикКандидат, ПланКандидат);
        РазместитьСвоиОбласти85(ГрафикКандидат, ПланКандидат, Профиль);
        После = ПрочитатьСвоиДанные85(ГрафикКандидат, ПланКандидат);
        Если До.Паспорт <> После.Паспорт Или После.ЧасыЗадач <> 6 Или После.ЧасыЗанято <> 5 Тогда
            ВызватьИсключение "Оформление изменило actual данные либо числовые итоги";
        КонецЕсли;
        PNGГрафика = ГрафикКандидат.ПолучитьКартинку(820, 460, ФорматКартинки.PNG);
        PNGПлана = ПланКандидат.ПолучитьКартинку(820, 460, ФорматКартинки.PNG);
        ПроверитьСвоюКартинку85(PNGГрафика);
        ПроверитьСвоюКартинку85(PNGПлана);
        ПроверитьСвоиОбласти85(ГрафикКандидат, ПланКандидат, Профиль);
        ПослеКартинок = ПрочитатьСвоиДанные85(ГрафикКандидат, ПланКандидат);
        Если ПослеКартинок.Паспорт <> После.Паспорт Тогда
            ВызватьИсключение "После native получения картинок данные кандидатов изменились";
        КонецЕсли;
    Исключение
        Состояние85 = "Подготовка отказала до замены видимых данных: " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
    Попытка
        График85 = ГрафикКандидат;
        План85 = ПланКандидат;
        КартинкаГрафика85 = PNGГрафика;
        КартинкаПлана85 = PNGПлана;
        Принято = ПрочитатьСвоиДанные85(График85, План85);
        Если Принято.Паспорт <> ПослеКартинок.Паспорт Тогда
            ВызватьИсключение "Не подтвердились actual данные после принятия в собственную форму";
        КонецЕсли;
        ПроверитьСвоиОбласти85(График85, План85, Профиль);
        ПроверитьСвоюКартинку85(КартинкаГрафика85);
        ПроверитьСвоюКартинку85(КартинкаПлана85);
        ПаспортДанных85 = Принято.Паспорт;
        ЧасыЗадач85 = Принято.ЧасыЗадач;
        ЧасыЗанято85 = Принято.ЧасыЗанято;
        Профиль85 = Профиль;
        Готово85 = Истина;
        Состояние85 = "Подтверждены данные4/2, 6 task-hours/5 часов объединения и два nativePNG820x460. Профиль: " + Профиль + ". Отрисовку проверьте вручную.";
    Исключение
        Остановка85 = Истина;
        Состояние85 = "СТОП: принятие не атомарно, возможна частичная замена. Не повторяйте команду: " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервере
Функция СобственныеЗадачи85()
    Задачи = Новый Массив;
    Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "b942d45e-42bc-4788-b3cb-36d5a624f127/A", "Разбор материала", "СтолА", Дата(2026, 10, 10, 9), Дата(2026, 10, 10, 11)));
    Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "b942d45e-42bc-4788-b3cb-36d5a624f127/B", "Проверка образца", "СтолА", Дата(2026, 10, 10, 10), Дата(2026, 10, 10, 12)));
    Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "b942d45e-42bc-4788-b3cb-36d5a624f127/C", "Сборка комплекта", "СтолБ", Дата(2026, 10, 10, 13), Дата(2026, 10, 10, 15)));
    Возврат Новый ФиксированныйМассив(Задачи);
КонецФункции

&НаСервере
Функция СоздатьСвойГрафик85(Задачи)
    График = Новый Диаграмма;
    График.Обновление = Ложь;
    График.АвтоТранспонирование = Ложь;
    График.ТипДиаграммы = ТипДиаграммы.Гистограмма;
    График.ОбластьЗаголовка.Текст = "Собственные трудозатраты по столам: часы задач";
    СерияГрафика = График.УстановитьСерию("b942d45e-42bc-4788-b3cb-36d5a624f127/Часы");
    СерияГрафика.Текст = "Часы задач";
    Для Каждого Ресурс Из СтрРазделить("СтолА,СтолБ", ",") Цикл
        Часы = 0;
        Для Каждого Задача Из Задачи Цикл
            Если Задача.Ресурс = Ресурс Тогда
                Часы = Часы + (Задача.Конец - Задача.Начало) / 3600;
            КонецЕсли;
        КонецЦикла;
        ТочкаГрафика = График.УстановитьТочку(Ресурс);
        ТочкаГрафика.Текст = Ресурс;
        График.УстановитьЗначение(ТочкаГрафика, СерияГрафика, Часы);
    КонецЦикла;
    График.Обновление = Истина;
    Возврат График;
КонецФункции

&НаСервере
Функция СоздатьСвойПлан85(Задачи)
    План = Новый ДиаграммаГанта;
    План.Обновление = Ложь;
    План.АвтоОпределениеПолногоИнтервала = Ложь;
    План.УстановитьПолныйИнтервал(Дата(2026, 10, 10, 8), Дата(2026, 10, 10, 16));
    План.АвтоУстановкаТекстаТочек = Ложь;
    План.АвтоУстановкаТекстаСерий = Ложь;
    План.ОбластьЗаголовка.Текст = "Свой учебный план: не календарь сотрудников";
    СерияПлана = План.УстановитьСерию("b942d45e-42bc-4788-b3cb-36d5a624f127/План");
    СерияПлана.Текст = "Только собственные задачи";
    Для Каждого Задача Из Задачи Цикл
        ТочкаПлана = План.УстановитьТочку(Задача.Ресурс);
        ТочкаПлана.Текст = Задача.Ресурс;
        ЗначениеПлана = План.ПолучитьЗначение(ТочкаПлана, СерияПлана);
        ЗначениеПлана.Редактирование = Ложь;
        ИнтервалПлана = ЗначениеПлана.Добавить();
        ИнтервалПлана.Начало = Задача.Начало;
        ИнтервалПлана.Конец = Задача.Конец;
        ИнтервалПлана.Текст = Задача.Задача;
        ИнтервалПлана.Расшифровка = Задача.Код;
    КонецЦикла;
    План.Обновление = Истина;
    Возврат План;
КонецФункции

&НаСервере
Функция ПрочитатьСвоиДанные85(График, План)
    Если ТипЗнч(График) <> Тип("Диаграмма") Или ТипЗнч(План) <> Тип("ДиаграммаГанта") Тогда
        ВызватьИсключение "Нужны actual собственные native диаграммы";
    КонецЕсли;
    Если График.Точки.Количество() <> 2 Или График.Серии.Количество() <> 1
        Или План.Точки.Количество() <> 2 Или План.Серии.Количество() <> 1 Тогда
        ВызватьИсключение "Не совпали полные actual размеры графиков";
    КонецЕсли;
    СерияГрафика = График.Серии.Получить(0);
    СерияПлана = План.Серии.Получить(0);
    Если СерияГрафика.Значение <> "b942d45e-42bc-4788-b3cb-36d5a624f127/Часы" Или СерияГрафика.Текст <> "Часы задач"
        Или СерияПлана.Значение <> "b942d45e-42bc-4788-b3cb-36d5a624f127/План" Или СерияПлана.Текст <> "Только собственные задачи"
        Или График.ТипДиаграммы <> ТипДиаграммы.Гистограмма
        Или График.ОбластьЗаголовка.Текст <> "Собственные трудозатраты по столам: часы задач"
        Или План.ОбластьЗаголовка.Текст <> "Свой учебный план: не календарь сотрудников" Тогда
        ВызватьИсключение "Не совпали собственные серии, заголовки или native тип графика";
    КонецЕсли;
    Ресурсы = СтрРазделить("СтолА,СтолБ", ",");
    Задачи = СобственныеЗадачи85();
    Проверенные = Новый Массив;
    Факты = Новый Соответствие;
    СекундыЗадач = 0;
    ЧасыГрафика = 0;
    Для Индекс = 0 По 1 Цикл
        Ресурс = Ресурсы[Индекс];
        ТочкаГрафика = График.Точки.Получить(Индекс);
        ТочкаПлана = План.Точки.Получить(Индекс);
        Если ТочкаГрафика.Значение <> Ресурс Или ТочкаГрафика.Текст <> Ресурс
            Или ТочкаПлана.Значение <> Ресурс Или ТочкаПлана.Текст <> Ресурс Тогда
            ВызватьИсключение "Неподготовленная точка или порядок ресурсов";
        КонецЕсли;
        ЗначениеГрафика = График.ПолучитьЗначение(ТочкаГрафика, СерияГрафика);
        ЗначениеПлана = План.ПолучитьЗначение(ТочкаПлана, СерияПлана);
        ОжидаемыеЧасы = ?(Индекс = 0, 4, 2);
        ОжидаемоеКоличество = ?(Индекс = 0, 2, 1);
        Если ТипЗнч(ЗначениеГрафика.Значение) <> Тип("Число") Или ЗначениеГрафика.Значение <> ОжидаемыеЧасы
            Или ЗначениеПлана.Количество() <> ОжидаемоеКоличество Или ЗначениеПлана.Редактирование Тогда
            ВызватьИсключение "Actual значения4/2 и состав интервалов2/1 не совпали";
        КонецЕсли;
        ЧасыГрафика = ЧасыГрафика + ЗначениеГрафика.Значение;
        Для Каждого ИнтервалПлана Из ЗначениеПлана Цикл
            Свой = Неопределено;
            Для Каждого Задача Из Задачи Цикл
                Если ИнтервалПлана.Расшифровка = Задача.Код Тогда
                    Свой = Задача;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если Свой = Неопределено Тогда
                ВызватьИсключение "В actual плане найден неизвестный ID интервала";
            КонецЕсли;
            Если Проверенные.Найти(Свой.Код) <> Неопределено Или Свой.Ресурс <> Ресурс
                Или ТипЗнч(ИнтервалПлана.Начало) <> Тип("Дата") Или ТипЗнч(ИнтервалПлана.Конец) <> Тип("Дата")
                Или ИнтервалПлана.Начало <> Свой.Начало Или ИнтервалПлана.Конец <> Свой.Конец
                Или ИнтервалПлана.Текст <> Свой.Задача Тогда
                ВызватьИсключение "Actual интервал изменен, задублирован либо принадлежит другому столу";
            КонецЕсли;
            Проверенные.Добавить(Свой.Код);
            Факты.Вставить(Свой.Код, Новый ФиксированнаяСтруктура("Начало,Конец,Текст,Ресурс", ИнтервалПлана.Начало, ИнтервалПлана.Конец, ИнтервалПлана.Текст, Ресурс));
            СекундыЗадач = СекундыЗадач + (ИнтервалПлана.Конец - ИнтервалПлана.Начало);
        КонецЦикла;
    КонецЦикла;
    Если Проверенные.Количество() <> 3 Или СекундыЗадач <> 21600 Или ЧасыГрафика <> 6 Тогда
        ВызватьИсключение "Нужны все три собственных задачи и шесть task-hours";
    КонецЕсли;
    Паспорт = "СтолА=4|СтолБ=2|";
    Упорядоченные = Новый Массив;
    Для Каждого Задача Из Задачи Цикл
        Факт = Факты.Получить(Задача.Код);
        Если Факт = Неопределено Тогда
            ВызватьИсключение "Отсутствует полный actual факт собственной задачи";
        КонецЕсли;
        Паспорт = Паспорт + Задача.Код + "|" + Факт.Ресурс + "|" + Факт.Текст
            + "|" + Формат(Факт.Начало, "ДФ=yyyyMMddHHmmss") + "|" + Формат(Факт.Конец, "ДФ=yyyyMMddHHmmss") + ";";
        Позиция = 0;
        Пока Позиция < Упорядоченные.Количество() Цикл
            Если Факт.Начало < Упорядоченные[Позиция].Начало Тогда
                Прервать;
            КонецЕсли;
            Позиция = Позиция + 1;
        КонецЦикла;
        Упорядоченные.Вставить(Позиция, Факт);
    КонецЦикла;
    НачалоОбъединения = Неопределено;
    КонецОбъединения = Неопределено;
    СекундыЗанято = 0;
    Для Каждого ИнтервалВремени Из Упорядоченные Цикл
        Если НачалоОбъединения = Неопределено Тогда
            НачалоОбъединения = ИнтервалВремени.Начало;
            КонецОбъединения = ИнтервалВремени.Конец;
        ИначеЕсли ИнтервалВремени.Начало <= КонецОбъединения Тогда
            Если ИнтервалВремени.Конец > КонецОбъединения Тогда
                КонецОбъединения = ИнтервалВремени.Конец;
            КонецЕсли;
        Иначе
            СекундыЗанято = СекундыЗанято + (КонецОбъединения - НачалоОбъединения);
            НачалоОбъединения = ИнтервалВремени.Начало;
            КонецОбъединения = ИнтервалВремени.Конец;
        КонецЕсли;
    КонецЦикла;
    СекундыЗанято = СекундыЗанято + (КонецОбъединения - НачалоОбъединения);
    Если СекундыЗанято <> 18000 Тогда
        ВызватьИсключение "Actual объединение должно дать пять часов, не шесть";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("Паспорт,ЧасыЗадач,ЧасыЗанято", Паспорт, СекундыЗадач / 3600, СекундыЗанято / 3600);
КонецФункции

&НаСервере
Процедура РазместитьСвоиОбласти85(График, План, Профиль)
    ЗаголовокГрафика = График.ОбластьЗаголовка;
    ЛегендаГрафика = График.ОбластьЛегенды;
    ЗаголовокПлана = План.ОбластьЗаголовка;
    ЛегендаПлана = План.ОбластьЛегенды;
    Если ТипЗнч(ЗаголовокГрафика) <> Тип("ОбластьЗаголовкаДиаграммы")
        Или ТипЗнч(ЛегендаГрафика) <> Тип("ОбластьЛегендыДиаграммы")
        Или ТипЗнч(ЗаголовокПлана) <> Тип("ОбластьЗаголовкаДиаграммыГанта")
        Или ТипЗнч(ЛегендаПлана) <> Тип("ОбластьЛегендыДиаграммыГанта") Тогда
        ВызватьИсключение "Readonly native фабрики должны дать четыре настоящие области";
    КонецЕсли;
    РежимЛегенды = ?(Профиль = "Справа", РасположениеЛегендыДиаграммы.Право, РасположениеЛегендыДиаграммы.Низ);
    ЗаголовокГрафика.Расположение = РасположениеОбластиЗаголовкаДиаграммы.Верх;
    ЗаголовокПлана.Расположение = РасположениеОбластиЗаголовкаДиаграммы.Верх;
    ЛегендаГрафика.Расположение = РежимЛегенды;
    ЛегендаПлана.Расположение = РежимЛегенды;
    Если ЗаголовокГрафика.Расположение <> РасположениеОбластиЗаголовкаДиаграммы.Верх
        Или ЗаголовокПлана.Расположение <> РасположениеОбластиЗаголовкаДиаграммы.Верх
        Или ЛегендаГрафика.Расположение <> РежимЛегенды Или ЛегендаПлана.Расположение <> РежимЛегенды Тогда
        ВызватьИсключение "Штатные режимы размещения не подтвердились actual чтением";
    КонецЕсли;
    ЛевоЛегенды = ?(Профиль = "Справа", 0.78, 0.05);
    ВерхЛегенды = ?(Профиль = "Справа", 0.20, 0.80);
    ПравоЛегенды = ?(Профиль = "Справа", 0.98, 0.95);
    НизЛегенды = ?(Профиль = "Справа", 0.92, 0.98);
    ПроверитьПрямоугольник85(0.05, 0.02, 0.95, 0.14);
    ПроверитьПрямоугольник85(ЛевоЛегенды, ВерхЛегенды, ПравоЛегенды, НизЛегенды);
    Если ВерхЛегенды <= 0.14 Тогда
        ВызватьИсключение "Own title и legend прямоугольники не должны пересекаться";
    КонецЕсли;
    ЗаголовокГрафика.Расположение = РасположениеОбластиЗаголовкаДиаграммы.УказываетсяРасположение;
    ЗаголовокГрафика.Лево = 0.05;
    ЗаголовокГрафика.Верх = 0.02;
    ЗаголовокГрафика.Право = 0.95;
    ЗаголовокГрафика.Низ = 0.14;
    ЛегендаГрафика.Расположение = РасположениеЛегендыДиаграммы.УказываетсяРасположение;
    ЛегендаГрафика.Лево = ЛевоЛегенды;
    ЛегендаГрафика.Верх = ВерхЛегенды;
    ЛегендаГрафика.Право = ПравоЛегенды;
    ЛегендаГрафика.Низ = НизЛегенды;
    ЗаголовокПлана.Расположение = РасположениеОбластиЗаголовкаДиаграммы.УказываетсяРасположение;
    ЗаголовокПлана.Лево = 0.05;
    ЗаголовокПлана.Верх = 0.02;
    ЗаголовокПлана.Право = 0.95;
    ЗаголовокПлана.Низ = 0.14;
    ЛегендаПлана.Расположение = РасположениеЛегендыДиаграммы.УказываетсяРасположение;
    ЛегендаПлана.Лево = ЛевоЛегенды;
    ЛегендаПлана.Верх = ВерхЛегенды;
    ЛегендаПлана.Право = ПравоЛегенды;
    ЛегендаПлана.Низ = НизЛегенды;
    ПроверитьСвоиОбласти85(График, План, Профиль);
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоиОбласти85(График, План, Профиль)
    ЗаголовокГрафика = График.ОбластьЗаголовка;
    ЛегендаГрафика = График.ОбластьЛегенды;
    ЗаголовокПлана = План.ОбластьЗаголовка;
    ЛегендаПлана = План.ОбластьЛегенды;
    Если ТипЗнч(ЗаголовокГрафика) <> Тип("ОбластьЗаголовкаДиаграммы")
        Или ТипЗнч(ЛегендаГрафика) <> Тип("ОбластьЛегендыДиаграммы")
        Или ТипЗнч(ЗаголовокПлана) <> Тип("ОбластьЗаголовкаДиаграммыГанта")
        Или ТипЗнч(ЛегендаПлана) <> Тип("ОбластьЛегендыДиаграммыГанта") Тогда
        ВызватьИсключение "Повторное чтение parent.Area не вернуло четыре настоящие native области";
    КонецЕсли;
    ЛевоЛегенды = ?(Профиль = "Справа", 0.78, 0.05);
    ВерхЛегенды = ?(Профиль = "Справа", 0.20, 0.80);
    ПравоЛегенды = ?(Профиль = "Справа", 0.98, 0.95);
    НизЛегенды = ?(Профиль = "Справа", 0.92, 0.98);
    Если ЗаголовокГрафика.Расположение <> РасположениеОбластиЗаголовкаДиаграммы.УказываетсяРасположение
        Или ЗаголовокГрафика.Лево <> 0.05 Или ЗаголовокГрафика.Верх <> 0.02 Или ЗаголовокГрафика.Право <> 0.95 Или ЗаголовокГрафика.Низ <> 0.14
        Или ЛегендаГрафика.Расположение <> РасположениеЛегендыДиаграммы.УказываетсяРасположение
        Или ЛегендаГрафика.Лево <> ЛевоЛегенды Или ЛегендаГрафика.Верх <> ВерхЛегенды Или ЛегендаГрафика.Право <> ПравоЛегенды Или ЛегендаГрафика.Низ <> НизЛегенды
        Или ЗаголовокПлана.Расположение <> РасположениеОбластиЗаголовкаДиаграммы.УказываетсяРасположение
        Или ЗаголовокПлана.Лево <> 0.05 Или ЗаголовокПлана.Верх <> 0.02 Или ЗаголовокПлана.Право <> 0.95 Или ЗаголовокПлана.Низ <> 0.14
        Или ЛегендаПлана.Расположение <> РасположениеЛегендыДиаграммы.УказываетсяРасположение
        Или ЛегендаПлана.Лево <> ЛевоЛегенды Или ЛегендаПлана.Верх <> ВерхЛегенды Или ЛегендаПлана.Право <> ПравоЛегенды Или ЛегендаПлана.Низ <> НизЛегенды Тогда
        ВызватьИсключение "Полный actual readback четырех областей не совпал с собственным профилем";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПроверитьПрямоугольник85(Лево, Верх, Право, Низ)
    Координаты = Новый Массив;
    Координаты.Добавить(Лево);
    Координаты.Добавить(Верх);
    Координаты.Добавить(Право);
    Координаты.Добавить(Низ);
    Для Каждого Координата Из Координаты Цикл
        Если ТипЗнч(Координата) <> Тип("Число") Или Координата < 0 Или Координата > 1 Тогда
            ВызватьИсключение "Нужны числовые относительные координаты0..1, не пиксели";
        КонецЕсли;
    КонецЦикла;
    Если Лево >= Право Или Верх >= Низ Тогда
        ВызватьИсключение "Прямоугольник должен иметь положительную ширину и высоту";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоюКартинку85(Картинка)
    Если ТипЗнч(Картинка) <> Тип("Картинка") Или Картинка.Вид <> ВидКартинки.Абсолютная
        Или Картинка.Формат() <> ФорматКартинки.PNG
        Или ТипЗнч(Картинка.Ширина()) <> Тип("Число") Или ТипЗнч(Картинка.Высота()) <> Тип("Число")
        Или Картинка.Ширина() <> 820 Или Картинка.Высота() <> 460 Тогда
        ВызватьИсключение "Native результат должен быть своей растровойPNG820x460, не guessed file или библиотека";
    КонецЕсли;
КонецПроцедуры
own-layout-server-guard

УчебноеРазмещениеДиаграмм85 → Общие модули → УчебноеРазмещение85 → Модуль, целиком.

Полный собственный общий модуль СерверДа/КлиентНет/ГлобальныйНет/ВызовСервераНет/ПривилегированныйНет; вызывается только сервером своей формы.

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойСтендРазмещения85() Экспорт
    ПроверитьСвойПустойСтенд();
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnLayoutLab\b942d45e-42bc-4788-b3cb-36d5a624f127\Base"";"
        Или ИмяПользователя() <> "Размещение85Ученик" Тогда
        ВызватьИсключение "Нужен собственный точный File-стенд и собственный пользователь";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "В собственной новой ИБ должен быть ровно один настоящий пользователь";
    КонецЕсли;
    Если Пользователи[0].Имя <> "Размещение85Ученик"
        Или Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
        Или Метаданные.ОбщиеКоманды.Количество() <> 0 Или Метаданные.Роли.Количество() <> 1 Тогда
        ВызватьИсключение "Нужны только своя обработка, серверный guard, одна роль и один пользователь";
    КонецЕсли;
    Описание = Метаданные.Обработки.Найти("МоиДиаграммы85");
    Если Описание = Неопределено Или Метаданные.ОбщиеМодули.Найти("УчебноеРазмещение85") = Неопределено Тогда
        ВызватьИсключение "Не найдены собственные подготовленные метаданные";
    КонецЕсли;
    Если Описание.Формы.Количество() <> 1 Или Описание.Формы.Найти("ОсновнаяФорма") = Неопределено
        Или Описание.Реквизиты.Количество() <> 0 Или Описание.ТабличныеЧасти.Количество() <> 0
        Или Описание.Макеты.Количество() <> 0 Тогда
        ВызватьИсключение "У собственной обработки должна быть только одна подготовленная управляемая форма";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. NativeNewДиаграмма иNativeNewДиаграммаГанта создают кандидаты на сервере. Две точки/одна серия столбчатого графика содержат4 и2часа; две точки/одна серия плана имеют2 и1интервала. GetValue возвращает настоящие значения соответствующих разных native типов.

  2. Полное чтение фактов сверяет все ID/ресурсы/тексты/начала/концы/количества/серии/заголовки и4/2. Sumdurations=6task-hours, сортировка actual интервалов/слияние перекрытия09–12 и13–15 дает5часов объединения; сумма столбцов не заменяет эту вторую величину.

  3. Четыре readonly-свойства диаграмм ОбластьЗаголовка/ОбластьЛегенды являются фабриками actual типов. Сами области изменяемые: каждый из20 целевых членов установлен ипрочитан. Отдельный reader заново берет все4parent.Area и повторяет4actualtypeguards/all20expectedreads после setters, послеPNG ипосле assignment вформу. Cached refs не выдаются за состояние parent.

  4. Сначала native режим заголовкаВерх и легендыПраво/Низ проверяется actual чтением. Затем final режимУказываетсяРасположение по exact native контракту связывает Лево/Верх/Право/Низ. Для заголовков x0.05..0.95/y0.02..0.14; легенда справа x0.78..0.98/y0.20..0.92, снизу x0.05..0.95/y0.80..0.98.

  5. Проверка прямоугольников требует число0..1 и положительную площадь, title иlegend не пересекаются друг с другом. Положение области построения/отрисованный текст не угадываются: отсутствие перекрытия с ними остается будущей ручной визуальной проверкой.

  6. GetPicture(820,460,ФорматКартинки.PNG) вызывается отдельно у каждого actual кандидата. Оба native результата должны иметь типКартинка, ВидАбсолютная (картинка хранится в самом объекте), Формат()PNG ичисловыеШирина()/Высота()820/460. Это методы0args, не вымышленные числовые свойства; библиотечная/пустая/неизвестныхразмеров картинка означает отказ.

  7. Before/after паспорт сформирован из actual фактов собственных интервалов в устойчивом порядке. После оформления, после native получения картинок и после assignment в форму его сравнивают; числовые итоги также вычисляются заново, не подменяются успешным getter-only отчетом.

  8. Все кандидаты/геометрия/readback/PNG проверены до первой замены видимого состояния. Принятие четырех реквизитов последовательно, не атомарно; ошибка после начала установки останавливает серверный маршрут. Clientcatch отдельно ставит локальный sticky-stop иповторно вызывает исключение, не полагаясь на серверную синхронизацию. Никаких DBwrites/файлового экспорта/очистки/автоматического отката.

Как проверить результат

  1. Первый профиль справа: собственные4/2,6task-hours/5unionhours, три точных интервала, final normalizedtitle/legend coordinates иPNG820x460. Второй снизу: те же полные данные и размеры PNG, изменены только normalizedlegend rectangle/native placement.

  2. Попробуйте в копии учебного исходника координаты-1/820/равныеграницы или неизвестный профиль. Статические негативные тесты их отвергают; в будущем ownruntime validation отказывает до commit. Не меняйте production или readonlynative area factories.

  3. При измененном ID/ресурсе/тексте/дате/значении4/2/кратности интервала полное чтение фактов отказывает. При неверномnativePNGтипе/формате/размерах никакой кандидат не считается успешным.

  4. Вручную визуально сравните title/legend обеих сцен иэкспортныеpreview; читабельность ивывод не проверялись запуском1С здесь. Подтверждение API/readback нельзя объявлять доказательством renderer/UI.

Ожидаемый результат

Для будущего ручного выполнения ожидаются две собственные диаграммы и дваPNG820x460, неизменные значения4/2 и полные3интервала,6task-hours и5часов объединения при обоих профилях. Здесь выполнены только авторство/статические проверки: actual1С/данные/VM/UI/генерацияPNG/файлы/сеть0.

На что обратить внимание

  1. Границы области — нормализованные координаты0..1 относительно диаграммы. Они не пиксели;820/460 относятся только к outputPNG. Верх/Низ иЛево/Право имеют разные оси.

  2. ReadonlyОбластьЗаголовка/ОбластьЛегенды не присваиваются ине конструируются черезNewarea. Изменяются реальные дочерние области, возвратactualtype проверен.

  3. РежимыПраво/Низ имеют штатный смысл, ноfinalУказываетсяРасположение применяет именно четыре bounds. Живость getter-копии не угадывается: reader повторно получаетactual4parent.Area, аесли новыезначения не сохраняются вparent — честный отказ. Полный readback подтверждает состояние API, не renderer/точнуюширину текста.

  4. 6task-hours учитывают обе параллельные задачиСтолА,5часов объединения считают09–12 один раз и13–15 еще2. Ни одна величина не называется рабочими часами сотрудников/занятостьюпроизводства.

  5. NativePNG формируется в памяти. Нельзя считать исходные диаграммы или формат PNG доказательством отсутствия обрезания текста; требуется ручной просмотр своего будущего native результата.

  6. Команды/события вызываются платформой, не прямымcallhandler. ПриОткрытии лишь ограничивает типклиента и дает инструкцию; формирование выполняет отдельная настоящая команда.

  7. До проверки кандидатов не меняются видимые графики. После первой assignment возможен частичный результат; sticky-stop не гарантирует транзакционный откат GUI и не заявляет атомарности.

  8. Все числа/даты/UUID учебные literals этой новой CF. Нет unknownИсходныйОбъект, стороннихформ/данных/сервера, actualruntime/production/licensing/network/сохраненияфайлов/новых backups.

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

Оформить заголовок, легенду и учебный фон обеда

Оформление разных областей задаётся независимо. Фон отмечает перерыв, а не уменьшает длительность полос и не запрещает действия.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе создайте новую внешнюю обработку УчебнаяДиаграммаГанта с пустой управляемой основной формой.

  2. Не добавляйте вручную реквизит УчебныйГрафик и поле ПолеГанта. В событиях формы свяжите ПриСозданииНаСервере с одноимённой процедурой.

  3. Весь код вставьте на уровне модуля, сохраните EPF и откройте в тонком клиенте Windows. Каждый урок запускайте в отдельной копии формы.

  4. Две вымышленные задачи 14–16 сентября 2026 года создаются только в памяти. Рабочие заказы, расписания и печать не используются.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    Новые.Добавить(Новый РеквизитФормы("УчебныйГрафик", Новый ОписаниеТипов("ДиаграммаГанта")));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    График = Новый ДиаграммаГанта;
    График.Обновление = Ложь;
    График.АвтоОпределениеПолногоИнтервала = Ложь;
    График.УстановитьПолныйИнтервал(Дата(2026, 9, 14, 9), Дата(2026, 9, 16, 18));
    График.АвтоУстановкаТекстаСерий = Ложь;
    График.АвтоУстановкаТекстаТочек = Ложь;
    График.ОтображатьПустыеЗначения = Ложь;
    График.ОтображениеТекстаИнтервала = ОтображениеТекстаИнтервалаДиаграммыГанта.Отображать;
    График.ПрозрачныйФон = Ложь;
    График.ЦветФона = Новый Цвет(255, 255, 255);
    График.Окантовка = Истина;
    План = График.УстановитьСерию("plan");
    План.Текст = "Учебный план";
    План.Цвет = Новый Цвет(80, 145, 210);
    План.ПриоритетЦвета = Истина;
    Факт = График.УстановитьСерию("actual");
    Факт.Текст = "Учебный факт";
    Факт.Цвет = Новый Цвет(95, 165, 95);
    Факт.ПриоритетЦвета = Истина;
    Подготовка = График.УстановитьТочку("prepare");
    Подготовка.Текст = "Подготовка учебного комплекта";
    Сборка = График.УстановитьТочку("assemble");
    Сборка.Текст = "Сборка учебного комплекта";
    ПланПодготовки = График.ПолучитьЗначение(Подготовка, План);
    ПланПодготовки.Текст = "План подготовки";
    ПланПодготовки.Редактирование = Ложь;
    Первый = ПланПодготовки.Добавить();
    Первый.Начало = Дата(2026, 9, 14, 9);
    Первый.Конец = Дата(2026, 9, 14, 12);
    Первый.Текст = "Подготовка: 3 часа";
    Первый.Расшифровка = "training-prepare-plan";
    ПланСборки = График.ПолучитьЗначение(Сборка, План);
    ПланСборки.Текст = "План сборки";
    ПланСборки.Редактирование = Ложь;
    Второй = ПланСборки.Добавить();
    Второй.Начало = Дата(2026, 9, 14, 13);
    Второй.Конец = Дата(2026, 9, 15, 11);
    Второй.Текст = "Сборка учебного комплекта";
    Второй.Расшифровка = "training-assemble-plan";
    ФактПодготовки = График.ПолучитьЗначение(Подготовка, Факт);
    ФактПодготовки.Редактирование = Ложь;
    Фактический = ФактПодготовки.Добавить();
    Фактический.Начало = Дата(2026, 9, 14, 9);
    Фактический.Конец = Дата(2026, 9, 14, 13);
    Фактический.Текст = "Учебный факт: 4 часа";
    Заголовок = График.ОбластьЗаголовка;
    Заголовок.Текст = "Учебный план и факт — 14–16.09.2026";
    Область = График.ОбластьПостроения;
    Область.Заголовок = "Учебные задачи";
    Область.ОтображатьТекстТочек = ОтображениеВДиаграммеГанта.Отображать;
    Шкала = Область.ШкалаВремени;
    Пока Шкала.Элементы.Количество() > 0 Цикл
        Шкала.Элементы.Удалить(Шкала.Элементы.Получить(0));
    КонецЦикла;
    Дни = Шкала.Элементы.Добавить();
    Дни.Единица = ТипЕдиницыШкалыВремени.День;
    Дни.Кратность = 1;
    Дни.Формат = "ДФ=dd.MM";
    Заголовок.ПрозрачныйФон = Ложь;
    Заголовок.ЦветФона = Новый Цвет(235, 245, 255);
    Заголовок.ЦветТекста = Новый Цвет(30, 60, 90);
    Заголовок.ЦветРамки = Новый Цвет(100, 140, 180);
    Заголовок.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
    Заголовок.Шрифт = Новый Шрифт("Arial", 12, Истина);
    Легенда = График.ОбластьЛегенды;
    Легенда.ПрозрачныйФон = Ложь;
    Легенда.ЦветФона = Новый Цвет(250, 250, 250);
    Легенда.ЦветТекста = Новый Цвет(35, 45, 55);
    Легенда.ЦветРамки = Новый Цвет(195, 205, 215);
    Легенда.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
    Легенда.Шрифт = Новый Шрифт("Arial", 10);
    Легенда.Прокрутка = Истина;
    Область.ПрозрачныйФон = Ложь;
    Область.ЦветФона = Новый Цвет(255, 255, 255);
    Область.ЦветТекста = Новый Цвет(35, 45, 55);
    Область.ЦветРамки = Новый Цвет(195, 205, 215);
    Область.ЦветШкалы = Новый Цвет(240, 245, 250);
    Область.ЦветЗаГраницейПолногоИнтервала = Новый Цвет(235, 235, 235);
    Область.Шрифт = Новый Шрифт("Arial", 10);
    Фоны = График.ИнтервалыФона;
    Фоны.Очистить();
    Обед = Фоны.Добавить(Дата(2026, 9, 14, 12), Дата(2026, 9, 14, 13));
    Обед.Цвет = Новый Цвет(250, 240, 205);
    Проба = Фоны.Добавить(Дата(2026, 9, 14, 16), Дата(2026, 9, 14, 17));
    Фоны.Удалить(Проба);
    Сообщить(Фоны.Количество() = 1);
    Сообщить(Обед.Конец - Обед.Начало = 3600);

    График.Обновление = Истина;
    ЭтаФорма.УчебныйГрафик = График;
    Поле = Элементы.Добавить("ПолеГанта", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеДиаграммыГанта;
    Поле.ПутьКДанным = "УчебныйГрафик";
    Поле.РастягиватьПоГоризонтали = Истина;
    Поле.РастягиватьПоВертикали = Истина;

    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Проверить учебное оформление";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Сообщить("Откройте учебный график: два плана и один факт.");
КонецПроцедуры

Разбор по шагам

  1. Заголовок, Легенда и ОбластьПостроения — разные объекты; цвет заголовка не меняет автоматически фон поля задач.

  2. Снимаем прозрачность нужных областей, затем задаём фон/текст/рамку/шрифт.

  3. Прокрутка легенды пригодится при множестве серий; здесь две серии с собственными подписями.

  4. Фон обеда создаётся в отдельной коллекции. Удаляем пробный фон, основной остаётся на один час.

  5. Интервалы рабочих задач не сокращаются от цвета: время и оформление независимы.

Как проверить результат

  1. Две проверки Истина при создании.

  2. Заголовок голубой, подписи контрастные, обед жёлтым фоном 12:00–13:00.

  3. План подготовки 3 часа, факт 4 часа остались прежними.

Ожидаемый результат

Есть целостный оформленный график без смешения фонов, полос времени и бизнес-правил.

На что обратить внимание

  1. Цвет фона не заменяет календарь нерабочего времени.

  2. Для маленького окна часть легенды/подписей может потребовать прокрутки.

  3. Очистить фонов вызывается лишь на собственном новом графике.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.