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