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

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

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

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

Почему условное оформление не применяется сразу

Проанализируем типовую ситуацию. Механизм условного оформления в управляемых формах рассчитывается на стороне клиента автоматически в момент изменения данных в строке. Однако обновление оформления не срабатывает мгновенно в следующих случаях:

  1. Поле отбора рассчитывается только на сервере. Если колонка, по которой задано условие (например, МиксерКалк), вычисляется только в серверных процедурах ПриЧтенииНаСервере, ПриСозданииНаСервере или ПриЗаписиНаСервере, то при интерактивной работе пользователя значение в строке на клиенте остается старым. До тех пор, пока форма не будет перечитана с сервера, условное оформление не изменит свой вид.
  2. Неверная логика применения свойства «ТолькоПросмотр». По умолчанию все колонки доступны для редактирования. Если в свойствах колонки формы параметр ТолькоПросмотр выключен, то правило условного оформления с параметром ТолькоПросмотр = Ложь ничего не меняет. Если же колонка жестко заблокирована в свойствах элемента формы (ТолькоПросмотр = Истина), условное оформление не может переопределить этот запрет и разблокировать ячейку для отдельных строк.
  3. Отсутствие свойства «Доступность» в условном оформлении. В механизме условного оформления управляемых форм параметр Доступность не предусмотрен — для управления возможностью ввода используется параметр ТолькоПросмотр.

Способ 1. Мгновенный расчет зависимого поля на клиенте и инверсия правила

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

Разберем по шагам настройку корректного правила от обратного:

  1. В свойствах элемента формы нужной колонки (например, ВремяПодачи) убеждаемся, что флаг ТолькоПросмотр снят (установлен в Ложь).
  2. Настраиваем условное оформление на блокировку (устанавливаем ТолькоПросмотр = Истина, когда условие редактирования не выполняется).

Посмотрим на пример программной инициализации условного оформления при создании формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НастроитьУсловноеОформление();
КонецПроцедуры

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

Рассмотрим далее обработчик изменения значения на клиенте. В событии ПриИзменении поля, влияющего на логику, необходимо сразу пересчитать значение реквизита в текущей строке:


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

Как только значение поля МиксерКалк в текущих данных строки изменяется на клиенте, платформа 1С автоматически применяет оформление к ячейке ВремяПодачи без обращения к серверу.

Способ 2. Управление редактированием через события элементов формы

Если условие доступности ячейки требует сложных вычислений или обращения к серверной базе, условное оформление можно дополнить или заменить обработчиками событий таблицы формы.

Рассмотрим два варианта реализации:

  1. Событие «ПриАктивизацииСтроки»: позволяет динамически менять свойство колонки для текущей активной строки.

    
    &НаКлиенте
    Процедура ЮК_ТранспортПриАктивизацииСтроки(Элемент)
        СтрокаТаблицы = Элементы.ЮК_Транспорт.ТекущиеДанные;
        Если СтрокаТаблицы <> Неопределено Тогда
            Элементы.ВремяПодачи.ТолькоПросмотр = НЕ СтрокаТаблицы.МиксерКалк;
        КонецЕсли;
    КонецПроцедуры
    
  2. Событие «ПередНачаломИзменения» таблицы: позволяет пресекать попытку редактирования заблокированных ячеек.

    
    &НаКлиенте
    Процедура ЮК_ТранспортПередНачаломИзменения(Элемент, Отказ)
        СтрокаТаблицы = Элементы.ЮК_Транспорт.ТекущиеДанные;
        Если СтрокаТаблицы <> Неопределено И Элементы.ЮК_Транспорт.ТекущийЭлемент = Элементы.ВремяПодачи Тогда
            Если НЕ СтрокаТаблицы.МиксерКалк Тогда
                Отказ = Истина;
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    

Использование условного оформления от обратного в сочетании с клиентским обновлением данных строки является наиболее производительным и наглядным решением для управляемого интерфейса 1С.

← На главную