Как запретить редактирование поля на форме в 1С, сохранив возможность копирования текста?

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

При настройке интерфейсов в управляемом приложении 1С разработчики нередко сталкиваются с типовой задачей: требуется защитить значение в поле формы от случайного или намеренного изменения пользователем, но при этом оставить возможность выделить значение курсором и скопировать его в буфер обмена (например, через сочетание клавиш Ctrl+C). Рассмотрим, почему стандартное отключение доступности элемента блокирует работу с буфером и как правильно реализовать требуемое поведение.

В чем разница между свойствами «Доступность» и «ТолькоПросмотр»

Проанализируем поведение платформы при изменении базовых свойств элементов управляемой формы:

  1. Свойство Доступность (значение Ложь). Полностью исключает элемент из пользовательского интерфейса. Поле становится неактивным, текст окрашивается в серый цвет, элемент теряет возможность получить фокус ввода. В таком режиме пользователь не может даже установить курсор внутри поля, выделить строку или скопировать данные.
  2. Свойство ТолькоПросмотр (значение Истина). Ограничивает исключительно возможность модификации данных. При этом элемент остается интерактивным: пользователь может кликнуть мышью, выделить весь текст или произвольный фрагмент, нажать комбинацию клавиш копирования или воспользоваться контекстным меню. При этом свойство Доступность обязательно должно быть установлено в значение Истина.

Реализация через программную настройку элемента формы

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


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Включаем доступность элемента, чтобы он мог принимать фокус
    Элементы.НазвЭлемента.Доступность = Истина;
    
    // Блокируем редактирование содержимого
    Элементы.НазвЭлемента.ТолькоПросмотр = Истина;
    
КонецПроцедуры

Посмотрим на важный нюанс при разработке в типовых конфигурациях (таких как «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация» на базе БСП): типовые механизмы динамически управляют состоянием формы в зависимости от статусов документов, функциональных опций и прав. По этой причине настройки, заданные только в процедуре ПриСозданииНаСервере, могут сбрасываться платформой при перезаполнении формы.

Если после открытия документа или при смене статуса поле снова становится доступным для редактирования, продублируем установку режима только для чтения в обработчике ПриЧтенииНаСервере или подключимся методом После к процедуре формы, отвечающей за пересчет доступности реквизитов.


&После("ПриЧтенииНаСервере")
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    
    Элементы.НазвЭлемента.ТолькоПросмотр = Истина;
    
КонецПроцедуры

Особенности работы со ссылочными данными

Рассмотрим специфику поведения полей, которые ссылаются на объекты базы данных (справочники, документы и другие сущности). Когда для поля ввода ссылочного типа установлено свойство ТолькоПросмотр = Истина, двойной клик мыши или нажатие клавиши выбора может приводить к открытию связанной формы объекта либо к переходу по гиперссылке, что мешает простому выделению текста.

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

  1. Отключим переход по ссылке: установим свойство Гиперссылка в значение Ложь.
  2. Скроем кнопку открытия карточки объекта: зададим КнопкаОткрытия = Ложь.
  3. Убедимся, что вид элемента формы установлен как Поле ввода (ПолеВвода). Если выводить данные через элемент вида Поле надписи, тонкий клиент платформы не позволит выделить текст курсором.

&После("ПриСозданииНаСервере")
Процедура Расш1_НастроитьПолеСсылочногоТипа(Отказ, СтандартнаяОбработка)
    
    Элемент = Элементы.Контрагент;
    Элемент.Доступность    = Истина;
    Элемент.ТолькоПросмотр = Истина;
    Элемент.Гиперссылка    = Ложь;
    Элемент.КнопкаОткрытия = Ложь;
    
КонецПроцедуры

Альтернативные способы решения

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

  1. Настройка прав доступа в метаданных. Если определенному списку пользователей в принципе запрещено изменять реквизит, правильнее всего скорректировать роли. Оставим для роли пользователя права «Чтение» и «Просмотр», но снимем права «Изменение» и «Интерактивное изменение». Платформа 1С автоматически сделает поле доступным только для чтения, сохранив интерактивное выделение и копирование текста.
  2. Использование специализированных команд и кнопок копирования. Если пользователям требуется регулярно копировать конкретный длинный реквизит (например, артикул, штрихкод, идентификатор электронного документа или расчетный счет), рядом с полем можно разместить кнопку с пиктограммой буфера обмена. Начиная с версии платформы 8.3.24, для прямого помещения данных в буфер операционной системы предназначен встроенный асинхронный метод ПоместитьДанныеАсинх объекта СредстваБуфераОбмена.
← На главную