Как сделать доступным отдельный реквизит в обычной форме 1С, если форма открыта только на просмотр?

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

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

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

Почему ТолькоПросмотр = Истина блокирует все реквизиты формы

Проанализируем механику работы платформы 1С. Установка свойства ТолькоПросмотр = Истина для формы в целом имеет высший приоритет над свойствами отдельных элементов. Платформа глобально переводит форму в режим чтения и блокирует редактирование данных.

При этом под блокировку попадают:

  1. Все элементы управления, связанные с реквизитами самого объекта (документа, справочника).
  2. Реквизиты, у которых установлен флаг СохраняемыеДанные.
  3. Элементы управления, у которых свойство ИзменяетДанные установлено в Истина.

Если форма заблокирована целиком через свойство формы ТолькоПросмотр, попытка программно установить Доступность = Истина или ТолькоПросмотр = Ложь для одного конкретного элемента формы не даст результата — элемент останется недоступным.

Решение: Программный обход элементов формы (Выборочная блокировка)

Разберем основной способ решения этой проблемы. Чтобы оставить один или несколько реквизитов доступными, не следует устанавливать ТолькоПросмотр = Истина для самой формы. Глобальное свойство формы должно оставаться в значении Ложь.

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

Посмотрим на пример кода в модуле формы:


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

КонецПроцедуры

Важные нюансы и рекомендации

Выясним дополнительные детали, которые следует учитывать при настройке выборочной доступности:

  1. Связь с реквизитами объекта: Если доступный реквизит является реквизитом самого объекта базы данных, а не отдельным реквизитом формы, при его изменении форма может потребовать сохранения. Убедитесь, что реквизит добавлен именно как реквизит формы, если он нужен только для служебных целей (например, переключения режимов).
  2. Свойство ИзменяетДанные: У элементов формы, предназначенных для управления интерфейсом в режиме просмотра, рекомендуется снять флаг ИзменяетДанные в палитре свойств.
  3. Использование вспомогательных диалогов: Если форма заблокирована полностью, а значение реквизита всё же нужно изменить, можно повесить на форму неблокируемую гиперссылку или кнопку, по нажатию на которую вызывать методы ВвестиЗначение, ВвестиЧисло или открывать отдельную вспомогательную форму-диалог.Полученное значение затем обрабатывается программным кодом.

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

← На главную