Как сделать текущую строку табличной части доступной только для просмотра в 1С?

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

При разработке управляемых форм часто возникает задача ограничить возможность редактирования данных в табличной части в зависимости от значений самих данных. В частности, если у нас есть логический реквизит (тип Булево), нам нужно запретить пользователю менять строку, если этот реквизит имеет значение Истина. Давайте разберем, какими способами можно реализовать эту задачу в 1С:Предприятии 8.3.

Использование условного оформления

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

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

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

Программное ограничение через событие «ПередНачаломРедактирования»

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

Рассмотрим пример кода, который нужно разместить в модуле формы:


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

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

Разберем этот код подробнее. При попытке пользователя начать редактирование (нажатие Enter, F2 или двойной клик), управление передается в эту процедуру. Мы обращаемся к свойству ТекущиеДанные, чтобы считать значение нашего логического реквизита. Если он равен Истина, мы устанавливаем параметр Отказ в Истина, что физически предотвращает изменение данных строки.

Что выбрать в конкретной ситуации?

Проанализируем оба подхода, чтобы вы могли принять верное решение:

Примечание: Никогда не меняйте свойство ТолькоПросмотр у всего элемента таблицы внутри события ПриАктивизацииСтроки. Это приведет к тому, что таблица будет блокироваться или разблокироваться целиком для всех строк, что создаст неудобства для пользователей при работе с многострочными данными.

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

← На главную