Почему при установке свойства ТолькоПросмотр на управляемой форме 1С блокируются не все элементы?

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

При разработке интерфейсов на платформе 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией: в коде формы устанавливается режим ЭтаФорма.ТолькоПросмотр = Истина;, однако часть элементов управления (например, флажки, поля ввода или переключатели) остаются активными и доступными для изменения пользователем. Разберем подробно механику работы управляемых форм, выясним причину такого поведения и рассмотрим надежные способы полной блокировки интерфейса.

Механизм работы свойства ТолькоПросмотр

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

  1. Элементы управления, которые непосредственно связаны с реквизитами формы (то есть у них заполнено свойство ПутьКДанным).
  2. Элементы управления и команды, для которых в палитре свойств явно установлено свойство ИзменяетДанные в значение Истина.

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

Способ 1. Привязка элементов к реквизитам формы

Рассмотрим основной и самый правильный с точки зрения архитектуры управляемых форм способ решения проблемы. Разберем процесс по шагам:

  1. Перейдем на вкладку Реквизиты в редакторе формы.
  2. Создадим новый реквизит формы нужного типа (например, с типом Булево для флажка).
  3. Откроем палитру свойств проблемного элемента управления и в поле ПутьКДанным выберем созданный реквизит формы.

После привязки к реквизиту элемент становится полноправной частью модели данных формы. При выполнении кода ЭтаФорма.ТолькоПросмотр = Истина; данный элемент будет автоматически заблокирован платформой вместе со всеми остальными полями.

Способ 2. Использование свойства ИзменяетДанные

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

  1. Выделим элемент формы в дереве элементов.
  2. В палитре свойств найдем параметр ИзменяетДанные.
  3. Установим данный флаг в значение Истина.

В этом случае платформа будет учитывать элемент при переключении режима формы и запретит интерактивное взаимодействие с ним при ТолькоПросмотр = Истина.

Способ 3. Явная программная блокировка отдельных элементов

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


// Вариант 1: запрет редактирования без изменения контрастности
Элементы.ФлажокСогласовано.ТолькоПросмотр = Истина;

// Вариант 2: полное отключение доступности элемента (элемент становится серым)
Элементы.ФлажокСогласовано.Доступность = Ложь;

Свойство ТолькоПросмотр для отдельного элемента оставляет значение читаемым, но блокирует изменение. Свойство Доступность полностью исключает элемент из фокуса ввода и взаимодействия.

Способ 4. Программный обход всех элементов формы

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


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

Рекомендации по размещению кода

Обратим внимание на выбор обработчика событий для установки режима только для чтения. Рекомендуется выполнять настройку свойств ТолькоПросмотр и параметров элементов в серверных обработчиках ПриСозданииНаСервере или ПриЧтенииНаСервере, а не в клиентском событии ПриОткрытии. Это позволяет избежать визуального мерцания элементов при отрисовке окна и исключает лишние клиент-серверные вызовы при инициализации формы.

← На главную