Как программно увеличить высоту обычной формы и добавить новые элементы в 1С

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

При разработке в конфигурациях на «обычных формах» (таких как УПП 1.3, КА 1.1 или УТ 10.3) часто возникает задача динамического изменения интерфейса. Типичный сценарий: необходимо программно добавить новую таблицу или поле на существующую форму, сохранив при этом корректное отображение остальных элементов. В этой статье мы подробно разберем, как растянуть форму вниз, избежать наложения элементов друг на друга и правильно настроить привязки.

Анализ проблемы: почему форма не растягивается?

Многие разработчики сталкиваются с тем, что простое увеличение свойства ЭтаФорма.Высота не дает желаемого результата. Элементы начинают «наползать» друг на друга, или новое табличное поле оказывается за пределами видимости. Проанализируем основные причины такого поведения:

  1. Свойство «Использовать только видимую область»: Если эта галочка установлена в свойствах формы в конфигураторе, платформа жестко ограничивает отрисовку элементов.
  2. Иерархия контейнеров: Если вы добавляете элемент на Панель, недостаточно увеличить высоту самой формы — нужно увеличить и высоту панели.
  3. Автоматические привязки: 1С пытается сохранить пропорции и положение элементов согласно правилам, заданным в конфигураторе, что при программном изменении координат может привести к непредсказуемым сдвигам.

Шаг 1. Подготовка формы и отключение ограничений

Прежде чем писать код, необходимо убедиться, что форма готова к программным манипуляциям. Рассмотрим важные настройки, которые стоит проверить интерактивно (в конфигураторе):

Шаг 2. Программное изменение высоты формы и панелей

Рассмотрим правильный алгоритм действий в процедуре ПриОткрытии. Важно понимать, что форма — это «матрешка». Если элемент находится внутри панели, мы должны увеличивать высоту всей цепочки владельцев. Разберем пример кода:


// 1. Увеличиваем общую высоту формы
ЭтаФорма.Высота = ЭтаФорма.Высота + 150;

// 2. Если работаем с панелью (вкладками), увеличиваем и её высоту
ЭлементыФормы.ОсновнаяПанель.Высота = ЭлементыФормы.ОсновнаяПанель.Высота + 150;

// 3. Сдвигаем элементы, которые должны остаться в самом низу (например, комментарий или кнопки)
ЭлементыФормы.НадписьКомментарий.Верх = ЭлементыФормы.НадписьКомментарий.Верх + 150;
ЭлементыФормы.Комментарий.Верх = ЭлементыФормы.Комментарий.Верх + 150;
ЭлементыФормы.ОсновныеДействияФормы.Верх = ЭлементыФормы.ОсновныеДействияФормы.Верх + 150;

Важный нюанс: при изменении свойства Верх у нижних элементов, они могут «потащить» за собой связанные с ними объекты из-за настроенных привязок. Поэтому иногда перед перемещением стоит временно сбросить привязки.

Шаг 3. Управление привязками (Anchors)

Метод УстановитьПривязку() — это ключевой инструмент для того, чтобы форма выглядела корректно при изменении её размеров пользователем. Рассмотрим, как привязать новое табличное поле так, чтобы оно находилось под существующей таблицей и растягивалось вместе с формой.

Проанализируем ситуацию, когда мы добавляем таблицу под названием ДоговораПФ под существующую таблицу Договоры:


// Сначала добавляем само поле
НоваяТаблица = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ДоговораПФ", Истина, ЭлементыФормы.ОсновнаяПанель);
НоваяТаблица.Верх = ЭлементыФормы.Договоры.Верх + ЭлементыФормы.Договоры.Высота + 10;
НоваяТаблица.Высота = 100;
НоваяТаблица.Ширина = ЭлементыФормы.Договоры.Ширина;
НоваяТаблица.Лево = ЭлементыФормы.Договоры.Лево;

// Устанавливаем привязки:
// Верх новой таблицы привязываем к низу старой таблицы
НоваяТаблица.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Договоры, ГраницаЭлементаУправления.Низ);

// Низ новой таблицы привязываем к низу панели (контейнера)
НоваяТаблица.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ОсновнаяПанель, ГраницаЭлементаУправления.Низ);

Шаг 4. Использование разделителей (Splitters)

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


Разделитель = ЭлементыФормы.Добавить(Тип("Разделитель"), "РазделительНовый", Истина, ЭлементыФормы.ОсновнаяПанель);
Разделитель.Верх = ЭлементыФормы.Договоры.Верх + ЭлементыФормы.Договоры.Высота + 2;
Разделитель.Высота = 6;
Разделитель.Ширина = ЭлементыФормы.Договоры.Ширина;

// Чтобы разделитель не «схлопывался», установим режим свертки
Разделитель.Свертка = РежимСверткиЭлементаУправления.Нет;

// Привязываем верхнюю таблицу к разделителю (её низ будет двигаться за разделителем)
ЭлементыФормы.Договоры.УстановитьПривязку(ГраницаЭлементаУправления.Низ, Разделитель, ГраницаЭлементаУправления.Верх);

// Привязываем нижнюю таблицу к разделителю (её верх будет двигаться за разделителем)
ЭлементыФормы.ДоговораПФ.УстановитьПривязку(ГраницаЭлементаУправления.Верх, Разделитель, ГраницаЭлементаУправления.Низ);

Тонкости и рекомендации

Рассмотрим несколько продвинутых советов, которые помогут сделать интерфейс стабильным:

  1. Порядок действий: Всегда сначала устанавливайте координаты (Верх, Лево, Высота, Ширина) и только после этого вызывайте УстановитьПривязку. В противном случае платформа может пересчитать координаты по старым правилам привязки в момент их изменения.
  2. Обновление формы: В конце всех манипуляций в процедуре ПриОткрытии рекомендуется вызвать ЭтаФорма.Обновить(). Это заставит платформу перерисовать интерфейс с учетом новых размеров.
  3. Работа с DPI: Помните, что координаты в 1С измеряются в логических единицах. При расчетах старайтесь использовать относительные значения (например, Элемент.Верх + Элемент.Высота + Отступ), а не константы, чтобы форма выглядела одинаково на мониторах с разным масштабированием.
  4. Режим свертки: Если вы используете панели, иногда полезно принудительно отключить свертку: ЭлементыФормы.Панель.Свертка = РежимСверткиЭлементаУправления.Нет;. Это гарантирует, что контейнер не «сожмется» до нулевой высоты при программных изменениях.

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

Используя предложенные методы управления объектами ЭлементыФормы, вы сможете создавать динамические и удобные интерфейсы даже в классических прикладных решениях на базе 1С:УПП или подобных конфигураций.

← На главную