Как запретить редактирование отдельных ячеек в табличном поле 1С?

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

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

Рассмотрим подробнее, как правильно реализовать запрет редактирования отдельных ячеек в табличном поле для обычных и управляемых форм 1С, а также выясним причину частых ошибок при попытке использовать свойство Доступность вместо ТолькоПросмотр.

Главная ошибка: Доступность против ТолькоПросмотр

Распространенной ошибкой разработчиков является попытка управлять доступностью ячейки через свойство Доступность = Ложь во время навигации по таблице или в событиях вывода. В табличных полях использование этого свойства к отдельной ячейке либо не дает нужного эффекта, либо приводит к некорректному отображению строки.

Разберем разницу между этими параметрами:

  1. Доступность (False/Ложь) — полностью блокирует элемент формы. Ячейка становится серым фоном, взаимодействие с ней невозможно.
  2. ТолькоПросмотр (True/Истина) — запрещает изменение значения в ячейке, но оставляет возможность выделить текст, скопировать его в буфер обмена или перейти по ссылке. Этот параметр корректно работает на уровне отдельных ячеек табличного поля.

Решение для обычных форм (Обычный интерфейс)

В обычных формах динамическое управление свойствами ячеек выполняется в событиях оформления табличного поля. Для этого применяется событие ПриВыводеСтроки или более производительный аналог ПриПолученииДанных.

Рассмотрим пример кода в обработчике события ПриВыводеСтроки, где блокируется редактирование определенных ячеек в зависимости от реквизита строки:


Процедура НастройкиОтчетаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.ФункцияНО = Перечисления.аттФункцииУниверсальныхОтчетовПС.Формула Тогда
        ДоступенСчет = Ложь;
    Иначе
        ДоступенСчет = Истина;
    КонецЕсли;

    // Блокировка и разблокировка ячеек по условию
    ОформлениеСтроки.Ячейки.Счет.ТолькоПросмотр = НЕ ДоступенСчет;
    ОформлениеСтроки.Ячейки.КорСчет.ТолькоПросмотр = НЕ ДоступенСчет;
    ОформлениеСтроки.Ячейки.Формула.ТолькоПросмотр = ДоступенСчет;
КонецПроцедуры

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

ОформлениеСтроки.Ячейки.Цена.Текст = Формат(ДанныеСтроки.Цена, "ЧДЦ=2");

Решение для управляемых форм (Управляемый интерфейс)

В управляемых формах работа с событиями вывода строк не используется. Самым правильным и штатным инструментом является Условное оформление формы.

Выясним по шагам, как настроить запрет редактирования ячеек через условное оформление:

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

В управляемых формах механизм условного оформления также позволяет менять параметр Формат напрямую для нужной ячейки без необходимости записи в текстовое поле.

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


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

Резюме

Для корректного запрета ввода данных в ячейку используйте свойство ТолькоПросмотр. В обычных формах управляйте этим свойством через ОформлениеСтроки.Ячейки.ИмяЯчейки.ТолькоПросмотр в событии ПриВыводеСтроки или ПриПолученииДанных. В управляемых формах применяйте механизм УсловноеОформление или отменяйте редактирование через параметр Отказ = Истина в событии ПередНачаломИзменения.

← На главную