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