Почему не изменяется свойство Верх у командной панели при программном увеличении высоты обычной формы в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При динамической доработке типовых конфигураций на обычных формах (толстый клиент) разработчики часто сталкиваются с задачей программного расширения формы без снятия объекта с поддержки. Типовой сценарий предполагает увеличение высоты окна и смещение нижней панели команд вниз, чтобы освободить пространство для новых реквизитов или элементов управления.

Однако при попытке прямого изменения свойства Верх у командной панели (например, ЭлементыФормы.ОсновныеДействияФормы.Верх = ...) новое значение координаты не применяется или игнорируется платформой при повторном открытии формы. Разберем по шагам, почему это происходит и как правильно реализовать программное позиционирование элементов.

Причины некорректного поведения координат в обычных формах

Проанализируем внутренние механизмы платформы 1С:Предприятие при работе с обычной графической подсистемой:

  1. Модель отложенной отрисовки и расчет рабочей области: Платформа жестко ограничивает значения координат Верх и Лево текущими рассчитанными границами окна. Когда мы программно меняем ЭтаФорма.Высота, свойство формы обновляется, однако внутренний пересчет сетки клиентской области операционной системой выполняется асинхронно. Любая попытка немедленно задать координату Верх за пределами исходного размера формы блокируется как выход за допустимые границы.
  2. Конфликт механизма привязок (Anchor Engine): В типовых формах нижняя командная панель (ОсновныеДействияФормы) всегда имеет жесткую привязку к нижней границе формы (ГраницаЭлементаУправления.Низ). Прямое присвоение абсолютных значений свойств Верх или Низ вступает в конфликт с автоматическим позиционированием и перетирается системой при отрисовке.
  3. Кэширование пользовательских настроек положения окна: Платформа автоматически запоминает размеры и положение окон для каждого пользователя. Сохраненная геометрия окна при повторном открытии может накладываться поверх программных модификаций, сбрасывая заданные координаты.

Способ 1. Использование встроенного механизма привязок (рекомендуемый)

Рассмотрим самый правильный и надежный способ. Если командная панель уже привязана к нижней границе окна формы, нам нет необходимости вручную вычислять и смещать ее координату Верх. Достаточно программно увеличить только высоту самой формы, а платформа автоматически сместит нижнюю панель на нужное расстояние.

Посмотрим на пример кода в обработчике события формы:


Процедура ПриОткрытии()
    // Проверяем текущую высоту и увеличиваем форму при необходимости
    Если ЭтаФорма.Высота < МинимальнаяВысотаФормы Тогда
        РазницаВВысоте = МинимальнаяВысотаФормы - ЭтаФорма.Высота;
        ЭтаФорма.Высота = ЭтаФорма.Высота + РазницаВВысоте;
    КонецЕсли;
КонецПроцедуры

Важный момент: Код модификации геометрии формы и ее элементов в обычном приложении должен располагаться строго в процедуре-обработчике ПриОткрытии(). Вызов в событии ПередОткрытием() выполняется до полной инициализации окна, из-за чего изменения высоты могут быть сброшены.

Способ 2. Программное переопределение привязок элемента управления

Если панель или другой элемент не смещаются автоматически, либо их привязки были нарушены, разберем программное снятие и повторную установку связей границ.

Выполним процедуру по следующим шагам:

  1. Снимаем существующие привязки у перемещаемого элемента для исключения конфликтов.
  2. Увеличиваем высоту формы и задаем новые координаты элемента.
  3. Фиксируем элемент относительно новой границы формы через метод УстановитьПривязку().

Рассмотрим реализацию данного алгоритма:


Процедура СместитьНижнююПанель()
    Панель = ЭлементыФормы.ОсновныеДействияФормы;
    
    // 1. Снимаем текущие привязки
    Панель.СнятьПривязку(ГраницаЭлементаУправления.Верх);
    Панель.СнятьПривязку(ГраницаЭлементаУправления.Низ);
    
    // 2. Изменяем размеры формы
    РазницаВВысоте = 50;
    ЭтаФорма.Высота = ЭтаФорма.Высота + РазницаВВысоте;
    
    // 3. Устанавливаем привязку к нижней границе формы
    Панель.УстановитьПривязку(
        ГраницаЭлементаУправления.Низ, 
        ЭтаФорма, 
        ГраницаФормы.Низ
    );
    Панель.УстановитьПривязку(
        ГраницаЭлементаУправления.Верх, 
        ЭтаФорма, 
        ГраницаФормы.Низ
    );
КонецПроцедуры

Способ 3. Сброс кэша положения окна формы

Если сохраненные пользовательские настройки окна блокируют применение новых размеров, проанализируем управление ключом сохранения настроек. Чтобы платформа не восстанавливала старые координаты из системного кэша пользователя, зададим уникальный или пустой ключ сохранения положения окна:


Процедура ПриОткрытии()
    // Отключаем наложение старых сохраненных размеров окна
    ЭтаФорма.КлючСохраненияПоложенияОкна = "";
    
    // Задаем требуемую геометрию
    ЭтаФорма.Высота = 600;
КонецПроцедуры

Альтернативные варианты доработки форм на поддержке

Если изменение размеров окна и сдвиг системных кнопок приводит к нестабильному отображению на разных разрешениях мониторов, рассмотрим альтернативные пути размещения дополнительных реквизитов:

  1. Добавление программной вкладки на существующую панель: Вместо увеличения внешних габаритов окна можно добавить новую страницу в имеющийся элемент Панель с помощью метода ЭлементыФормы.ОсновнаяПанель.Страницы.Добавить() и разместить новые поля там.
  2. Уменьшение растягивающихся элементов: Если на форме присутствует табличная часть или многострочное поле комментария, можно уменьшить их свойство Высота на требуемую величину, освободив место без изменения общих границ окна.
← На главную