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