Тип: Число. Относительное положение верхней границы. Может содержать значения от 0 до 1. 0 - верхний край, 0,5 - центр, 1 - нижний край.
Полное описание, параметры и ограничения
ОбластьПостроенияДиаграммыГанта.Верх (GanttChartPlotArea.Top)
ОбластьПостроенияДиаграммыГанта (GanttChartPlotArea)
Верх (Top)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Число.
Относительное положение верхней границы.
Может содержать значения от 0 до 1.
0 - верхний край, 0,5 - центр, 1 - нижний край.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Свой план Ганта: читаемое оформление, перекрытие и безопасная расшифровка
Полная собственная форма показывает три вымышленные задачи на двух ресурсах. Оформление настоящих native точек и области имеет практическую роль: библиотечный флаг, контрастные подписи, цвет перекрытия и управляемые относительные границы. Итоги вычисляются из прочитанных native интервалов, а не подставляются: 6 task-hours против 5 часов объединённого времени. Автор только подготовил исходники и статические проверки, не запускал 1С/UI/файлы/БД.
Где и как запускать
Полный модуль управляемой ОсновнаяФорма только собственной обработки МойПланГанта85. Тонкий Windows/толстый управляемый клиент8.5.1.1343; creation и exact guards на сервере, native chart/immutable literal/readback/callback на клиенте. Серверный supporting общий модуль самостоятельный.
Подготовка
Создайте НОВУЮ пустую файловую CF УчебныйГантОформление85 только платформой8.5.1.1343, режим совместимости НеИспользовать, основное приложение УправляемоеПриложение. Собственная база ровно C:\1C85_OwnGanttLab\f365fa56-fb7f-4b45-ae60-7b83543bb868\Base; запуск File="этот полный путь"; без server/other connection частей. Не берите production CF, документы, расширения или чужие настройки; metadata-имя само по себе не доказывает владение.
В этой CF нет каталогов/документов/регистров/планов/отчётов/общих форм/расширений/подписок/заданий. Ровно одна роль УчебныйГантРоль85, один собственный пользователь Гант85Ученик, право управляемого запуска/собственной обработки и вызова указанного серверного guard. Создайте ровно один общий модуль УчебныйГант85: Глобальный=Нет, Сервер=Да, ВызовСервера=Да, Клиент=Нет, Привилегированный=Нет; supporting server code целиком в этот модуль.
Добавьте ровно одну обработку МойПланГанта85 без object реквизитов, табличных частей и макетов. Одна управляемая ОсновнаяФорма назначена основной. Реквизиты формы План85 ДиаграммаГанта; Лево85/Верх85/Право85/Низ85 Число(4,2), ДопустимыйЗнак=Любой; ЧасыЗадач85/ЧасыЗанято85 Число(6,2); Подробности85/Состояние85 Строка неограниченная. Не создавайте одноимённые object реквизиты.
На форме поле ПолеПлана85, Вид=ПолеДиаграммыГанта, ПутьКДанным=План85, растягивание по обеим сторонам разрешено, размер достаточно большой для двух подписей. Поля четырёх координат связаны с соответствующими numeric реквизитами и доступны вводу; два итоговых поля и поля подробностей/состояния только просмотр, подробности многострочные. ВосстанавливатьЗначенияПриОткрытии=Нет. Никакого HTML/табличного viewer/печати нет.
Команды формы ПрименитьГраницы85 и КомпактноеПоле85, одноимённые обработчики(Команда), две связанные кнопки. Native события формы ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) и ПриОткрытии(Отказ) свяжите с этими процедурами. Main code целиком в модуль управляемой формы. Обработчик field расшифровки устанавливается реально на сервере через УстановитьДействие; не вызывайте callback вручную.
Используйте тонкий клиент Windows или толстый управляемый клиент этой собственной CF. Все primitive literal задачи датированы 10.10.2026: СтолА 09:00–11:00 и 10:00–12:00; СтолБ 13:00–15:00. Это три учебных задачи, не производственные задания/календарь сотрудников. Код сохраняет неизменяемый снимок ФиксированныйМассив из ФиксированнаяСтруктура с точно typed строками/датами.
На own Windows клиенте должен быть Arial. БиблиотекаКартинок.ОформлениеФлагЗеленый — настоящий installed библиотечный элемент; не создавайте/загружайте картинку из файла и не подсовывайте абсолютный raster. Native ТочкаДиаграммыГанта.Картинка программно допускает Пустая/ИзБиблиотеки. Проверка Вид и exact library value читает настоящий результат присваивания.
Сверьте все модули собственной CF самостоятельно до ручного запуска. Автор НЕ создавал эту CF/пользователя/GUI, не исполнял native работу с файлами, 1С, БД, сетью, службами или библиотечным renderer. Изготовлены только lesson/test source файлы, root/config sources read-only, предыдущие frozen партии не меняются, новых backups/archives нет.
&НаКлиенте
Перем СвойСнимок85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УчебныйГант85.ПроверитьСвойГант85();
Если Элементы.ПолеПлана85.ПутьКДанным <> "План85"
Или Элементы.ПолеПлана85.Вид <> ВидПоляФормы.ПолеДиаграммыГанта Тогда
ВызватьИсключение "Собственное поле должно быть связано именно с реквизитом диаграммы";
КонецЕсли;
Элементы.ПолеПлана85.УстановитьДействие("ОбработкаРасшифровки", "ПолеПлана85ОбработкаРасшифровки");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойСтендНаСервере85()
УчебныйГант85.ПроверитьСвойГант85();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Лево85 = 0.02;
Верх85 = 0.10;
Право85 = 0.98;
Низ85 = 0.90;
Если Не ПерестроитьСвойПлан85() Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрименитьГраницы85(Команда)
ПерестроитьСвойПлан85();
КонецПроцедуры
&НаКлиенте
Процедура КомпактноеПоле85(Команда)
Лево85 = 0.15;
Верх85 = 0.20;
Право85 = 0.90;
Низ85 = 0.85;
ПерестроитьСвойПлан85();
КонецПроцедуры
&НаКлиенте
Функция ПерестроитьСвойПлан85()
Попытка
ПроверитьСвойСтендНаСервере85();
ПроверитьСвоиГраницы85(Лево85, Верх85, Право85, Низ85);
Снимок = СоздатьСвойСнимок85();
Кандидат = СоздатьСвоюДиаграмму85(Снимок, Лево85, Верх85, Право85, Низ85);
Итоги = ПрочитатьСвоиИнтервалы85(Кандидат, Снимок);
Если Итоги.ЧасыЗадач <> 6 Или Итоги.ЧасыЗанято <> 5 Тогда
ВызватьИсключение "Actual native intervals должны дать 6 task-hours и 5 часов объединения";
КонецЕсли;
Исключение
Состояние85 = "Отказ; предыдущая диаграмма и её итоги сохранены: " + ОписаниеОшибки();
Возврат Ложь;
КонецПопытки;
План85 = Кандидат;
СвойСнимок85 = Снимок;
ЧасыЗадач85 = Итоги.ЧасыЗадач;
ЧасыЗанято85 = Итоги.ЧасыЗанято;
Подробности85 = "Двойной щелчок на названии точки покажет её собственные задачи; на полосе — выбранные native интервалы.";
Состояние85 = "Actual readback: 2 точки, 1 серия, 3 интервала; 6 task-hours, 5 часов объединения. Перекрытие СтолА 10:00–11:00.";
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоиГраницы85(Лево, Верх, Право, Низ)
Координаты = Новый Массив;
Координаты.Добавить(Лево);
Координаты.Добавить(Верх);
Координаты.Добавить(Право);
Координаты.Добавить(Низ);
Для Каждого Координата Из Координаты Цикл
Если ТипЗнч(Координата) <> Тип("Число") Тогда
ВызватьИсключение "Координаты должны быть числами, а не текстом";
КонецЕсли;
Если Координата < 0 Или Координата > 1 Тогда
ВызватьИсключение "Относительные координаты области должны лежать в 0..1";
КонецЕсли;
КонецЦикла;
Если Лево >= Право Или Верх >= Низ Тогда
ВызватьИсключение "Нужна положительная ширина и высота области";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СоздатьСвойСнимок85()
Задачи = Новый Массив;
Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "f365fa56-fb7f-4b45-ae60-7b83543bb868/A", "Разбор материала", "СтолА", Дата(2026, 10, 10, 9), Дата(2026, 10, 10, 11)));
Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "f365fa56-fb7f-4b45-ae60-7b83543bb868/B", "Проверка образца", "СтолА", Дата(2026, 10, 10, 10), Дата(2026, 10, 10, 12)));
Задачи.Добавить(Новый ФиксированнаяСтруктура("Код,Задача,Ресурс,Начало,Конец", "f365fa56-fb7f-4b45-ae60-7b83543bb868/C", "Сборка комплекта", "СтолБ", Дата(2026, 10, 10, 13), Дата(2026, 10, 10, 15)));
Для Каждого Задача Из Задачи Цикл
Если ТипЗнч(Задача) <> Тип("ФиксированнаяСтруктура") Или Задача.Количество() <> 5
Или ТипЗнч(Задача.Код) <> Тип("Строка") Или ТипЗнч(Задача.Задача) <> Тип("Строка")
Или ТипЗнч(Задача.Ресурс) <> Тип("Строка") Или ТипЗнч(Задача.Начало) <> Тип("Дата")
Или ТипЗнч(Задача.Конец) <> Тип("Дата") Или Задача.Начало >= Задача.Конец Тогда
ВызватьИсключение "Собственный typed literal snapshot повреждён";
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированныйМассив(Задачи);
КонецФункции
&НаКлиенте
Функция СоздатьСвоюДиаграмму85(Снимок, Лево, Верх, Право, Низ)
Диаграмма = Новый ДиаграммаГанта;
Диаграмма.Обновление = Ложь;
Диаграмма.АвтоОпределениеПолногоИнтервала = Ложь;
Диаграмма.УстановитьПолныйИнтервал(Дата(2026, 10, 10, 8), Дата(2026, 10, 10, 16));
Диаграмма.АвтоУстановкаТекстаТочек = Ложь;
Диаграмма.АвтоУстановкаТекстаСерий = Ложь;
Диаграмма.ОтображатьПустыеЗначения = Ложь;
Диаграмма.ОтображениеИнтервала = ОтображениеИнтервалаДиаграммыГанта.Плоский;
Диаграмма.ОтображениеТекстаИнтервала = ОтображениеТекстаИнтервалаДиаграммыГанта.Отображать;
Диаграмма.ОбластьЗаголовка.Текст = "Свой учебный план: не календарь сотрудников";
Серия = Диаграмма.УстановитьСерию("f365fa56-fb7f-4b45-ae60-7b83543bb868/План");
Серия.Текст = "Только собственные задачи";
Серия.ПриоритетЦвета = Ложь;
Серия.Цвет = Новый Цвет(150, 150, 150);
Для Каждого Задача Из Снимок Цикл
Точка = Диаграмма.УстановитьТочку(Задача.Ресурс);
Точка.Текст = "Учебный " + Задача.Ресурс + ": данные только в памяти";
Точка.ПриоритетЦвета = Истина;
Если Задача.Ресурс = "СтолА" Тогда
Точка.Цвет = Новый Цвет(40, 110, 170);
Иначе
Точка.Цвет = Новый Цвет(40, 140, 85);
КонецЕсли;
Точка.ДополнительныйЦвет = Новый Цвет(210, 80, 35);
Точка.ЦветТекста = Новый Цвет(20, 35, 50);
Точка.ЦветФона = Новый Цвет(245, 248, 252);
Точка.Шрифт = Новый Шрифт("Arial", 11, Истина);
Точка.Картинка = БиблиотекаКартинок.ОформлениеФлагЗеленый;
Точка.Расшифровка = "f365fa56-fb7f-4b45-ae60-7b83543bb868/Ресурс/" + Задача.Ресурс;
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
Значение.Редактирование = Ложь;
Значение.Цвет = Новый Цвет();
Значение.ДополнительныйЦвет = Новый Цвет();
Значение.Расшифровка = Точка.Расшифровка;
Интервал = Значение.Добавить();
Интервал.Начало = Задача.Начало;
Интервал.Конец = Задача.Конец;
Интервал.Текст = Задача.Задача;
Интервал.Расшифровка = Задача.Код;
Интервал.Цвет = Новый Цвет();
КонецЦикла;
Область = Диаграмма.ОбластьПостроения;
Область.Расположение = РасположениеОбластиПостроенияДиаграммы.УказываетсяРасположение;
Область.Лево = Лево;
Область.Верх = Верх;
Область.Право = Право;
Область.Низ = Низ;
Область.РазмещениеТекста = ТипРазмещенияТекстаДиаграммыГанта.Переносить;
Область.ЛинииШкалы = Новый Линия(ТипЛинииДиаграммы.Точечная, 1);
Область.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
Область.ОтображатьТекстТочек = ОтображениеВДиаграммеГанта.Отображать;
Область.Заголовок = "Два своих рабочих места";
Шкала = Область.ШкалаВремени;
Шкала.Положение = ПоложениеШкалыВремени.Верх;
Пока Шкала.Элементы.Количество() > 0 Цикл
Шкала.Элементы.Удалить(Шкала.Элементы.Получить(0));
КонецЦикла;
Час = Шкала.Элементы.Добавить();
Час.Единица = ТипЕдиницыШкалыВремени.Час;
Час.Кратность = 1;
Час.Формат = "ДФ=HH:mm";
Диаграмма.Обновление = Истина;
Если Область.Расположение <> РасположениеОбластиПостроенияДиаграммы.УказываетсяРасположение
Или Область.Лево <> Лево Или Область.Верх <> Верх Или Область.Право <> Право Или Область.Низ <> Низ
Или Область.РазмещениеТекста <> ТипРазмещенияТекстаДиаграммыГанта.Переносить
Или Область.ЛинииШкалы.ТипЛинии <> ТипЛинииДиаграммы.Точечная Или Область.ЛинииШкалы.Толщина <> 1
Или Область.Рамка.ТипРамки <> ТипРамкиЭлементаУправления.Одинарная Или Область.Рамка.Толщина <> 1 Тогда
ВызватьИсключение "Actual plot settings не прочитались обратно";
КонецЕсли;
Возврат Диаграмма;
КонецФункции
&НаКлиенте
Функция ПрочитатьСвоиИнтервалы85(Диаграмма, Снимок)
Если ТипЗнч(Диаграмма) <> Тип("ДиаграммаГанта") Или Диаграмма.Точки.Количество() <> 2
Или Диаграмма.Серии.Количество() <> 1 Или Снимок.Количество() <> 3 Тогда
ВызватьИсключение "Нужны настоящий native graph и собственные 3 исходные задачи";
КонецЕсли;
Серия = Диаграмма.Серии.Получить(0);
Если Серия.Значение <> "f365fa56-fb7f-4b45-ae60-7b83543bb868/План" Или Серия.ПриоритетЦвета Тогда
ВызватьИсключение "Серия не должна перехватывать цвет собственных точек";
КонецЕсли;
Проверенные = Новый Массив;
СекундыЗадач = 0;
Упорядоченные = Новый Массив;
Для Каждого Точка Из Диаграмма.Точки Цикл
Если Точка.Значение <> "СтолА" И Точка.Значение <> "СтолБ" Тогда
ВызватьИсключение "В actual graph появилась чужая точка";
КонецЕсли;
Если Не Точка.ПриоритетЦвета Или Точка.ДополнительныйЦвет <> Новый Цвет(210, 80, 35)
Или Точка.ЦветТекста <> Новый Цвет(20, 35, 50) Или Точка.ЦветФона <> Новый Цвет(245, 248, 252)
Или Точка.Шрифт.Имя <> "Arial" Или Точка.Шрифт.Размер <> 11 Или Не Точка.Шрифт.Полужирный
Или Точка.Картинка.Вид <> ВидКартинки.ИзБиблиотеки
Или Точка.Картинка <> БиблиотекаКартинок.ОформлениеФлагЗеленый
Или Точка.Расшифровка <> "f365fa56-fb7f-4b45-ae60-7b83543bb868/Ресурс/" + Точка.Значение Тогда
ВызватьИсключение "Actual point style/librarypicture/owned detail key не совпал";
КонецЕсли;
Если Точка.Значение = "СтолА" Тогда
Если Точка.Цвет <> Новый Цвет(40, 110, 170) Тогда
ВызватьИсключение "Обычный цвет СтолА не совпал";
КонецЕсли;
ИначеЕсли Точка.Цвет <> Новый Цвет(40, 140, 85) Тогда
ВызватьИсключение "Обычный цвет СтолБ не совпал";
КонецЕсли;
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
Если Значение.Редактирование Или Значение.Цвет <> Новый Цвет()
Или Значение.ДополнительныйЦвет <> Новый Цвет() Или Значение.Расшифровка <> Точка.Расшифровка Тогда
ВызватьИсключение "Значение должно наследовать точечный цвет и own расшифровку без редактирования";
КонецЕсли;
Для Каждого Интервал Из Значение Цикл
Задача = НайтиСвоюЗадачу85(Снимок, Интервал.Расшифровка);
Если Задача = Неопределено Тогда
ВызватьИсключение "Actual interval имеет чужой либо неправильно typed ID";
КонецЕсли;
Если Задача.Ресурс <> Точка.Значение Или Интервал.Начало <> Задача.Начало
Или Интервал.Конец <> Задача.Конец Или Интервал.Текст <> Задача.Задача
Или Интервал.Цвет <> Новый Цвет() Или Проверенные.Найти(Задача.Код) <> Неопределено Тогда
ВызватьИсключение "Actual interval readback не совпал с собственным literal snapshot либо задублирован";
КонецЕсли;
Проверенные.Добавить(Задача.Код);
СекундыЗадач = СекундыЗадач + (Интервал.Конец - Интервал.Начало);
Позиция = 0;
Пока Позиция < Упорядоченные.Количество() Цикл
Если Интервал.Начало < Упорядоченные[Позиция].Начало Тогда
Прервать;
КонецЕсли;
Позиция = Позиция + 1;
КонецЦикла;
Упорядоченные.Вставить(Позиция, Новый ФиксированнаяСтруктура("Начало,Конец", Интервал.Начало, Интервал.Конец));
КонецЦикла;
КонецЦикла;
Если Проверенные.Количество() <> 3 Тогда
ВызватьИсключение "Actual graph должен содержать каждую из 3 собственных задач ровно один раз";
КонецЕсли;
НачалоОбъединения = Неопределено;
КонецОбъединения = Неопределено;
СекундыЗанято = 0;
Для Каждого ИнтервалВремени Из Упорядоченные Цикл
Если НачалоОбъединения = Неопределено Тогда
НачалоОбъединения = ИнтервалВремени.Начало;
КонецОбъединения = ИнтервалВремени.Конец;
ИначеЕсли ИнтервалВремени.Начало <= КонецОбъединения Тогда
Если ИнтервалВремени.Конец > КонецОбъединения Тогда
КонецОбъединения = ИнтервалВремени.Конец;
КонецЕсли;
Иначе
СекундыЗанято = СекундыЗанято + (КонецОбъединения - НачалоОбъединения);
НачалоОбъединения = ИнтервалВремени.Начало;
КонецОбъединения = ИнтервалВремени.Конец;
КонецЕсли;
КонецЦикла;
СекундыЗанято = СекундыЗанято + (КонецОбъединения - НачалоОбъединения);
Возврат Новый ФиксированнаяСтруктура("ЧасыЗадач,ЧасыЗанято", СекундыЗадач / 3600, СекундыЗанято / 3600);
КонецФункции
&НаКлиенте
Функция НайтиСвоюЗадачу85(Снимок, Код)
Если ТипЗнч(Код) <> Тип("Строка") Тогда
Возврат Неопределено;
КонецЕсли;
Для Каждого Задача Из Снимок Цикл
Если Задача.Код = Код Тогда
Возврат Задача;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура ПолеПлана85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДатаВыбора)
СтандартнаяОбработка = Ложь;
Если Элемент <> Элементы.ПолеПлана85 Или СвойСнимок85 = Неопределено Тогда
Состояние85 = "Расшифровка отклонена: нет своего committed graph/snapshot";
Возврат;
КонецЕсли;
Если ДатаВыбора <> Неопределено Тогда
Если ТипЗнч(ДатаВыбора) <> Тип("Дата") Тогда
Состояние85 = "Расшифровка отклонена: дата неверного типа";
Возврат;
КонецЕсли;
Если ДатаВыбора < Дата(2026, 10, 10, 8) Или ДатаВыбора > Дата(2026, 10, 10, 16) Тогда
Состояние85 = "Расшифровка отклонена: дата вне собственного дня";
Возврат;
КонецЕсли;
КонецЕсли;
Выбранные = СобратьСвоиВыбранныеЗадачи85(Расшифровка);
Если Выбранные = Неопределено Тогда
Состояние85 = "Неизвестная расшифровка отклонена; прошлые подробности и диаграмма сохранены, навигация не выполняется";
Возврат;
КонецЕсли;
Строки = Новый Массив;
Для Каждого Задача Из Выбранные Цикл
Строки.Добавить(Задача.Задача + " | " + Задача.Ресурс + " | "
+ Формат(Задача.Начало, "ДФ=HH:mm") + "–" + Формат(Задача.Конец, "ДФ=HH:mm")
+ " | " + Формат((Задача.Конец - Задача.Начало) / 3600, "ЧГ=0;ЧДЦ=0") + " ч задачи");
КонецЦикла;
Подробности85 = СтрСоединить(Строки, Символы.ПС);
Состояние85 = "Native событие → собственные подтверждённые IDs → immutable literal snapshot; никакого открытия внешнего значения";
КонецПроцедуры
&НаКлиенте
Функция СобратьСвоиВыбранныеЗадачи85(Расшифровка)
Источники = Новый Массив;
Если ТипЗнч(Расшифровка) = Тип("Массив") Тогда
Если Расшифровка.Количество() < 2 Или Расшифровка.Количество() > 4 Тогда
Возврат Неопределено;
КонецЕсли;
Для Каждого Источник Из Расшифровка Цикл
Источники.Добавить(Источник);
КонецЦикла;
ИначеЕсли ТипЗнч(Расшифровка) = Тип("Строка") Тогда
Источники.Добавить(Расшифровка);
Иначе
Возврат Неопределено;
КонецЕсли;
Ресурс = "";
Первый = Источники[0];
Если Первый = "f365fa56-fb7f-4b45-ae60-7b83543bb868/Ресурс/СтолА" Тогда
Ресурс = "СтолА";
ИначеЕсли Первый = "f365fa56-fb7f-4b45-ae60-7b83543bb868/Ресурс/СтолБ" Тогда
Ресурс = "СтолБ";
КонецЕсли;
Если Источники.Количество() > 1 И Ресурс = "" Тогда
Возврат Неопределено;
КонецЕсли;
Выбранные = Новый Массив;
Коды = Новый Массив;
Если Ресурс <> "" И Источники.Количество() = 1 Тогда
Для Каждого Задача Из СвойСнимок85 Цикл
Если Задача.Ресурс = Ресурс Тогда
Выбранные.Добавить(Задача);
КонецЕсли;
КонецЦикла;
Иначе
НачальныйИндекс = 0;
Если Ресурс <> "" Тогда
НачальныйИндекс = 1;
КонецЕсли;
Для Индекс = НачальныйИндекс По Источники.Количество() - 1 Цикл
Задача = НайтиСвоюЗадачу85(СвойСнимок85, Источники[Индекс]);
Если Задача = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если (Ресурс <> "" И Задача.Ресурс <> Ресурс) Или Коды.Найти(Задача.Код) <> Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Коды.Добавить(Задача.Код);
Выбранные.Добавить(Задача);
КонецЦикла;
КонецЕсли;
Если Выбранные.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Новый ФиксированныйМассив(Выбранные);
КонецФункцииСвой пустой CF: точная версия, File-путь, пользователь и metadata scope
Своя CF УчебныйГантОформление85 → ОбщиеМодули → УчебныйГант85 → Модуль целиком.
Серверный общий модуль, СерверДа/ВызовСервераДа/КлиентНет/ГлобальныйНет/ПривилегированныйНет. Только read-only guard; вызов реальной формы server creation и server bridge.
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойГант85() Экспорт
ПроверитьСвойПустойСтенд();
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnGanttLab\f365fa56-fb7f-4b45-ae60-7b83543bb868\Base"";"
Или ИмяПользователя() <> "Гант85Ученик" Тогда
ВызватьИсключение "Только свой точный File-стенд и собственный учебный пользователь";
КонецЕсли;
Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Роли.Количество() <> 1 Тогда
ВызватьИсключение "В собственном пустом стенде нужны только обработка, серверный модуль и одна роль";
КонецЕсли;
Описание = Метаданные.Обработки.Найти("МойПланГанта85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Нет собственной обработки МойПланГанта85";
КонецЕсли;
Если Описание.Формы.Количество() <> 1 Или Описание.Формы.Найти("ОсновнаяФорма") = Неопределено
Или Описание.Реквизиты.Количество() <> 0 Или Описание.ТабличныеЧасти.Количество() <> 0
Или Описание.Макеты.Количество() <> 0 Тогда
ВызватьИсключение "Собственная обработка должна иметь только свою одну управляемую форму";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Серверное создание проверяет exact platform/version/пустой own metadata/User/File connection, проверяет настоящие вид и ПутьКДанным ПолеПлана85 и устанавливает native обработчик по имени. Серверный guard вызывается заново при каждом явном rebuild; производственные данные вообще не читаются.
ПриОткрытии задаёт широкую геометрию Лево0.02/Верх0.10/Право0.98/Низ0.90 и вызывает внутренний builder, не command/event callback. Четыре числа сначала проходят type/range/strict-order guards. Ошибка геометрии не меняет прежнюю ДиаграммаГанта/итоги/snapshot.
Builder создаёт новый native ДиаграммаГанта и одну серию. Точки — два учебных ресурса, интервалы — три задачи: у СтолА два интервала перекрываются10–11. Полное окно8–16 задаётся native методом; readonly Begin/End не присваиваются.
Серия.ПриоритетЦвета=Ложь, каждая Точка.ПриоритетЦвета=Истина. Значение.Цвет/ДополнительныйЦвет и Интервал.Цвет получают настоящий АвтоЦвет через Новый Цвет(), поэтому не перехватывают точечную палитру. Native при равном приоритете выигрывает серия, здесь приоритеты намеренно разные. Обычный точечный цвет синий/зелёный, дополнительный оранжевый предназначен перекрытию СтолА.
Точка.ЦветТекста/ЦветФона/Шрифт оформляют подпись собственного ресурса, Картинка показывает native library flag, Расшифровка хранит exact собственный resource key. Текст длинный специально: native РазмещениеТекста=Переносить имеет смысл для этой подписи, не заменяет сами данные/длительность.
Область.Расположение=УказываетсяРасположение включает относительные границы0..1, не пиксели. Лево/Верх/Право/Низ ограничивают область; ЛинииШкалы создаются Линия(ТипЛинииДиаграммы.Точечная,1), Рамка — отдельный native Рамка(Одинарная,1). Часовая шкала9–15 даёт читаемую временную разметку. Все восемь plot свойств читаются обратно до принятия candidate.
От actual native точек/значений получаем интервалы. Проверяем exact own ресурс/ID/текст/начала/концы, librarypicture, шрифт, цвета и отсутствие дублей. Сумма длительностей actual интервалов даёт2+2+2=6 task-hours. Actual интервалы сортируются в собственном Массив по Начало и сливаются как время: [09,12] + [13,15] =3+2=5 часов. Это не занятость каждого ресурса и не суммарная трудоёмкость.
Только прошедший actual geometry/style/data readback candidate записывается в visible План85, два numeric итога и client snapshot. КомпактноеПоле85 меняет геометрию на0.15/0.20/0.90/0.85 и выполняет новый полный native rebuild; три задачи и итоги остаются теми же. Отказ оставляет прежний graph/итоги, а введённые поля сохраняет для исправления пользователем.
Двойной щелчок по подписи СтолА/СтолБ вызывает настоящий field callback. Managed форма передаёт Элемент и три native параметра Расшифровка/СтандартнаяОбработка/Дата; native Date для выбора точки может быть Неопределено. В самой procedure первым действием СтандартнаяОбработка=Ложь, поэтому неизвестный объект не попадает в стандартную навигацию.
Point/resource string даёт задачи данного own ресурса. Native массив значения содержит сначала resource расшифровку значения, затем ID выбранных/перекрывающихся интервалов; код принимает только actual own IDs одного ожидаемого ресурса, без дублей и arbitrary type coercion. Для СтолА в зоне10–11 подробности двух задач по2ч; native дата проверяется отдельно и не объявляется длительностью. Неизвестная расшифровка не меняет прежние подробности.
Как проверить результат
После первого ручного запуска видны две строки ресурсов и три полосы. СтолА имеет интервалы09–11 и10–12, СтолБ13–15; actual numeric поля ЧасыЗадач85=6, ЧасыЗанято85=5. Наличие оранжевого перекрытия/контраста/переноса проверяется вручную в native renderer, не заявлено как исполненный автором runtime.
Нажмите КомпактноеПоле85: границы полей становятся0.15/0.20/0.90/0.85, область визуально меняется; readback подтверждает новый layout, но exact own интервалы и6/5 сохраняются. Верните координаты вручную и примените: rebuild снова заменяет graph только после проверки.
Введите Лево85=0.95, Право85=0.90 либо Верх85=-0.10: ПрименитьГраницы85 отказывает до нового graph, предыдущие План85/ЧасыЗадач85/ЧасыЗанято85/Snapshot не меняются. Поля ввода не откатываются тайно; исправьте их и повторите команду.
Дважды щёлкните подпись СтолА: подробности показывают Разбор материала09–11 и Проверка образца10–12, по2ч каждая. Для СтолБ Сборка комплекта13–15,2ч. Нативный выбор перекрытия10–11 даёт actual массив value/interval details; нет ручного вызова callback для имитации события.
Две точки используют exact библиотечный флаг, absolute картинки не загружаются. readback ПроверитьСвоиИнтервалы подтверждает ВидКартинки.ИзБиблиотеки и equality own installed value, priority seriesFalse/pointTrue, Auto цвета значения/интервала. Это проверка установленных свойств, не измерение RGB пикселей renderer.
Wrong own metadata/version/User/File path отказывает. Static negative tests дополнительно проверяют readonly assignments, wrong method arity, чужой detail ID, смешанный resource массив и reversed geometry. Это source проверки, НЕ запуск runtime 1С или подтверждение UI события в чужой конфигурации.
Ожидаемый результат
Собственная managed форма получает читаемый native план двух ресурсов и трёх задач; новое оформление подтверждено property/data readback до commit, трудоёмкость6ч отличена от объединённого времени5ч, а реальные native расшифровки показывают только свой immutable snapshot.
На что обратить внимание
Точка означает ресурс/строку, не обязательно отдельную задачу. У одной точки в одной серии возможно несколько интервалов; именно это даёт реальное перекрытие и роль ДополнительныйЦвет. Интервалы разных строк не образуют наложение в одной полосе.
При равных ПриоритетЦвета native берёт серию. Auto цвета значения и интервала важны; прямое присваивание им собственного RGB может перекрыть точечную палитру. Readback свойств не доказывает измеренный итоговый raster/color/line в renderer, ручная визуальная проверка отдельна.
Картинка точки программно допускает только Пустая/ИзБиблиотеки. Новый Картинка(bytes/file) был бы Абсолютная и не подходит. Картинка.Вид readonly, не изменяйте его для скрытого обхода ограничения.
УказываетсяРасположение активирует0..1 geometry. Верх0 означает верх, Низ1 нижний край. Размеры поля формы отдельно; координаты не пиксели и не гарантируют отсутствие обрезки при слишком маленьком окне. Переносить доступен с8.3.23 и здесь требует точную8.5.1.1343 без compatibility8.3.22.
Линия и Рамка разные native типы; их ТипЛинии/ТипРамки/Толщина readonly. Настройка делается конструкторами и присваиванием целого объекта свойству, не изменением readonly вложенных полей.
6 task-hours = сумма трёх задач,5 часов = объединение временных промежутков по всем задачам. По СтолА отдельно объединение3ч, СтолБ2ч. В других данных объединение разных ресурсов и сумма отдельных занятостей могут отличаться; это не расчёт зарплаты/рабочего календаря.
Native массив содержит value detail на позиции0, interval details дальше. Unknown/foreign/смешанные/doubled IDs честно отказаны. Нельзя передавать arbitrary object в ОткрытьЗначение, открывать navigation string или вручную вызывать handler, чтобы выдать имитацию за UI проверку.
Guard имен/path/user и отсутствие metadata не дают криптографического доказательства происхождения CF. Владельцем заранее вручную создаётся и проверяется отдельный source/стенд. Никакого actual создания базы/календаря/БД/UI/сети/файлов автором, root/config read-only, backups0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.