При разработке в конфигурациях на «обычных формах» (таких как УПП 1.3, КА 1.1 или УТ 10.3) часто возникает задача динамического изменения интерфейса. Типичный сценарий: необходимо программно добавить новую таблицу или поле на существующую форму, сохранив при этом корректное отображение остальных элементов. В этой статье мы подробно разберем, как растянуть форму вниз, избежать наложения элементов друг на друга и правильно настроить привязки.
Многие разработчики сталкиваются с тем, что простое увеличение свойства ЭтаФорма.Высота не дает желаемого результата. Элементы начинают «наползать» друг на друга, или новое табличное поле оказывается за пределами видимости. Проанализируем основные причины такого поведения:
Панель, недостаточно увеличить высоту самой формы — нужно увеличить и высоту панели.Прежде чем писать код, необходимо убедиться, что форма готова к программным манипуляциям. Рассмотрим важные настройки, которые стоит проверить интерактивно (в конфигураторе):
Изменять).Рассмотрим правильный алгоритм действий в процедуре ПриОткрытии. Важно понимать, что форма — это «матрешка». Если элемент находится внутри панели, мы должны увеличивать высоту всей цепочки владельцев. Разберем пример кода:
// 1. Увеличиваем общую высоту формы
ЭтаФорма.Высота = ЭтаФорма.Высота + 150;
// 2. Если работаем с панелью (вкладками), увеличиваем и её высоту
ЭлементыФормы.ОсновнаяПанель.Высота = ЭлементыФормы.ОсновнаяПанель.Высота + 150;
// 3. Сдвигаем элементы, которые должны остаться в самом низу (например, комментарий или кнопки)
ЭлементыФормы.НадписьКомментарий.Верх = ЭлементыФормы.НадписьКомментарий.Верх + 150;
ЭлементыФормы.Комментарий.Верх = ЭлементыФормы.Комментарий.Верх + 150;
ЭлементыФормы.ОсновныеДействияФормы.Верх = ЭлементыФормы.ОсновныеДействияФормы.Верх + 150;
Важный нюанс: при изменении свойства Верх у нижних элементов, они могут «потащить» за собой связанные с ними объекты из-за настроенных привязок. Поэтому иногда перед перемещением стоит временно сбросить привязки.
Метод УстановитьПривязку() — это ключевой инструмент для того, чтобы форма выглядела корректно при изменении её размеров пользователем. Рассмотрим, как привязать новое табличное поле так, чтобы оно находилось под существующей таблицей и растягивалось вместе с формой.
Проанализируем ситуацию, когда мы добавляем таблицу под названием ДоговораПФ под существующую таблицу Договоры:
// Сначала добавляем само поле
НоваяТаблица = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ДоговораПФ", Истина, ЭлементыФормы.ОсновнаяПанель);
НоваяТаблица.Верх = ЭлементыФормы.Договоры.Верх + ЭлементыФормы.Договоры.Высота + 10;
НоваяТаблица.Высота = 100;
НоваяТаблица.Ширина = ЭлементыФормы.Договоры.Ширина;
НоваяТаблица.Лево = ЭлементыФормы.Договоры.Лево;
// Устанавливаем привязки:
// Верх новой таблицы привязываем к низу старой таблицы
НоваяТаблица.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Договоры, ГраницаЭлементаУправления.Низ);
// Низ новой таблицы привязываем к низу панели (контейнера)
НоваяТаблица.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ОсновнаяПанель, ГраницаЭлементаУправления.Низ);
Если на форме много табличных частей, пользователю может понадобиться возможность самостоятельно менять их высоту. Для этого используются объекты типа Разделитель. Рассмотрим, как программно добавить разделитель между двумя таблицами:
Разделитель = ЭлементыФормы.Добавить(Тип("Разделитель"), "РазделительНовый", Истина, ЭлементыФормы.ОсновнаяПанель);
Разделитель.Верх = ЭлементыФормы.Договоры.Верх + ЭлементыФормы.Договоры.Высота + 2;
Разделитель.Высота = 6;
Разделитель.Ширина = ЭлементыФормы.Договоры.Ширина;
// Чтобы разделитель не «схлопывался», установим режим свертки
Разделитель.Свертка = РежимСверткиЭлементаУправления.Нет;
// Привязываем верхнюю таблицу к разделителю (её низ будет двигаться за разделителем)
ЭлементыФормы.Договоры.УстановитьПривязку(ГраницаЭлементаУправления.Низ, Разделитель, ГраницаЭлементаУправления.Верх);
// Привязываем нижнюю таблицу к разделителю (её верх будет двигаться за разделителем)
ЭлементыФормы.ДоговораПФ.УстановитьПривязку(ГраницаЭлементаУправления.Верх, Разделитель, ГраницаЭлементаУправления.Низ);
Рассмотрим несколько продвинутых советов, которые помогут сделать интерфейс стабильным:
Верх, Лево, Высота, Ширина) и только после этого вызывайте УстановитьПривязку. В противном случае платформа может пересчитать координаты по старым правилам привязки в момент их изменения.ПриОткрытии рекомендуется вызвать ЭтаФорма.Обновить(). Это заставит платформу перерисовать интерфейс с учетом новых размеров.Элемент.Верх + Элемент.Высота + Отступ), а не константы, чтобы форма выглядела одинаково на мониторах с разным масштабированием.ЭлементыФормы.Панель.Свертка = РежимСверткиЭлементаУправления.Нет;. Это гарантирует, что контейнер не «сожмется» до нулевой высоты при программных изменениях.Выясним причину, почему элементы могут накладываться даже при правильном коде. Часто это происходит из-за того, что у формы включено свойство «Автоматическое разрешение прокрутки». В этом случае форма может не увеличивать свой физический размер, а просто добавлять полосу прокрутки. Если вам нужно именно физическое растяжение окна, это свойство лучше контролировать вручную.
Используя предложенные методы управления объектами ЭлементыФормы, вы сможете создавать динамические и удобные интерфейсы даже в классических прикладных решениях на базе 1С:УПП или подобных конфигураций.