При динамической доработке типовых конфигураций на обычных формах (толстый клиент) разработчики часто сталкиваются с задачей программного расширения формы без снятия объекта с поддержки. Типовой сценарий предполагает увеличение высоты окна и смещение нижней панели команд вниз, чтобы освободить пространство для новых реквизитов или элементов управления.
Однако при попытке прямого изменения свойства Верх у командной панели (например, ЭлементыФормы.ОсновныеДействияФормы.Верх = ...) новое значение координаты не применяется или игнорируется платформой при повторном открытии формы. Разберем по шагам, почему это происходит и как правильно реализовать программное позиционирование элементов.
Проанализируем внутренние механизмы платформы 1С:Предприятие при работе с обычной графической подсистемой:
Верх и Лево текущими рассчитанными границами окна. Когда мы программно меняем ЭтаФорма.Высота, свойство формы обновляется, однако внутренний пересчет сетки клиентской области операционной системой выполняется асинхронно. Любая попытка немедленно задать координату Верх за пределами исходного размера формы блокируется как выход за допустимые границы.ОсновныеДействияФормы) всегда имеет жесткую привязку к нижней границе формы (ГраницаЭлементаУправления.Низ). Прямое присвоение абсолютных значений свойств Верх или Низ вступает в конфликт с автоматическим позиционированием и перетирается системой при отрисовке.Рассмотрим самый правильный и надежный способ. Если командная панель уже привязана к нижней границе окна формы, нам нет необходимости вручную вычислять и смещать ее координату Верх. Достаточно программно увеличить только высоту самой формы, а платформа автоматически сместит нижнюю панель на нужное расстояние.
Посмотрим на пример кода в обработчике события формы:
Процедура ПриОткрытии()
// Проверяем текущую высоту и увеличиваем форму при необходимости
Если ЭтаФорма.Высота < МинимальнаяВысотаФормы Тогда
РазницаВВысоте = МинимальнаяВысотаФормы - ЭтаФорма.Высота;
ЭтаФорма.Высота = ЭтаФорма.Высота + РазницаВВысоте;
КонецЕсли;
КонецПроцедуры
Важный момент: Код модификации геометрии формы и ее элементов в обычном приложении должен располагаться строго в процедуре-обработчике ПриОткрытии(). Вызов в событии ПередОткрытием() выполняется до полной инициализации окна, из-за чего изменения высоты могут быть сброшены.
Если панель или другой элемент не смещаются автоматически, либо их привязки были нарушены, разберем программное снятие и повторную установку связей границ.
Выполним процедуру по следующим шагам:
УстановитьПривязку().Рассмотрим реализацию данного алгоритма:
Процедура СместитьНижнююПанель()
Панель = ЭлементыФормы.ОсновныеДействияФормы;
// 1. Снимаем текущие привязки
Панель.СнятьПривязку(ГраницаЭлементаУправления.Верх);
Панель.СнятьПривязку(ГраницаЭлементаУправления.Низ);
// 2. Изменяем размеры формы
РазницаВВысоте = 50;
ЭтаФорма.Высота = ЭтаФорма.Высота + РазницаВВысоте;
// 3. Устанавливаем привязку к нижней границе формы
Панель.УстановитьПривязку(
ГраницаЭлементаУправления.Низ,
ЭтаФорма,
ГраницаФормы.Низ
);
Панель.УстановитьПривязку(
ГраницаЭлементаУправления.Верх,
ЭтаФорма,
ГраницаФормы.Низ
);
КонецПроцедуры
Если сохраненные пользовательские настройки окна блокируют применение новых размеров, проанализируем управление ключом сохранения настроек. Чтобы платформа не восстанавливала старые координаты из системного кэша пользователя, зададим уникальный или пустой ключ сохранения положения окна:
Процедура ПриОткрытии()
// Отключаем наложение старых сохраненных размеров окна
ЭтаФорма.КлючСохраненияПоложенияОкна = "";
// Задаем требуемую геометрию
ЭтаФорма.Высота = 600;
КонецПроцедуры
Если изменение размеров окна и сдвиг системных кнопок приводит к нестабильному отображению на разных разрешениях мониторов, рассмотрим альтернативные пути размещения дополнительных реквизитов:
Панель с помощью метода ЭлементыФормы.ОсновнаяПанель.Страницы.Добавить() и разместить новые поля там.Высота на требуемую величину, освободив место без изменения общих границ окна.