При разработке управляемых форм часто возникает задача ограничить возможность редактирования данных в табличной части в зависимости от значений самих данных. В частности, если у нас есть логический реквизит (тип Булево), нам нужно запретить пользователю менять строку, если этот реквизит имеет значение Истина. Давайте разберем, какими способами можно реализовать эту задачу в 1С:Предприятии 8.3.
Условное оформление — это наиболее предпочтительный и современный метод. Он позволяет управлять визуальным представлением данных без написания сложного кода. Этот способ удобен тем, что платформа сама отслеживает выполнение условий и применяет соответствующие настройки к ячейкам таблицы.
ТолькоПросмотр и установите для него значение Истина.ПризнакБлокировки), и укажите, что он должен быть равен Истина.Важно понимать: Условное оформление блокирует визуальный ввод данных в ячейки, но не отменяет возможность выполнения команд над строкой (удаление, перемещение). Если вам нужно ограничить управление строками, используйте дополнительные проверки в модуле формы.
Если вам требуется жесткий контроль на уровне логики платформы, чтобы пользователь даже не мог активировать режим редактирования ячейки, лучше всего использовать событие формы ПередНачаломРедактирования. Этот метод позволяет динамически отменять вход в режим редактирования.
Рассмотрим пример кода, который нужно разместить в модуле формы:
&НаКлиенте
Процедура ИмяВашейТабличнойЧастиПередНачаломРедактирования(Элемент, НоваяСтрока, Копирование, Отказ)
// Получаем текущую строку из данных элемента
ТекущаяСтрокаДанных = Элемент.ТекущиеДанные;
// Проверяем условие, при котором редактирование запрещено
Если ТекущаяСтрокаДанных <> Неопределено И ТекущаяСтрокаДанных.ВашРеквизитБулево = Истина Тогда
// Отменяем редактирование
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Разберем этот код подробнее. При попытке пользователя начать редактирование (нажатие Enter, F2 или двойной клик), управление передается в эту процедуру. Мы обращаемся к свойству ТекущиеДанные, чтобы считать значение нашего логического реквизита. Если он равен Истина, мы устанавливаем параметр Отказ в Истина, что физически предотвращает изменение данных строки.
Проанализируем оба подхода, чтобы вы могли принять верное решение:
ПоказатьПредупреждение() в блоке Если.Примечание: Никогда не меняйте свойство ТолькоПросмотр у всего элемента таблицы внутри события ПриАктивизацииСтроки. Это приведет к тому, что таблица будет блокироваться или разблокироваться целиком для всех строк, что создаст неудобства для пользователей при работе с многострочными данными.
Всегда помните, что клиентские проверки — это вопрос удобства интерфейса. Если данные критически важны, не забудьте продублировать проверку условий в модуле объекта (в процедуре ПередЗаписью), чтобы защититься от случайного или намеренного изменения данных через другие механизмы платформы.