При настройке интерфейсов в управляемом приложении 1С разработчики нередко сталкиваются с типовой задачей: требуется защитить значение в поле формы от случайного или намеренного изменения пользователем, но при этом оставить возможность выделить значение курсором и скопировать его в буфер обмена (например, через сочетание клавиш Ctrl+C). Рассмотрим, почему стандартное отключение доступности элемента блокирует работу с буфером и как правильно реализовать требуемое поведение.
Проанализируем поведение платформы при изменении базовых свойств элементов управляемой формы:
Доступность (значение Ложь). Полностью исключает элемент из пользовательского интерфейса. Поле становится неактивным, текст окрашивается в серый цвет, элемент теряет возможность получить фокус ввода. В таком режиме пользователь не может даже установить курсор внутри поля, выделить строку или скопировать данные.ТолькоПросмотр (значение Истина). Ограничивает исключительно возможность модификации данных. При этом элемент остается интерактивным: пользователь может кликнуть мышью, выделить весь текст или произвольный фрагмент, нажать комбинацию клавиш копирования или воспользоваться контекстным меню. При этом свойство Доступность обязательно должно быть установлено в значение Истина.Разберем типовой пример кода при доработке формы через расширение конфигурации. Если мы переопределяем свойства в обработчике ПриСозданииНаСервере, правильная комбинация свойств выглядит следующим образом:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Включаем доступность элемента, чтобы он мог принимать фокус
Элементы.НазвЭлемента.Доступность = Истина;
// Блокируем редактирование содержимого
Элементы.НазвЭлемента.ТолькоПросмотр = Истина;
КонецПроцедуры
Посмотрим на важный нюанс при разработке в типовых конфигурациях (таких как «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация» на базе БСП): типовые механизмы динамически управляют состоянием формы в зависимости от статусов документов, функциональных опций и прав. По этой причине настройки, заданные только в процедуре ПриСозданииНаСервере, могут сбрасываться платформой при перезаполнении формы.
Если после открытия документа или при смене статуса поле снова становится доступным для редактирования, продублируем установку режима только для чтения в обработчике ПриЧтенииНаСервере или подключимся методом После к процедуре формы, отвечающей за пересчет доступности реквизитов.
&После("ПриЧтенииНаСервере")
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
Элементы.НазвЭлемента.ТолькоПросмотр = Истина;
КонецПроцедуры
Рассмотрим специфику поведения полей, которые ссылаются на объекты базы данных (справочники, документы и другие сущности). Когда для поля ввода ссылочного типа установлено свойство ТолькоПросмотр = Истина, двойной клик мыши или нажатие клавиши выбора может приводить к открытию связанной формы объекта либо к переходу по гиперссылке, что мешает простому выделению текста.
Чтобы обеспечить удобное копирование текстового представления ссылки без случайных открытий карточек, настроим сопутствующие свойства элемента управления:
Гиперссылка в значение Ложь.КнопкаОткрытия = Ложь.ПолеВвода). Если выводить данные через элемент вида Поле надписи, тонкий клиент платформы не позволит выделить текст курсором.
&После("ПриСозданииНаСервере")
Процедура Расш1_НастроитьПолеСсылочногоТипа(Отказ, СтандартнаяОбработка)
Элемент = Элементы.Контрагент;
Элемент.Доступность = Истина;
Элемент.ТолькоПросмотр = Истина;
Элемент.Гиперссылка = Ложь;
Элемент.КнопкаОткрытия = Ложь;
КонецПроцедуры
Проанализируем другие подходы, которые позволяют решить задачу без усложнения программного кода формы:
ПоместитьДанныеАсинх объекта СредстваБуфераОбмена.