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