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