В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача динамического изменения интерфейса. Одним из наиболее востребованных сценариев является программное добавление колонок в таблицы управляемых форм. Однако программисты часто сталкиваются с дилеммой: как сделать так, чтобы колонка не загромождала интерфейс у всех пользователей сразу, но при этом была доступна для включения через стандартный механизм «Изменить форму» для тех, кому она действительно необходима? В этой статье мы подробно разберем, как правильно управлять видимостью программных элементов и в чем заключаются типичные ошибки.
Рассмотрим ситуацию, с которой столкнулся автор темы. При программном создании элемента формы (колонки) разработчик устанавливает свойство Видимость в значение Ложь, рассчитывая, что пользователь сможет зайти в настройки формы и поставить заветную «галочку». Однако платформа работает иначе.
Разберем механизм работы свойства Видимость (Visibility): если на сервере при создании формы это свойство установлено в Ложь, платформа вообще не передает информацию об этом элементе клиенту. Для клиентского приложения этого элемента не существует в иерархии формы. Следовательно, в окне «Изменить форму» данный элемент просто отсутствует в списке доступных. Это поведение оптимизирует трафик и производительность, но делает невозможным пользовательское управление элементом.
Для реализации гибкого управления нам необходимо использовать другой механизм — «Пользовательская видимость». Это свойство позволяет элементу существовать в составе формы, но быть скрытым по умолчанию. Проанализируем, как это реализовать программно.
У каждого элемента управляемой формы существует коллекция ПользовательскаяВидимость. В отличие от обычного булева свойства, это объект, который позволяет настраивать видимость для разных ролей или для всех пользователей сразу. Посмотрим на алгоритм реализации:
Видимость в значение Истина.ПользовательскаяВидимость для скрытия колонки «по умолчанию».Рассмотрим пример кода, который выполняет эти действия в процедуре ПриСозданииНаСервере:
// 1. Описываем новый реквизит
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("СпецКолонка", Новый ОписаниеТипов("Строка"), "Объект.Товары", "Спец. данные", Истина));
// 2. Изменяем состав реквизитов формы
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
// 3. Добавляем элемент формы (колонку в таблицу)
НовыйЭлемент = Элементы.Добавить("ТоварыСпецКолонка", Тип("ПолеФормы"), Элементы.Товары);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.СпецКолонка";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
// 4. Настраиваем видимость
НовыйЭлемент.Видимость = Истина; // Обязательно Истина, чтобы элемент попал в "Изменить форму"
НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Ложь);
После выполнения такого кода колонка будет добавлена на форму, но скрыта у всех пользователей. При этом в меню «Еще — Изменить форму» пользователь увидит новую колонку в списке и сможет самостоятельно включить её отображение.
Рассмотрим ситуацию, когда список пользователей, которым колонка должна быть видна сразу, хранится в базе данных (например, в Регистре Сведений). Как правильно организовать проверку? Проанализируем вариант с использованием регистра настроек, предложенный в обсуждении.
Создадим условный РегистрСведений.НастройкиПользователей с измерением Пользователь и ресурсом ПоказыватьСпецДанные (Булево). Тогда в коде формы мы сможем более гибко управлять настройками:
// Проверяем настройку текущего пользователя в регистре
НужноПоказывать = РегистрыСведений.НастройкиПользователей.ПолучитьЗначениеНастройки(ПараметрыСеанса.ТекущийПользователь);
Если НужноПоказывать Тогда
// Для этого пользователя включаем видимость сразу
НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Истина);
Иначе
// Для остальных скрываем, но оставляем возможность включить вручную
НовыйЭлемент.ПользовательскаяВидимость.УстановитьВидимостьВсем(Ложь);
КонецЕсли;
Выясним, существуют ли другие способы управления видимостью без прямого обращения к свойствам элемента. Одним из таких методов является Условное оформление формы. Этот способ хорош тем, что он работает на уровне декларативных правил платформы.
Мы можем программно добавить элемент условного оформления, который будет скрывать колонку. При этом колонка остается в списке доступных элементов настроек формы. Рассмотрим шаги реализации:
УсловноеОформление.Видимость и устанавливаем его в Ложь.Этот метод считается более «тяжелым» для платформы, так как расчет оформления происходит динамически, но он незаменим, когда нужно скрывать или показывать данные в зависимости от значений в строках таблицы.
Разберем критически важный момент, который часто упускают разработчики. Управление видимостью на уровне формы (через Видимость или ПользовательскаяВидимость) — это интерфейсное решение, а не средство защиты информации.
Важно помнить: если пользователю запрещено видеть данные по соображениям безопасности, простого скрытия колонки недостаточно. Опытный пользователь может:
Если данные действительно конфиденциальны, необходимо ограничивать их получение на уровне сервера. Например, если пользователю не положено видеть колонку «Себестоимость», то в коде ПриСозданииНаСервере нужно не просто скрывать колонку, а не заполнять программный реквизит данными или использовать механизм RLS (Record Level Security).
Подведем итог нашему исследованию. Для того чтобы программно добавленная колонка была управляемой со стороны пользователя через меню «Изменить форму», необходимо:
Видимость в значение Истина.ПользовательскаяВидимость и метод УстановитьВидимостьВсем(Ложь).Такой подход обеспечивает гибкость интерфейса, снижает нагрузку на программиста по поддержке «хотелок» пользователей и сохраняет стандартную эргономику решений на платформе 1С.