Как установить режим «Только просмотр» для отдельной ячейки таблицы в управляемых формах 1С?

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

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

Почему блокируется весь столбец при изменении свойства элемента формы

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


&НаКлиенте
Процедура ТабличнаяЧасть1Реквизит1ПриИзменении(Элемент)
    Элемент.ТолькоПросмотр = Истина;
КонецПроцедуры

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

Решение 1. Использование условного оформления (рекомендуемый способ)

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

Разберем по шагам, как программно добавить элемент условного оформления на сервере:

  1. Создаем новый элемент коллекции УсловноеОформление.
  2. Задаем оформляемые поля (колонку таблицы, для которой настраивается доступ).
  3. Устанавливаем условие, при выполнении которого ячейка должна блокироваться.
  4. Включаем параметр оформления ТолькоПросмотр или Доступность.

Посмотрим на пример программной реализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // 1. Указываем свойство оформления
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
    
    // 2. Определяем условие блокировки ячейки
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТабличнаяЧасть1.Заблокировано");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементУсловия.ПравоеЗначение = Истина;
    ЭлементУсловия.Использование = Истина;
    
    // 3. Указываем оформляемую колонку
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧасть1Реквизит1");
    ОформляемоеПоле.Использование = Истина;
    
КонецПроцедуры

Обратим внимание на разницу между параметрами оформления:

  1. ТолькоПросмотр — запрещает изменение данных пользователем, однако сохраняет возможность выделить текст, скопировать его или открыть значение (например, перейти в карточку справочника).
  2. Доступность — полностью отключает интерактивность поля (ячейка визуально становится неактивной, и на нее нельзя установить курсор).

Решение 2. Проверка в событии таблицы «ПередНачаломИзменения»

Если условие блокировки требует сложной интерактивной логики или расчета непосредственно перед стартом редактирования, можно использовать событие таблицы формы ПередНачаломИзменения. Этот метод позволяет программно отменить открытие ячейки на редактирование без использования условного оформления.

Рассмотрим пример реализации на клиенте:


&НаКлиенте
Процедура ТабличнаяЧасть1ПередНачаломИзменения(Элемент, Отказ)
    
    ТекущиеДанные = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, редактируется ли целевая колонка и выполняется ли условие
    Если Элементы.ТабличнаяЧасть1.ТекущийЭлемент = Элементы.ТабличнаяЧасть1Реквизит1 Тогда
        Если ТекущиеДанные.Заблокировано = Истина Тогда
            Отказ = Истина; // Запрещаем переход в режим редактирования
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Решение 3. Управление свойством колонки при смене фокуса

Еще один возможный вариант — динамически переключать свойство ТолькоПросмотр у элемента формы в обработчиках ПриАктивизацииСтроки или ПриАктивизацииЯчейки.

Посмотрим на пример:


&НаКлиенте
Процедура ТабличнаяЧасть1ПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        Элементы.ТабличнаяЧасть1Реквизит1.ТолькоПросмотр = (ТекущиеДанные.Заблокировано = Истина);
    КонецЕсли;
    
КонецПроцедуры

Следует учитывать, что данный метод меняет свойство колонки каждый раз при перемещении курсора по таблице. При интенсивной работе пользователя или большом объеме строк это создает дополнительную нагрузку на клиентский сеанс и может приводить к микрозадержкам интерфейса, поэтому предпочтительным остается использование Условного оформления.

Особенности и ограничения защиты данных

Важно помнить, что любые визуальные ограничения (условное оформление, отказ в событии редактирования, режим только просмотра) блокируют исключительно интерактивный ввод данных пользователем в конкретное поле. Они не защищают реквизит от программного изменения в коде конфигурации и не запрещают удаление строки через контекстное меню или клавишу Delete. Если требуется полностью исключить удаление заблокированных строк, необходимо дополнительно обрабатывать событие таблицы ПередУдалением.

← На главную