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

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

При разработке интерфейсов в обычных формах платформы 1С:Предприятие 8 разработчики часто сталкиваются с задачей динамического скрытия панелей, табличных частей или вспомогательных блоков. Классическая установка свойства Видимость = Ложь у скрываемого элемента приводит к неожиданному поведению: элемент действительно исчезает с экрана, однако освободившееся пространство остается пустым, а соседняя таблица не растягивается на всю высоту формы.

Проанализируем причины такого поведения механизма привязок и подробно разберем правильные способы решения этой задачи, включая использование механизма свертки, программное управление привязками и работу с разделителями.

Почему простое отключение видимости не растягивает соседние элементы

В обычных формах 1С геометрия элементов жестко завязана на систему координат и взаимные привязки границ. Когда мы устанавливаем Видимость = Ложь, элемент просто перестает отрисовываться на экране, но его физические координаты и размеры в пространстве формы сохраняются. Поскольку верхняя таблица привязана своей нижней границей к верхней границе скрытого элемента, ее положение не меняется, и на форме остается пустое неиспользуемое поле.

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

Способ 1. Использование системного свойства Свертка (рекомендуемый вариант)

Наиболее надежный и штатный способ скрыть элемент с автоматическим перераспределением пространства в обычных формах — это свойство элемента управления Свертка. Именно этот механизм используется в типовых конфигурациях (например, в форме списка номенклатуры конфигурации 1С:Управление торговлей 10.3 при скрытии панели остатков).

При установке свойства Свертка элемент управления не просто скрывается, его размер по указанному направлению программно схлопывается в ноль. Все элементы, привязанные к противоположной границе этого блока, автоматически растягиваются и занимают освободившееся место.

Разберем по шагам правильную настройку привязок и программный код:

  1. В конфигураторе настраиваем взаимные привязки:
    • Верхний элемент (например, ТабличноеПолеВерх): верх привязан к верху формы, низ привязан к верху нижнего элемента.
    • Нижний элемент (например, Панель1): верх привязан к верху панели (или сохраняет относительное положение), а низ жестко привязан к низу формы.
  2. Если скрываемый блок состоит из нескольких контролов (кнопок, полей, надписей), объединяем их внутри одного родительского элемента Панель без рамок. Это позволит управлять сверткой одной панели, а не каждого контрола по отдельности.
  3. Управляем свойством Свертка с помощью системного перечисления РежимСверткиЭлементаУправления.

Посмотрим на пример программного кода для переключения видимости панели:


// Процедура управляет отображением нижней панели и растяжением верхней таблицы
Если ПоказатьПанель Тогда
    // Разворачиваем панель в исходное состояние
    ЭлементыФормы.Панель1.Свертка = РежимСверткиЭлементаУправления.Нет;
Иначе
    // Сворачиваем панель к нижней границе формы
    // Верхняя таблица автоматически растягивается до низа формы
    ЭлементыФормы.Панель1.Свертка = РежимСверткиЭлементаУправления.Низ;
КонецЕсли;

Перечисление РежимСверткиЭлементаУправления поддерживает значения: Верх, Низ, Лево, Право и Нет. Выбор направления зависит от того, к какой границе формы привязана скрываемая панель.

Способ 2. Программное переопределение привязок через УстановитьПривязку()

Если структура формы не позволяет использовать стандартную свертку, перенастроить поведение элементов можно программно с помощью метода УстановитьПривязку(). Метод принимает три параметра: границу текущего элемента, связанный элемент управления и границу связанного элемента.

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

Рассмотрим пример переключения привязок верхней таблицы:


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

При использовании этого метода необходимо следить за тем, чтобы при повторном включении видимости восстанавливались не только привязки, но и исходные геометрические координаты (Высота и Верх), если они были деформированы изменением размеров окна.

Способ 3. Управление формой при наличии элемента Разделитель

Если между таблицей и нижней панелью установлен элемент управления Разделитель (позволяющий пользователю вручную менять пропорции блоков мышью), скрытие только одной панели не даст нужного результата, так как разделитель останется на экране и удержит границу таблицы.

Для корректной работы с разделителем выполним следующие действия:

  1. При скрытии нижней панели скрываем сам разделитель: ЭлементыФормы.Разделитель1.Видимость = Ложь.
  2. Нижнюю границу верхней таблицы программно перепривязываем к низу формы.
  3. При возврате видимости сначала восстанавливаем видимость разделителя и панели, после чего привязываем низ верхней таблицы обратно к верхней границе разделителя.

Способ 4. Использование многостраничной панели

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

  1. Размещаем на форме элемент Панель на всю рабочую область.
  2. Устанавливаем свойство ОтображениеЗакладок = РежимОтображенияЗакладок.НеОтображать.
  3. На первой странице размещаем полноэкранную таблицу с привязками ко всем четырем сторонам.
  4. На второй странице размещаем таблицу, разделитель и нижнюю панель.
  5. Переключение режимов отображения сводится к одной строке кода: ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = ЭлементыФормы.ОсновнаяПанель.Страницы.СтраницаБезПанели;.

Этот подход полностью исключает проблемы с искажением привязок и гарантирует стабильное поведение интерфейса при любых действиях пользователя.

← На главную