Как правильно проверить роль пользователя из клиентского кода в расширении 1С?

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

При разработке на управляемых формах 1С мы часто сталкиваемся с необходимостью ограничить видимость или доступность элементов интерфейса в зависимости от прав текущего пользователя. Однако попытка прямой проверки прав на клиенте нередко приводит к ошибкам. Рассмотрим, как правильно организовать проверку функции РольДоступна, особенно в рамках использования расширений конфигурации.

Выясним причину ошибки

Основная проблема заключается в том, что функция РольДоступна является строго серверной. Она работает с контекстом сеанса, который существует только на сервере 1С. Когда мы пытаемся вызвать ее из модуля, помеченного директивой &НаКлиенте, платформа выдает ошибку: «Процедура или функция с указанным именем не определена». На стороне клиента просто нет доступа к системной информации о ролях пользователя.

Разделим логику на клиентскую и серверную

Для корректной работы приложения в 1С принято разделять логику на клиентскую (интерфейс) и серверную (бизнес-логика, работа с данными). В расширениях конфигурации это разделение становится критически важным для стабильной компиляции. Рассмотрим по шагам, как настроить общие модули:

  1. Создайте два отдельных общих модуля: один для клиентских вызовов, другой — для серверных.
  2. Для серверного модуля установите следующие флаги в конфигураторе: Сервер, Вызов сервера.
  3. Клиентскому модулю достаточно флага Клиент.

Такая архитектура позволяет безопасно обращаться к серверным методам из любого места клиентского кода, не создавая конфликтов в профилях безопасности расширения.

Пример реализации проверки роли

Давайте посмотрим, как это выглядит на практике. В серверном модуле Мой_ОбщегоНазначенияСервер создадим функцию, которая будет выполнять проверку:


// В свойствах модуля установлены флаги: Сервер, Вызов сервера
Функция ПроверитьНаличиеРолиПятница() Экспорт
    Возврат РольДоступна("Пятничка");
КонецФункции

Теперь из любого клиентского модуля, например, модуля формы, мы можем вызвать этот метод. Благодаря тому, что модуль имеет флаг Вызов сервера, платформа сама обеспечит передачу управления на сервер:


// Код на клиенте
&НаКлиенте
Процедура ПриОткрытии()
    Если Мой_ОбщегоНазначенияСервер.ПроверитьНаличиеРолиПятница() Тогда
        Элементы.КнопкаВыполнения.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры

Особенности работы в расширениях

При работе в расширениях важно помнить о следующих нюансах:


&НаКлиенте
Перем ДоступРазрешен;

&НаКлиенте
Процедура ПриОткрытии()
    ДоступРазрешен = Мой_ОбщегоНазначенияСервер.ПроверитьНаличиеРолиПятница();
    // Дальше используем локальную переменную
КонецПроцедуры

Резюме

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

← На главную