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