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