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