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