При разработке интерфейсов на управляемых формах часто возникает типовая бизнес-задача: пользователю необходимо просматривать данные в строках табличной части и при необходимости открывать связанные документы или справочники (переходить по ссылке), но категорически запрещено менять само значение реквизита. Например, в документе визирования или контроля складских ордеров состав документов заполняется автоматически, а оператор должен иметь возможность ознакомиться с первичным документом, не имея возможности случайно выбрать другой объект или очистить поле.
Разберем особенности поведения платформы «1С:Предприятие 8.3» в управляемом интерфейсе, выясним причину ограничений стандартного свойства ТолькоПросмотр и рассмотрим надежные способы реализации такого поведения.
В обычном приложении установка свойства ТолькоПросмотр = Истина для колонки позволяла заблокировать изменение, но оставляла доступной кнопку открытия («лупу») или открывала значение по двойному клику. В управляемых формах архитектура отображения таблиц принципиально иная.
Ячейка таблицы в режиме отображения представляет собой легковесный статический элемент. Полноценный элемент управления (редактор поля ввода с кнопками выбора, очистки и открытия) активируется только тогда, когда ячейка переходит в режим редактирования. Если для колонки или всей таблицы установлено ТолькоПросмотр = Истина, платформа полностью подавляет активацию редактора ячейки. В результате на ячейку нельзя встать для нажатия кнопки открытия, а контекстные команды перехода к объекту блокируются. Поведение становится аналогичным установке свойства Доступность = Ложь.
Посмотрим на практические варианты решения этой задачи без потери удобства интерфейса.
Наиболее лаконичный и универсальный подход заключается в том, чтобы оставить колонку в режиме только для чтения, но обрабатывать интерактивный клик пользователя на уровне всей таблицы. При двойном щелчке мыши или нажатии клавиши Enter генерируется событие Выбор, в котором мы можем принудительно открыть связанный объект.
Разберем по шагам реализацию этого способа:
ТолькоПросмотр = Истина. Это гарантирует, что пользователь не сможет отредактировать значение с клавиатуры или через меню.Выбор и создадим обработчик на клиенте.ПоказатьЗначение().Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура ТабличнаяЧастьВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное поведение платформы
СтандартнаяОбработка = Ложь;
// Проверяем, что клик произошел по интересующей нас колонке
Если Поле.Имя = "ТабличнаяЧастьДокументОснование" Тогда
ТекДанные = Элемент.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда
СсылкаНаОбъект = ТекДанные.ДокументОснование;
Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
ПоказатьЗначение(, СсылкаНаОбъект);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Данный подход полностью безопасен: пользователь не может исказить данные через сочетания клавиш, а открытие объекта выполняется предсказуемо и быстро.
Если мы хотим сделать интерфейс максимально удобным и интуитивно понятным, стоит оформить ячейку в виде ссылки. В этом случае пользователю даже не придется нажимать двойной клик — переход произойдет по обычному одиночному нажатию.
Рассмотрим, как настроить такое отображение:
ГиперссылкаЯчейки = Истина (в палитре свойств элемента или программно при создании формы).ТолькоПросмотр = Истина для колонки.Выбор, как было описано в Способе 1.При включенном свойстве ГиперссылкаЯчейки значение визуально подсвечивается как ссылка. При клике мышью ячейка не начинает редактироваться, а сразу активирует событие Выбор, откуда вызывается открытие объекта. Это исключает случайный ввод текста и избавляет пользователя от мелких кнопок в ячейках.
По умолчанию колонка табличной части связывается с реквизитом через элемент управления Поле ввода. Однако вид поля в колонке можно изменить.
Проанализируем этот вариант:
Вид со значения Поле ввода на Поле надписи. Путь к данным оставляем прежним.Гиперссылка = Истина (или ГиперссылкаЯчейки = Истина).Нажатие для поля надписи либо событие Выбор у самой таблицы.Преимущество поля надписи заключается в том, что у него на уровне платформы физически отсутствуют механизмы редактирования: ввод текста, кнопки выпадающих списков, реакция на клавиши очистки или подбора. Это дает полную гарантию неизменяемости данных без необходимости писать громоздкие проверки.
Еще один надежный системный способ — перехват попытки редактирования на уровне всей таблицы через предопределенное событие ПередНачаломИзменения.
&НаКлиенте
Процедура ТабличнаяЧастьПередНачаломИзменения(Элемент, Отказ)
// Запрещаем вход в режим редактирования для конкретной колонки
Если Элемент.ТекущийЭлемент.Имя = "ТабличнаяЧастьДокументОснование" Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Когда параметр Отказ устанавливается в значение Истина, платформа блокирует вход в ячейку по клавишам F4, Enter или щелчку мыши. Пользователь не сможет изменить содержимое из буфера обмена или стереть его. Для открытия объекта в таком сценарии используется связка с обработчиком Выбор, описанным выше.
Иногда разработчики пытаются оставить Поле ввода редактируемым, но отключить все элементы управления через свойства: КнопкаВыбора = Нет, КнопкаОчистки = Нет, РедактированиеТекста = Ложь и КнопкаОткрытия = Да.
Обратим внимание на скрытые уязвимости такой настройки:
F4 по умолчанию все равно открывает форму выбора объекта. Чтобы это предотвратить, приходится обязательно использовать событие НачалоВыбора:
&НаКлиенте
Процедура ТабличнаяЧастьРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
ИсторияВыбораПриВводе в значение НеИспользовать и отключать БыстрыйВыбор.Delete, Backspace или комбинацией Shift + F4.Именно поэтому ручная маскировка поля ввода считается избыточной и ненадежной. Намного проще и безопаснее перевести колонку в ТолькоПросмотр = Истина (или использовать Поле надписи) и открывать значение по двойному клику или одинарному нажатию ссылки через обработчик таблицы Выбор.
Если задача состоит в полном запрете редактирования данных строк (например, когда табличная часть формируется программно по кнопке), не забудем также ограничить интерактивные действия со строками в свойствах самой таблицы:
ИзменятьСоставСтрок = Ложь — это заблокирует добавление, удаление и копирование строк пользователем (включая горячие клавиши Insert и Delete).ИзменятьПорядокСтрок = Ложь — это исключит перемещение строк вверх и вниз.Применение связки свойств ИзменятьСоставСтрок = Ложь, ГиперссылкаЯчейки = Истина и клиентской процедуры ПоказатьЗначение() в событии Выбор обеспечивает эталонный пользовательский интерфейс: данные защищены от любых непреднамеренных правок, а навигация по объектам системы остается быстрой и удобной.