Как сдвинуть элементы формы вверх при скрытии настроек в 1С?

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

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

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

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

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

Встроенный механизм привязок (ПривязкаГраницЭлементовФормы) отслеживает только изменение физических границ родительских контейнеров или всей формы, но не реагирует на изменение видимости дочерних реквизитов. Поэтому для правильного отображения формы нам необходимо скорректировать координаты элементов вручную либо использовать вспомогательные элементы-контейнеры.

Рассмотрим основные способы решения этой задачи по шагам.

Способ 1. Программный пересчет координат элементов (свойство Верх)

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

  1. Определяем высоту скрываемого блока (например, реквизита или группы полей) с учетом вертикального отступа.
  2. При скрытии вычитаем эту величину из координаты Верх нижележащих элементов, а при показе — прибавляем обратно.
  3. Если в нижней части формы расположена табличная часть или список, увеличиваем его высоту на величину сдвига, чтобы не оставалось пустого пространства внизу.

Посмотрим на пример обработчика кнопки «Скрыть/показать настройки»:


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

Способ 2. Группировка элементов на панели с динамическим изменением высоты

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

  1. Размещаем все скрываемые настройки внутри элемента управления Панель (свойство ОтображениеЗакладок переводим в значение НеОтображать).
  2. Для всех нижележащих элементов настраиваем привязку: верхняя граница связывается с нижней границей созданной панели.
  3. При скрытии настроек в коде уменьшаем высоту панели до 0 (или минимального значения) и скрываем её. За счет настроенных привязок нижележащие элементы автоматически подтянутся вверх вслед за нижней границей панели.

Пример реализации с использованием панели:


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

Способ 3. Использование переключения страниц многостраничной панели

Еще один надежный визуальный способ без сложных расчетов координат — создание двух альтернативных страниц на панели:

  1. Добавляем на форму элемент Панель без отображения закладок и создаем в нем две страницы: СтраницаСНастройками и СтраницаБезНастроек.
  2. На первой странице располагаем поля настроек вверху и таблицу под ними.
  3. На второй странице размещаем таблицу, растянутую на всю высоту формы.
  4. В обработчике кнопки выполняем простое переключение активной страницы:

Если ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.СтраницаСНастройками Тогда
    ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.СтраницаБезНастроек;
Иначе
    ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.СтраницаСНастройками;
КонецЕсли;

Как эта же задача решается в управляемых формах

Проанализируем разницу в поведении, если форма разрабатывается в режиме управляемого приложения (тонкий/веб-клиент):

  1. Автоматическая компоновка: в управляемом интерфейсе платформа использует адаптивную верстку. Достаточно выполнить команду Элементы.ГруппаНастроек.Видимость = Ложь;, и все элементы формы ниже автоматически займут освободившееся пространство без дополнительного кода.
  2. Штатное сворачивание групп: для элемента ОбычнаяГруппа можно установить свойство Поведение = Свертываемая. В этом случае рядом с заголовком группы платформа сама добавит кнопку для скрытия и раскрытия содержимого с плавной перерисовкой интерфейса.
← На главную