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