Как в табличной части на управляемых формах запретить изменение значения, но разрешить его открытие?

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

При разработке интерфейсов на управляемых формах часто возникает типовая бизнес-задача: пользователю необходимо просматривать данные в строках табличной части и при необходимости открывать связанные документы или справочники (переходить по ссылке), но категорически запрещено менять само значение реквизита. Например, в документе визирования или контроля складских ордеров состав документов заполняется автоматически, а оператор должен иметь возможность ознакомиться с первичным документом, не имея возможности случайно выбрать другой объект или очистить поле.

Разберем особенности поведения платформы «1С:Предприятие 8.3» в управляемом интерфейсе, выясним причину ограничений стандартного свойства ТолькоПросмотр и рассмотрим надежные способы реализации такого поведения.

В чем сложность: почему не работает свойство «ТолькоПросмотр»

В обычном приложении установка свойства ТолькоПросмотр = Истина для колонки позволяла заблокировать изменение, но оставляла доступной кнопку открытия («лупу») или открывала значение по двойному клику. В управляемых формах архитектура отображения таблиц принципиально иная.

Ячейка таблицы в режиме отображения представляет собой легковесный статический элемент. Полноценный элемент управления (редактор поля ввода с кнопками выбора, очистки и открытия) активируется только тогда, когда ячейка переходит в режим редактирования. Если для колонки или всей таблицы установлено ТолькоПросмотр = Истина, платформа полностью подавляет активацию редактора ячейки. В результате на ячейку нельзя встать для нажатия кнопки открытия, а контекстные команды перехода к объекту блокируются. Поведение становится аналогичным установке свойства Доступность = Ложь.

Посмотрим на практические варианты решения этой задачи без потери удобства интерфейса.

Способ 1. Использование события таблицы «Выбор» и процедуры «ПоказатьЗначение»

Наиболее лаконичный и универсальный подход заключается в том, чтобы оставить колонку в режиме только для чтения, но обрабатывать интерактивный клик пользователя на уровне всей таблицы. При двойном щелчке мыши или нажатии клавиши Enter генерируется событие Выбор, в котором мы можем принудительно открыть связанный объект.

Разберем по шагам реализацию этого способа:

  1. Для нужной колонки табличной части установим свойство ТолькоПросмотр = Истина. Это гарантирует, что пользователь не сможет отредактировать значение с клавиатуры или через меню.
  2. В свойствах самой таблицы формы найдем событие Выбор и создадим обработчик на клиенте.
  3. В обработчике проверим имя активизированной колонки, получим ссылку из данных текущей строки и вызовем асинхронную процедуру ПоказатьЗначение().

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


&НаКлиенте
Процедура ТабличнаяЧастьВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Отменяем стандартное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    // Проверяем, что клик произошел по интересующей нас колонке
    Если Поле.Имя = "ТабличнаяЧастьДокументОснование" Тогда
        
        ТекДанные = Элемент.ТекущиеДанные;
        Если ТекДанные <> Неопределено Тогда
            СсылкаНаОбъект = ТекДанные.ДокументОснование;
            Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
                ПоказатьЗначение(, СсылкаНаОбъект);
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Данный подход полностью безопасен: пользователь не может исказить данные через сочетания клавиш, а открытие объекта выполняется предсказуемо и быстро.

Способ 2. Настройка поля как гиперссылки

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

Рассмотрим, как настроить такое отображение:

  1. Выделим колонку табличной части в дереве элементов формы.
  2. Установим свойство ГиперссылкаЯчейки = Истина (в палитре свойств элемента или программно при создании формы).
  3. Установим свойство ТолькоПросмотр = Истина для колонки.
  4. Назначим обработчик события таблицы Выбор, как было описано в Способе 1.

При включенном свойстве ГиперссылкаЯчейки значение визуально подсвечивается как ссылка. При клике мышью ячейка не начинает редактироваться, а сразу активирует событие Выбор, откуда вызывается открытие объекта. Это исключает случайный ввод текста и избавляет пользователя от мелких кнопок в ячейках.

Способ 3. Преобразование вида поля в «Поле надписи»

По умолчанию колонка табличной части связывается с реквизитом через элемент управления Поле ввода. Однако вид поля в колонке можно изменить.

Проанализируем этот вариант:

  1. В палитре свойств колонки изменим свойство Вид со значения Поле ввода на Поле надписи. Путь к данным оставляем прежним.
  2. Установим флаг Гиперссылка = Истина (или ГиперссылкаЯчейки = Истина).
  3. Назначим обработчик события Нажатие для поля надписи либо событие Выбор у самой таблицы.

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

Способ 4. Блокировка редактирования через «ПередНачаломИзменения»

Еще один надежный системный способ — перехват попытки редактирования на уровне всей таблицы через предопределенное событие ПередНачаломИзменения.


&НаКлиенте
Процедура ТабличнаяЧастьПередНачаломИзменения(Элемент, Отказ)
    
    // Запрещаем вход в режим редактирования для конкретной колонки
    Если Элемент.ТекущийЭлемент.Имя = "ТабличнаяЧастьДокументОснование" Тогда
        Отказ = Истина;
    КонецЕсли;
    
КонецПроцедуры

Когда параметр Отказ устанавливается в значение Истина, платформа блокирует вход в ячейку по клавишам F4, Enter или щелчку мыши. Пользователь не сможет изменить содержимое из буфера обмена или стереть его. Для открытия объекта в таком сценарии используется связка с обработчиком Выбор, описанным выше.

Подводные камни ручной настройки «Поля ввода» свойствами

Иногда разработчики пытаются оставить Поле ввода редактируемым, но отключить все элементы управления через свойства: КнопкаВыбора = Нет, КнопкаОчистки = Нет, РедактированиеТекста = Ложь и КнопкаОткрытия = Да.

Обратим внимание на скрытые уязвимости такой настройки:

  1. Горячие клавиши выбора: даже если кнопка с тремя точками скрыта, нажатие клавиши F4 по умолчанию все равно открывает форму выбора объекта. Чтобы это предотвратить, приходится обязательно использовать событие НачалоВыбора:
    
    &НаКлиенте
    Процедура ТабличнаяЧастьРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь;
    КонецПроцедуры
    
  2. История выбора и автоподбор: если у реквизита включена история выбора, при фокусе может выпасть список ранее использованных значений. Необходимо явно переводить свойство ИсторияВыбораПриВводе в значение НеИспользовать и отключать БыстрыйВыбор.
  3. Очистка значения: пользователь может случайно очистить ячейку нажатием клавиш Delete, Backspace или комбинацией Shift + F4.

Именно поэтому ручная маскировка поля ввода считается избыточной и ненадежной. Намного проще и безопаснее перевести колонку в ТолькоПросмотр = Истина (или использовать Поле надписи) и открывать значение по двойному клику или одинарному нажатию ссылки через обработчик таблицы Выбор.

Защита состава строк таблицы

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

  1. Установим свойство ИзменятьСоставСтрок = Ложь — это заблокирует добавление, удаление и копирование строк пользователем (включая горячие клавиши Insert и Delete).
  2. Установим свойство ИзменятьПорядокСтрок = Ложь — это исключит перемещение строк вверх и вниз.

Применение связки свойств ИзменятьСоставСтрок = Ложь, ГиперссылкаЯчейки = Истина и клиентской процедуры ПоказатьЗначение() в событии Выбор обеспечивает эталонный пользовательский интерфейс: данные защищены от любых непреднамеренных правок, а навигация по объектам системы остается быстрой и удобной.

← На главную