При разработке пользовательских интерфейсов на базе элемента формы Поле табличного документа программисты иногда сталкиваются со специфическим поведением платформы. Даже если отключить видимость полос прокрутки (установив свойство ОтображатьПолосыПрокрутки = Ложь), пользователь всё равно может сдвинуть макет. Это происходит, если зажать левую клавишу мыши и потянуть курсор в сторону — платформа автоматически начинает выделять ячейки и прокручивать холст.
В этой статье мы разберем, почему возникает эта проблема, и рассмотрим проверенные способы блокировки сдвига макета в управляемом приложении 1С:Предприятие 8.3.
Выясним причину такого поведения. Элемент ТабличныйДокумент спроектирован в первую очередь для работы с табличными данными и печатными формами. По умолчанию в нем заложен функционал электронных таблиц: выделение диапазонов ячеек, навигация с помощью клавиш со стрелками и автоматическая прокрутка видимой области при выходе курсора за её границы.
Свойство ОтображатьПолосыПрокрутки лишь скрывает графические элементы скроллбаров, но не отключает сам алгоритм навигации и выделения. Если макет используется как интерактивный список или панель элементов, подобные сдвиги нарушают позиционирование и ухудшают интерфейс.
Самым лаконичным и эффективным решением является применение штатного механизма фиксации областей табличного документа. Если зафиксировать все выводимые колонки или строки, платформа прекращает сдвигать область макета при выходе выделения за пределы окна.
Проанализируем пример настройки фиксации в коде:
// Фиксируем все колонки слева (например, если всего выведено 10 колонок)
Элементы.ТабличныйДокументВывода.ФиксацияСлева = 10;
// При необходимости можно зафиксировать и строки сверху
Элементы.ТабличныйДокументВывода.ФиксацияСверху = 50;
Когда все отображаемые колонки зафиксированы через свойство ФиксацияСлева, ни перемещение мышью с зажатой клавишей, ни навигация стрелками на клавиатуре не смогут сдвинуть отображение макета. Это полностью решает задачу для документов, которые полностью помещаются во внутреннюю область элемента формы.
Важное замечание: этот метод идеально подходит, если вся ширина и высота выводимого документа гарантированно умещаются на экране пользователя.
Если фиксация по каким-либо причинам не подходить или требуется более гибкий контроль над выделяемыми ячейками, рассмотрим вариант программного сброса рамки выделения с помощью обработчика события ПриАктивизацииОбласти.
Разберем по шагам, как перехватывать и корректировать координаты выделяемой области:
ПриАктивизацииОбласти.Посмотрим на пример реализации данного алгоритма:
Процедура ТаблицаВыводаПриАктивизацииОбласти(Элемент)
Низ = Элемент.ТекущаяОбласть.Низ;
Право = Элемент.ТекущаяОбласть.Право;
// Проверяем, не вышли ли за границы высоты таблицы
Если Низ > Элемент.ВысотаТаблицы Тогда
Низ = Элемент.ВысотаТаблицы;
КонецЕсли;
// Проверяем, не вышли ли за границы ширины таблицы
Если Право > Элемент.ШиринаТаблицы Тогда
Право = Элемент.ШиринаТаблицы;
КонецЕсли;
// Отключаем обработчик на время изменения текущей области во избежание закольцовывания
Элемент.УстановитьДействие("ПриАктивизацииОбласти", Неопределено);
// Корректируем текущую область
Элемент.ТекущаяОбласть = Элемент.Область(Мин(Элемент.ТекущаяОбласть.Верх, Низ), Мин(Элемент.ТекущаяОбласть.Лево, Право), Низ, Право);
// Возвращаем обработчик события
Элемент.УстановитьДействие("ПриАктивизацииОбласти", Новый Действие("ТаблицаВыводаПриАктивизацииОбласти"));
КонецПроцедуры
Если табличный документ используется для отображения иерархических списков со сложной логикой (например, с флажками и переключателями на определенных уровнях иерархии), имеет смысл рассмотреть стандартные элементы формы:
ТолькоПросмотр = Истина. Также можно использовать колонку с картинками состояний (включено/выключено) вместо стандартного флага.user-select: none; overflow: hidden;).Тем не менее, если задача уже реализована на табличном документе, использование свойства ФиксацияСлева является самым быстрым и простым способом полностью заблокировать нежелательный сдвиг макета.