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