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