Как программно скрыть колонки таблицы, сохранив возможность их включения пользователем через «Изменить форму»?

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

При разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача динамического управления интерфейсом. Одной из специфических проблем является программное добавление элементов (например, колонок таблицы) с требованием скрыть их «по умолчанию», но оставить пользователю право самостоятельно вывести их на экран через стандартный механизм «Изменить форму». Для стандартизации подобных задач существуют готовые модули, содержащие функции для программного изменения форм.

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

В чем заключается основная проблема?

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

  1. Элемент физически не передается на клиентскую сторону.
  2. В диалоге «Изменить форму» этот элемент исчезает из списка доступных.
  3. Пользователь не может вернуть колонку на экран, пока программист не изменит код или не воспользуется специальными инструментами, такими как редактор форм в режиме предприятия.

Свойство «Пользовательская видимость», которое мы привыкли видеть в конфигураторе, представляет собой статичную матрицу прав. В программной модели (Runtime) этого свойства просто не существует. Выясним, какие альтернативные пути позволяют добиться нужного результата.

Решение №1: Использование Условного оформления формы

Это самый элегантный и рекомендуемый метод. Суть заключается в том, что мы оставляем свойство Видимость самого элемента в значении Истина, но накладываем на него правило Условного оформления, которое скрывает колонку визуально. Поскольку сам элемент считается «видимым» для системы, он остается доступным в настройках формы.

Разберем по шагам, как это реализовать программно:


// В процедуре ПриСозданииНаСервере
НоваяКолонка = Элементы.Добавить("СкрытаяКолонка", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.ИмяРеквизита";
НоваяКолонка.Видимость = Истина; // Обязательно Истина!

// Теперь добавим правило условного оформления, чтобы скрыть её по умолчанию
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

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

// 2. Условие можно не задавать (будет действовать всегда) или задать фиктивное
// В данном случае колонка будет скрыта программно, но доступна в "Изменить форму"

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

Решение №2: Программная установка настроек формы

Если нам нужно именно имитировать «пользовательский выбор», мы можем вмешаться в механизм хранения настроек. Платформа 1С хранит состояние формы (расположение, видимость, порядок) в специальном хранилище. Мы можем программно сформировать структуру настроек и применить её.

Посмотрим на пример логики работы с настройками:


// Этот метод сложнее, так как требует работы со структурой настроек
// Мы можем получить текущие настройки, изменить их и записать обратно
НастройкиФормы = ЭтаФорма.ПолучитьНастройкиДанныхФормы();

// Здесь происходит манипуляция с деревом настроек
// (Нужно найти элемент и установить ему свойство Видимость)
// Важно: это работает только для уже существующих в структуре элементов

ЭтаФорма.УстановитьНастройкиДанныхФормы(НастройкиФормы);

Однако стоит учитывать, что работа с ХранилищеОбщихНастроек или прямая манипуляция настройками формы — это путь, требующий осторожности, так как структура настроек может измениться при обновлении платформы.

Решение №3: Управление видимостью через группы

Рассмотрим еще один интересный нюанс. Если поместить программно созданные колонки в Группу формы, можно управлять видимостью всей группы. Иногда поведение диалога «Изменить форму» отличается для элементов внутри групп. Но для табличных частей этот метод менее надежен, чем использование условного оформления.

Почему не стоит использовать свойство «ТолькоВоФронтенде»?

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

Резюме и рекомендации

Проанализировав все доступные способы, мы можем сделать следующие выводы:

  1. Прямого программного аналога галочки «Пользовательская видимость» из конфигуратора для рантайма не существует.
  2. Использование Элемент.Видимость = Ложь в коде — это «жесткое» скрытие без возможности восстановления пользователем.
  3. Условное оформление — оптимальный инструмент для программно создаваемых элементов. Оно позволяет гибко управлять визуальным отображением, не ломая функционал пользовательской кастомизации.

Для более глобального контроля существуют готовые расширения, позволяющие как настроить доступность элементов для пользователей, так и принудительно открыть все элементы на форме для анализа и отладки.

Применяя эти знания, вы сможете создавать интерфейсы, которые одновременно являются динамическими и дружелюбными к конечному пользователю, предоставляя ему привычные инструменты управления рабочим пространством.

← На главную