Как программно добавить колонку на форму и управлять её видимостью так, чтобы пользователи могли включать её самостоятельно

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

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

Анализ проблемы: почему «Видимость = Ложь» не работает

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

Разберем механизм работы свойства Видимость (Visibility): если на сервере при создании формы это свойство установлено в Ложь, платформа вообще не передает информацию об этом элементе клиенту. Для клиентского приложения этого элемента не существует в иерархии формы. Следовательно, в окне «Изменить форму» данный элемент просто отсутствует в списке доступных. Это поведение оптимизирует трафик и производительность, но делает невозможным пользовательское управление элементом.

Решение через использование «Пользовательской видимости»

Для реализации гибкого управления нам необходимо использовать другой механизм — «Пользовательская видимость». Это свойство позволяет элементу существовать в составе формы, но быть скрытым по умолчанию. Проанализируем, как это реализовать программно.

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

  1. Создаем реквизит формы (если его нет в объекте).
  2. Создаем элемент формы (колонку) и связываем его с реквизитом.
  3. Устанавливаем основное свойство Видимость в значение Истина.
  4. Используем методы коллекции ПользовательскаяВидимость для скрытия колонки «по умолчанию».

Рассмотрим пример кода, который выполняет эти действия в процедуре ПриСозданииНаСервере:


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

// 2. Изменяем состав реквизитов формы
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

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

// 4. Настраиваем видимость
НовыйЭлемент.Видимость = Истина; // Обязательно Истина, чтобы элемент попал в "Изменить форму"
НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Ложь);

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

Динамическое управление видимостью на основе настроек

Рассмотрим ситуацию, когда список пользователей, которым колонка должна быть видна сразу, хранится в базе данных (например, в Регистре Сведений). Как правильно организовать проверку? Проанализируем вариант с использованием регистра настроек, предложенный в обсуждении.

Создадим условный РегистрСведений.НастройкиПользователей с измерением Пользователь и ресурсом ПоказыватьСпецДанные (Булево). Тогда в коде формы мы сможем более гибко управлять настройками:


// Проверяем настройку текущего пользователя в регистре
НужноПоказывать = РегистрыСведений.НастройкиПользователей.ПолучитьЗначениеНастройки(ПараметрыСеанса.ТекущийПользователь);

Если НужноПоказывать Тогда
    // Для этого пользователя включаем видимость сразу
    НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Истина);
Иначе
    // Для остальных скрываем, но оставляем возможность включить вручную
    НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Ложь);
КонецЕсли;

Альтернативный метод: Условное оформление

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

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

  1. Программно добавляем элемент в коллекцию УсловноеОформление.
  2. В качестве оформляемого поля указываем нашу колонку.
  3. В качестве оформления выбираем свойство Видимость и устанавливаем его в Ложь.
  4. Условие можно сделать всегда истинным или привязать к какому-то скрытому реквизиту формы.

Этот метод считается более «тяжелым» для платформы, так как расчет оформления происходит динамически, но он незаменим, когда нужно скрывать или показывать данные в зависимости от значений в строках таблицы.

Важные нюансы и безопасность данных

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

Важно помнить: если пользователю запрещено видеть данные по соображениям безопасности, простого скрытия колонки недостаточно. Опытный пользователь может:

Если данные действительно конфиденциальны, необходимо ограничивать их получение на уровне сервера. Например, если пользователю не положено видеть колонку «Себестоимость», то в коде ПриСозданииНаСервере нужно не просто скрывать колонку, а не заполнять программный реквизит данными или использовать механизм RLS (Record Level Security).

Заключение

Подведем итог нашему исследованию. Для того чтобы программно добавленная колонка была управляемой со стороны пользователя через меню «Изменить форму», необходимо:

Такой подход обеспечивает гибкость интерфейса, снижает нагрузку на программиста по поддержке «хотелок» пользователей и сохраняет стандартную эргономику решений на платформе 1С.

← На главную