При доработке типовых конфигураций или разработке собственной функциональности часто возникает задача: отображать добавленные элементы формы только тогда, когда в системе включена соответствующая настройка (булева константа). Если настройка выключена, доработанные реквизиты, поля или целые панели должны быть скрыты от пользователя.
Разберем детально, как реализовать подобное поведение в обычном и управляемом приложении, как избежать лишних обращений к базе данных и корректно настроить права доступа.
Проанализируем базовый способ, который часто применяется в обычном приложении. В процедуре при открытии формы или инициализации интерфейса считывается значение константы и передается в свойство элемента управления.
Посмотрим на пример прямой установки свойства Видимость:
Процедура ПриОткрытии()
// Устанавливаем видимость элемента напрямую из значения константы
ЭлементыФормы.ПолеДоработки.Видимость = Константы.ИспользоватьДоработку.Получить();
КонецПроцедуры
Для сокращения кода можно передавать значение константы напрямую, так как метод Получить() для булевой константы возвращает значение типа Булево (Истина или Ложь). Использование тернарного оператора ?(Константы.Имя.Получить(), Истина, Ложь) или явного сравнения Если ... = Истина в данном случае является избыточным.
Вызов метода Константы.ИмяКонстанты.Получить() при каждом открытии любой формы выполняет отдельный запрос к базе данных. Если форма открывается часто десятками пользователей, это создает ненужную нагрузку на СУБД. Рассмотрим, как оптимизировать чтение настройки.
Посмотрим на пример реализации кэширующей функции:
// В общем модуле с повторным использованием на время сеанса
Функция ИспользоватьДоработку() Экспорт
Возврат Константы.ИспользоватьДоработку.Получить();
КонецФункции
Теперь в модуле формы вызов будет обращаться к кэшу сеанса, не нагружая базу данных:
Процедура ПриОткрытии()
ЭлементыФормы.ПолеДоработки.Видимость = МойОбщийМодульПовтИсп.ИспользоватьДоработку();
КонецПроцедуры
Разберем по шагам реализацию через параметр сеанса:
// В модуле сеанса
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры.Найти("ИспользоватьДоработку") <> Неопределено Тогда
ПараметрыСеанса.ИспользоватьДоработку = Константы.ИспользоватьДоработку.Получить();
КонецЕсли;
КонецПроцедуры
// В модуле формы
Процедура ПриОткрытии()
ЭлементыФормы.ПолеДоработки.Видимость = ПараметрыСеанса.ИспользоватьДоработку;
КонецПроцедуры
Если разработка ведется на управляемых формах или в конфигурации активно задействованы механизмы платформы 1С:Предприятие 8.3, наиболее правильным архитектурным решением является использование Функциональных опций.
Разберем порядок настройки:
Булево).Хранилище.ИспользованиеФункциональныхОпций.При таком подходе платформа автоматически скрывает связанные элементы интерфейса и исключает реквизиты из передачи на клиент, не требуя написания ручного кода видимости на формах.
Выясним важную деталь работы обычного приложения: при программной установке Видимость = Ложь элемент скрывается, но соседние элементы не сдвигаются автоматически (в отличие от управляемых форм). В результате на форме может образоваться пустое место.
Для красивого оформления интерфейса применяют следующие приемы:
Панель) или дополнительной вкладке. Скрывается или показывается панель целиком.Доступность = Ложь.При работе с константами важно учитывать два технических нюанса:
Константы.Имя.Получить() вызовет ошибку доступа. Чтобы избежать этого, чтение константы следует выполнять в Привилегированном общем модуле либо использовать конструкцию УстановитьПривилегированныйРежим(Истина).ОсвежитьПовторноИспользуемыеЗначения().