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