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