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