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

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

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

Метод 1: Использование «Условного оформления» — лучший выбор

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

Для реализации этого подхода рекомендуем выполнить следующие шаги:

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

Этот метод считается идеологически правильным, так как он не требует частого обращения к серверу при навигации по строкам и обеспечивает наилучшую производительность формы.

Метод 2: Программное управление свойством «Доступность» или «ТолькоПросмотр»

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

Важно помнить, что если вы управляете свойством Элементы.ИмяКолонки.Доступность, вы блокируете весь столбец целиком. Чтобы управлять конкретной ячейкой, следует обращаться к текущим данным строки:


&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    Если ТекДанные <> Неопределено Тогда
        // Управляем доступностью конкретной ячейки через свойство ТолькоПросмотр
        Элементы.ТоварыЦена.ТолькоПросмотр = (ТекДанные.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Услуга"));
    КонецЕсли;
КонецПроцедуры

При использовании программного подхода обратите внимание на следующие важные аспекты: