Как отключить возможность прокрутки и перемещения в табличном документе 1С при зажатой левой кнопке мыши?

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

При разработке пользовательских интерфейсов на базе элемента формы Поле табличного документа программисты иногда сталкиваются со специфическим поведением платформы. Даже если отключить видимость полос прокрутки (установив свойство ОтображатьПолосыПрокрутки = Ложь), пользователь всё равно может сдвинуть макет. Это происходит, если зажать левую клавишу мыши и потянуть курсор в сторону — платформа автоматически начинает выделять ячейки и прокручивать холст.

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

Причина поведения платформы

Выясним причину такого поведения. Элемент ТабличныйДокумент спроектирован в первую очередь для работы с табличными данными и печатными формами. По умолчанию в нем заложен функционал электронных таблиц: выделение диапазонов ячеек, навигация с помощью клавиш со стрелками и автоматическая прокрутка видимой области при выходе курсора за её границы.

Свойство ОтображатьПолосыПрокрутки лишь скрывает графические элементы скроллбаров, но не отключает сам алгоритм навигации и выделения. Если макет используется как интерактивный список или панель элементов, подобные сдвиги нарушают позиционирование и ухудшают интерфейс.

Способ 1. Фиксация колонок и строк (наиболее простой и эффективный)

Самым лаконичным и эффективным решением является применение штатного механизма фиксации областей табличного документа. Если зафиксировать все выводимые колонки или строки, платформа прекращает сдвигать область макета при выходе выделения за пределы окна.

Проанализируем пример настройки фиксации в коде:


// Фиксируем все колонки слева (например, если всего выведено 10 колонок)
Элементы.ТабличныйДокументВывода.ФиксацияСлева = 10;

// При необходимости можно зафиксировать и строки сверху
Элементы.ТабличныйДокументВывода.ФиксацияСверху = 50;

Когда все отображаемые колонки зафиксированы через свойство ФиксацияСлева, ни перемещение мышью с зажатой клавишей, ни навигация стрелками на клавиатуре не смогут сдвинуть отображение макета. Это полностью решает задачу для документов, которые полностью помещаются во внутреннюю область элемента формы.

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

Способ 2. Программное ограничение выделения в событии ПриАктивизацииОбласти

Если фиксация по каким-либо причинам не подходить или требуется более гибкий контроль над выделяемыми ячейками, рассмотрим вариант программного сброса рамки выделения с помощью обработчика события ПриАктивизацииОбласти.

Разберем по шагам, как перехватывать и корректировать координаты выделяемой области:

  1. Подключаем для поля табличного документа событие ПриАктивизацииОбласти.
  2. В обработчике проверяем границы выделенной пользователем области.
  3. При попытке вывода рамки за пределы допустимых размеров макета принудительно возвращаем текущую область в границы таблицы.

Посмотрим на пример реализации данного алгоритма:


Процедура ТаблицаВыводаПриАктивизацииОбласти(Элемент)
    
    Низ = Элемент.ТекущаяОбласть.Низ;
    Право = Элемент.ТекущаяОбласть.Право;
    
    // Проверяем, не вышли ли за границы высоты таблицы
    Если Низ > Элемент.ВысотаТаблицы Тогда
        Низ = Элемент.ВысотаТаблицы;
    КонецЕсли;
    
    // Проверяем, не вышли ли за границы ширины таблицы
    Если Право > Элемент.ШиринаТаблицы Тогда
        Право = Элемент.ШиринаТаблицы;
    КонецЕсли;
    
    // Отключаем обработчик на время изменения текущей области во избежание закольцовывания
    Элемент.УстановитьДействие("ПриАктивизацииОбласти", Неопределено);
    
    // Корректируем текущую область
    Элемент.ТекущаяОбласть = Элемент.Область(Мин(Элемент.ТекущаяОбласть.Верх, Низ), Мин(Элемент.ТекущаяОбласть.Лево, Право), Низ, Право);
    
    // Возвращаем обработчик события
    Элемент.УстановитьДействие("ПриАктивизацииОбласти", Новый Действие("ТаблицаВыводаПриАктивизацииОбласти"));
    
КонецПроцедуры

Альтернативные архитектурные решения

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

  1. Дерево значений с условным оформлением: Флажки (чекбоксы) можно скрыть на ненужных уровнях иерархии с помощью механизмов условного оформления формы, задав условие по типу строки и установив свойство ТолькоПросмотр = Истина. Также можно использовать колонку с картинками состояний (включено/выключено) вместо стандартного флага.
  2. Поле HTML документа: При необходимости создания полностью кастомного интерфейса без жестких рамок элементов 1С можно использовать верстку в HTML/CSS, где запрет выделения и прокрутки легко регулируется свойствами CSS (user-select: none; overflow: hidden;).

Тем не менее, если задача уже реализована на табличном документе, использование свойства ФиксацияСлева является самым быстрым и простым способом полностью заблокировать нежелательный сдвиг макета.

← На главную