Как заблокировать ячейку табличной части в 1С, если условное оформление не работает?

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

Часто при разработке на управляемых формах возникает задача динамически блокировать или скрывать отдельные ячейки в табличной части документа. Разберем типичную ситуацию: в табличной части есть две колонки — ПричинаОтказа и ДатаОтказа. Нам нужно сделать так, чтобы при незаполненной причине дата была недоступна для редактирования. Проанализируем, почему визуальное условное оформление может не срабатывать, и рассмотрим два проверенных способа решения этой задачи.

Почему настроенное в конфигураторе условное оформление игнорируется?

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

  1. Путаница в свойствах платформы. В настройках условного оформления отсутствует прямое свойство, отвечающее за доступность ячейки. Если вы попытаетесь искать именно «Доступность», то не достигнете результата. Чтобы запретить редактирование ячейки, необходимо использовать свойство ТолькоПросмотр и устанавливать его в значение Истина.
  2. Переопределение в типовых конфигурациях. Если вы работаете с типовой конфигурацией (на базе Библиотеки стандартных подсистем — БСП), то при открытии формы или программном обновлении интерфейса всё пользовательское или добавленное в конфигураторе условное оформление часто очищается платформой. В таких базах настройки необходимо добавлять исключительно через программный код.

Рассмотрим подробнее, как правильно реализовать задуманное, чтобы оформление работало корректно.

Способ 1: Программное добавление условного оформления

Чтобы оформление не «слетало» в типовой базе при перерисовке формы, добавим нужное условие динамически. Разберем по шагам, как это сделать в серверном обработчике ПриСозданииНаСервере:

  1. Создадим новый элемент условного оформления с помощью коллекции УсловноеОформление.Элементы.Добавить().
  2. Зададим оформление, указав свойство ТолькоПросмотр.
  3. Установим отбор для проверки заполненности реквизита ПричинаОтказа (используем вид сравнения НеЗаполнено).
  4. Укажем оформляемое поле — добавим колонку ДатаОтказа в коллекцию полей.

Посмотрим на пример программной реализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем новый элемент условного оформления
    ЭлементУО = УсловноеОформление.Элементы.Добавить();
    
    // Шаг 1. Устанавливаем свойство ТолькоПросмотр
    ОформлениеЭлемента = ЭлементУО.Оформление.Элементы.Найти("ТолькоПросмотр");
    ОформлениеЭлемента.Значение = Истина;
    ОформлениеЭлемента.Использование = Истина;
    
    // Шаг 2. Задаем условие: Причина отказа не заполнена
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТабличнаяЧасть.ПричинаОтказа");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
    ЭлементОтбора.Использование = Истина;
    
    // Шаг 3. Указываем колонку для блокировки
    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧастьДатаОтказа");
    ОформляемоеПоле.Использование = Истина;
    
КонецПроцедуры

Способ 2: Управление доступностью через событие "ПриАктивизацииСтроки"

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

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

Рассмотрим пример кода на клиенте:


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

Важное замечание: Метод с использованием обработчика ПриАктивизацииСтроки является полностью рабочим и легким в реализации. Однако нужно учитывать, что код будет выполняться при каждом клике или перемещении по строкам клавиатурой. Условное оформление (Способ 1) рассчитывается платформой 1С на более низком уровне и считается более оптимальным и предпочтительным решением с точки зрения архитектуры и производительности интерфейса.

← На главную