ОбластьПостроенияДиаграммыГанта.Верх

Свойства · Top

Тип: Число. Относительное положение верхней границы. Может содержать значения от 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 общий модуль самостоятельный.

Подготовка

  1. Создайте НОВУЮ пустую файловую CF УчебныйГантОформление85 только платформой8.5.1.1343, режим совместимости НеИспользовать, основное приложение УправляемоеПриложение. Собственная база ровно C:\1C85_OwnGanttLab\f365fa56-fb7f-4b45-ae60-7b83543bb868\Base; запуск File="этот полный путь"; без server/other connection частей. Не берите production CF, документы, расширения или чужие настройки; metadata-имя само по себе не доказывает владение.

  2. В этой CF нет каталогов/документов/регистров/планов/отчётов/общих форм/расширений/подписок/заданий. Ровно одна роль УчебныйГантРоль85, один собственный пользователь Гант85Ученик, право управляемого запуска/собственной обработки и вызова указанного серверного guard. Создайте ровно один общий модуль УчебныйГант85: Глобальный=Нет, Сервер=Да, ВызовСервера=Да, Клиент=Нет, Привилегированный=Нет; supporting server code целиком в этот модуль.

  3. Добавьте ровно одну обработку МойПланГанта85 без object реквизитов, табличных частей и макетов. Одна управляемая ОсновнаяФорма назначена основной. Реквизиты формы План85 ДиаграммаГанта; Лево85/Верх85/Право85/Низ85 Число(4,2), ДопустимыйЗнак=Любой; ЧасыЗадач85/ЧасыЗанято85 Число(6,2); Подробности85/Состояние85 Строка неограниченная. Не создавайте одноимённые object реквизиты.

  4. На форме поле ПолеПлана85, Вид=ПолеДиаграммыГанта, ПутьКДанным=План85, растягивание по обеим сторонам разрешено, размер достаточно большой для двух подписей. Поля четырёх координат связаны с соответствующими numeric реквизитами и доступны вводу; два итоговых поля и поля подробностей/состояния только просмотр, подробности многострочные. ВосстанавливатьЗначенияПриОткрытии=Нет. Никакого HTML/табличного viewer/печати нет.

  5. Команды формы ПрименитьГраницы85 и КомпактноеПоле85, одноимённые обработчики(Команда), две связанные кнопки. Native события формы ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) и ПриОткрытии(Отказ) свяжите с этими процедурами. Main code целиком в модуль управляемой формы. Обработчик field расшифровки устанавливается реально на сервере через УстановитьДействие; не вызывайте callback вручную.

  6. Используйте тонкий клиент Windows или толстый управляемый клиент этой собственной CF. Все primitive literal задачи датированы 10.10.2026: СтолА 09:00–11:00 и 10:00–12:00; СтолБ 13:00–15:00. Это три учебных задачи, не производственные задания/календарь сотрудников. Код сохраняет неизменяемый снимок ФиксированныйМассив из ФиксированнаяСтруктура с точно typed строками/датами.

  7. На own Windows клиенте должен быть Arial. БиблиотекаКартинок.ОформлениеФлагЗеленый — настоящий installed библиотечный элемент; не создавайте/загружайте картинку из файла и не подсовывайте абсолютный raster. Native ТочкаДиаграммыГанта.Картинка программно допускает Пустая/ИзБиблиотеки. Проверка Вид и exact library value читает настоящий результат присваивания.

  8. Сверьте все модули собственной 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 Тогда
        ВызватьИсключение "Собственная обработка должна иметь только свою одну управляемую форму";
    КонецЕсли;
КонецПроцедуры

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

  1. Серверное создание проверяет exact platform/version/пустой own metadata/User/File connection, проверяет настоящие вид и ПутьКДанным ПолеПлана85 и устанавливает native обработчик по имени. Серверный guard вызывается заново при каждом явном rebuild; производственные данные вообще не читаются.

  2. ПриОткрытии задаёт широкую геометрию Лево0.02/Верх0.10/Право0.98/Низ0.90 и вызывает внутренний builder, не command/event callback. Четыре числа сначала проходят type/range/strict-order guards. Ошибка геометрии не меняет прежнюю ДиаграммаГанта/итоги/snapshot.

  3. Builder создаёт новый native ДиаграммаГанта и одну серию. Точки — два учебных ресурса, интервалы — три задачи: у СтолА два интервала перекрываются10–11. Полное окно8–16 задаётся native методом; readonly Begin/End не присваиваются.

  4. Серия.ПриоритетЦвета=Ложь, каждая Точка.ПриоритетЦвета=Истина. Значение.Цвет/ДополнительныйЦвет и Интервал.Цвет получают настоящий АвтоЦвет через Новый Цвет(), поэтому не перехватывают точечную палитру. Native при равном приоритете выигрывает серия, здесь приоритеты намеренно разные. Обычный точечный цвет синий/зелёный, дополнительный оранжевый предназначен перекрытию СтолА.

  5. Точка.ЦветТекста/ЦветФона/Шрифт оформляют подпись собственного ресурса, Картинка показывает native library flag, Расшифровка хранит exact собственный resource key. Текст длинный специально: native РазмещениеТекста=Переносить имеет смысл для этой подписи, не заменяет сами данные/длительность.

  6. Область.Расположение=УказываетсяРасположение включает относительные границы0..1, не пиксели. Лево/Верх/Право/Низ ограничивают область; ЛинииШкалы создаются Линия(ТипЛинииДиаграммы.Точечная,1), Рамка — отдельный native Рамка(Одинарная,1). Часовая шкала9–15 даёт читаемую временную разметку. Все восемь plot свойств читаются обратно до принятия candidate.

  7. От actual native точек/значений получаем интервалы. Проверяем exact own ресурс/ID/текст/начала/концы, librarypicture, шрифт, цвета и отсутствие дублей. Сумма длительностей actual интервалов даёт2+2+2=6 task-hours. Actual интервалы сортируются в собственном Массив по Начало и сливаются как время: [09,12] + [13,15] =3+2=5 часов. Это не занятость каждого ресурса и не суммарная трудоёмкость.

  8. Только прошедший actual geometry/style/data readback candidate записывается в visible План85, два numeric итога и client snapshot. КомпактноеПоле85 меняет геометрию на0.15/0.20/0.90/0.85 и выполняет новый полный native rebuild; три задачи и итоги остаются теми же. Отказ оставляет прежний graph/итоги, а введённые поля сохраняет для исправления пользователем.

  9. Двойной щелчок по подписи СтолА/СтолБ вызывает настоящий field callback. Managed форма передаёт Элемент и три native параметра Расшифровка/СтандартнаяОбработка/Дата; native Date для выбора точки может быть Неопределено. В самой procedure первым действием СтандартнаяОбработка=Ложь, поэтому неизвестный объект не попадает в стандартную навигацию.

  10. Point/resource string даёт задачи данного own ресурса. Native массив значения содержит сначала resource расшифровку значения, затем ID выбранных/перекрывающихся интервалов; код принимает только actual own IDs одного ожидаемого ресурса, без дублей и arbitrary type coercion. Для СтолА в зоне10–11 подробности двух задач по2ч; native дата проверяется отдельно и не объявляется длительностью. Неизвестная расшифровка не меняет прежние подробности.

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

  1. После первого ручного запуска видны две строки ресурсов и три полосы. СтолА имеет интервалы09–11 и10–12, СтолБ13–15; actual numeric поля ЧасыЗадач85=6, ЧасыЗанято85=5. Наличие оранжевого перекрытия/контраста/переноса проверяется вручную в native renderer, не заявлено как исполненный автором runtime.

  2. Нажмите КомпактноеПоле85: границы полей становятся0.15/0.20/0.90/0.85, область визуально меняется; readback подтверждает новый layout, но exact own интервалы и6/5 сохраняются. Верните координаты вручную и примените: rebuild снова заменяет graph только после проверки.

  3. Введите Лево85=0.95, Право85=0.90 либо Верх85=-0.10: ПрименитьГраницы85 отказывает до нового graph, предыдущие План85/ЧасыЗадач85/ЧасыЗанято85/Snapshot не меняются. Поля ввода не откатываются тайно; исправьте их и повторите команду.

  4. Дважды щёлкните подпись СтолА: подробности показывают Разбор материала09–11 и Проверка образца10–12, по2ч каждая. Для СтолБ Сборка комплекта13–15,2ч. Нативный выбор перекрытия10–11 даёт actual массив value/interval details; нет ручного вызова callback для имитации события.

  5. Две точки используют exact библиотечный флаг, absolute картинки не загружаются. readback ПроверитьСвоиИнтервалы подтверждает ВидКартинки.ИзБиблиотеки и equality own installed value, priority seriesFalse/pointTrue, Auto цвета значения/интервала. Это проверка установленных свойств, не измерение RGB пикселей renderer.

  6. 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.

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

  1. Точка означает ресурс/строку, не обязательно отдельную задачу. У одной точки в одной серии возможно несколько интервалов; именно это даёт реальное перекрытие и роль ДополнительныйЦвет. Интервалы разных строк не образуют наложение в одной полосе.

  2. При равных ПриоритетЦвета native берёт серию. Auto цвета значения и интервала важны; прямое присваивание им собственного RGB может перекрыть точечную палитру. Readback свойств не доказывает измеренный итоговый raster/color/line в renderer, ручная визуальная проверка отдельна.

  3. Картинка точки программно допускает только Пустая/ИзБиблиотеки. Новый Картинка(bytes/file) был бы Абсолютная и не подходит. Картинка.Вид readonly, не изменяйте его для скрытого обхода ограничения.

  4. УказываетсяРасположение активирует0..1 geometry. Верх0 означает верх, Низ1 нижний край. Размеры поля формы отдельно; координаты не пиксели и не гарантируют отсутствие обрезки при слишком маленьком окне. Переносить доступен с8.3.23 и здесь требует точную8.5.1.1343 без compatibility8.3.22.

  5. Линия и Рамка разные native типы; их ТипЛинии/ТипРамки/Толщина readonly. Настройка делается конструкторами и присваиванием целого объекта свойству, не изменением readonly вложенных полей.

  6. 6 task-hours = сумма трёх задач,5 часов = объединение временных промежутков по всем задачам. По СтолА отдельно объединение3ч, СтолБ2ч. В других данных объединение разных ресурсов и сумма отдельных занятостей могут отличаться; это не расчёт зарплаты/рабочего календаря.

  7. Native массив содержит value detail на позиции0, interval details дальше. Unknown/foreign/смешанные/doubled IDs честно отказаны. Нельзя передавать arbitrary object в ОткрытьЗначение, открывать navigation string или вручную вызывать handler, чтобы выдать имитацию за UI проверку.

  8. Guard имен/path/user и отсутствие metadata не дают криптографического доказательства происхождения CF. Владельцем заранее вручную создаётся и проверяется отдельный source/стенд. Никакого actual создания базы/календаря/БД/UI/сети/файлов автором, root/config read-only, backups0.

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

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

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

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

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