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

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача динамического управления интерфейсом. Например, нам нужно скрыть определенные поля, если пользователь не установил соответствующий флажок, или убрать колонки таблицы при выборе определенного вида операции. Рассмотрим подробно, как это реализовать правильно, избегая типичных ошибок новичков.

Разбор основной ошибки: Данные vs Элементы

Проанализируем ситуацию, с которой часто сталкиваются начинающие разработчики. Попытка перебрать строки объектной коллекции (например, Объект.Товары) и установить свойство Видимость для реквизита строки — это тупиковый путь. Важно понимать: реквизит данных не обладает свойством видимости. Видимость — это свойство Элемента формы, который отображает эти данные.

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


&НаКлиенте
Процедура ПА_ПриемАккумуляторовПриИзменении(Элемент)
    // Управляем видимостью элементов на основе значения реквизита
    Элементы.ТоварыПА_Содержание.Видимость = Объект.ПА_ПриемАккумуляторов;
    Элементы.ТоварыПА_ЕдиницаИзмерения.Видимость = Объект.ПА_ПриемАккумуляторов;
КонецПроцедуры

Метод 1: Прямое управление свойством Видимость

Этот метод является самым простым и "жестким". Когда мы устанавливаем Элементы.ИмяПоля.Видимость = Ложь, платформа полностью исключает этот элемент из состава формы, передаваемой на клиент. Выясним основные нюансы этого метода:

  1. Влияние на состав формы: Если видимость установлена в Ложь программно, пользователь не сможет включить отображение этого поля через меню "Изменить форму".
  2. Где прописывать: Чтобы форма выглядела корректно при открытии, код управления видимостью обязательно должен дублироваться в процедуре ПриСозданииНаСервере или в специализированной процедуре УстановитьВидимостьДоступность(), которая вызывается из серверных и клиентских обработчиков.
  3. Массовое управление: Чтобы не прописывать каждую колонку отдельно, рекомендуется объединять зависимые поля в Группу элементов. В этом случае достаточно изменить видимость одной группы, и все вложенные элементы исчезнут автоматически.

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


&НаСервере
Процедура УстановитьСостояниеПолей()
    // Скрываем или показываем целую группу полей
    Элементы.ГруппаДополнительныеПараметры.Видимость = Объект.ИспользоватьДопПараметры;
КонецПроцедуры

Метод 2: Условное оформление (УО)

Рассмотрим ситуацию, когда нам нужно скрыть не всю колонку, а значения в определенных строках, или когда мы работаем с динамическим списком. Для этих целей идеально подходит Условное оформление. Оно позволяет задавать правила отображения без написания сложного кода в обработчиках ожидания или изменения.

Разберем, как программно настроить УО в процедуре ПриСозданииНаСервере:


ЭлементУО = УсловноеОформление.Элементы.Добавить();
// Настройка оформления: делаем текст невидимым
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", "");
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

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

// Указываем, какие поля оформлять
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыПА_Содержание");

Важно помнить: Условное оформление не удаляет колонку, оно лишь меняет визуальное представление данных в ячейках. Если ваша цель — полностью убрать столбец из интерфейса, используйте свойство Видимость элемента таблицы.

Метод 3: Пользовательская видимость

В платформе существует разделение на системную видимость и Пользовательскую видимость. Проанализируем разницу. Свойство ПользовательскаяВидимость определяет, будет ли поле отображаться у конкретных ролей или пользователей по умолчанию. Если мы программно меняем это свойство, мы как бы "снимаем галочку" за пользователя в настройках формы, но оставляем ему техническую возможность вернуть поле на экран. Для автоматического скрытия чувствительных данных пригодится обработка для скрытия чувствительных данных и полей.

Для управления этим свойством в конфигураторе нужно зайти в свойства элемента формы, нажать "Открыть" рядом с пунктом "Пользовательская видимость" и настроить доступность для нужных ролей. Программная установка выглядит так:

Элементы.ИмяПоля.ПользовательскаяВидимость = Ложь;

Использование функциональных опций

Если скрытие полей зависит от глобальных настроек системы (например, в константах включена опция "Вести учет по складам"), правильнее всего использовать Функциональные опции (ФО). Посмотрим на преимущества этого подхода:

  1. Производительность: Платформа сама рассчитывает видимость элементов при открытии формы, не выполняя лишний программный код в модулях.
  2. Масштабируемость: Одна ФО может управлять видимостью полей сразу в десятках документов и отчетов.

Чтобы применить этот метод, достаточно в конфигураторе в свойстве элемента формы "Использование" указать соответствующую функциональную опцию.

Итоги и рекомендации

Выясним, какой метод выбрать в зависимости от задачи:

1. Нужно скрыть всю колонку или поле навсегда для текущего сеанса работы с документом — используйте Элементы.Имя.Видимость = Ложь в серверном коде.

2. Нужно скрыть данные в строках по условию — используйте Условное оформление.

3. Нужно скрыть поля в зависимости от прав доступа — используйте Пользовательскую видимость или роли — для этого есть конструктор настройки прав и видимости элементов формы.

4. Нужно скрыть поля на основе настроек программы — используйте Функциональные опции.

Важный совет: Старайтесь избегать частого переключения видимости в клиентских процедурах. Каждое изменение видимости заставляет платформу пересчитывать компоновку (AutoLayout) всей формы, что может привести к неприятному "мерцанию" интерфейса. Оптимально — выполнять все расчеты один раз на сервере перед выводом формы пользователю.

← На главную