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