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