Почему возникает ошибка «Недопустимое значение параметра» при проверке роли пользователя в 1С?

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

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

Давайте подробно разберем, почему возникает эта ошибка и как ее правильно диагностировать и исправить, чтобы избежать подобных проблем в будущем.

Анализ проблемы: Имя роли и Синоним — в чем разница?

Основная причина ошибки кроется в фундаментальном различии между Именем роли и ее Синонимом в конфигураторе 1С. Этот нюанс часто упускают из виду, что и приводит к сбоям.

  1. Синоним роли — это ее представление для пользователя. Он может содержать пробелы, знаки препинания и быть написан на любом языке. Например, «Полные права», «Менеджер по продажам». Именно синоним мы видим в интерфейсе при настройке прав пользователей.
  2. Имя роли — это ее системный идентификатор в метаданных. Он используется для программного обращения к роли. Имя подчиняется строгим правилам именования идентификаторов в 1С: оно не может содержать пробелов, спецсимволов и не должно начинаться с цифры. Например, `ПолныеПрава`, `МенеджерПоПродажам`.

Когда в коде мы пытаемся проверить доступность роли, мы должны использовать именно ее Имя. Если по ошибке скопировать и вставить в код Синоним с пробелом, платформа не сможет найти объект метаданных с таким идентификатором и вернет ошибку «Недопустимое значение параметра».

В нашем примере проблема была в этой строке:


Если НЕ Пользователи.РолиДоступны("Полные права") Тогда
    ЭтаФорма.Элементы.Магазин.Доступность = Ложь;
КонецЕсли;

Здесь в качестве параметра передается строка "Полные права", которая является синонимом. Платформа не может обработать такой параметр, так как ожидает системное имя, например, "ПолныеПрава".

Хитрость полных прав: почему ошибка не возникала у администратора?

Самый коварный момент в этой ситуации — почему код с ошибкой прекрасно работал под администратором? Это связано с оптимизацией, заложенной в функции проверки прав в БСП.

Алгоритм работы функции Пользователи.РолиДоступны() (и аналогичных) устроен так:

  1. Сначала функция проверяет, обладает ли текущий пользователь ролью «Полные права» (или другой ролью, дающей неограниченный доступ, например «АдминистраторСистемы»).
  2. Если пользователь имеет полные права, функция немедленно возвращает Истина, даже не анализируя параметры, которые ей передали. Проверка имени роли просто не выполняется!
  3. И только если у пользователя нет полных прав, функция переходит к анализу переданного ей имени (или массива имен) роли, чтобы проверить их наличие у пользователя.

Именно на этом, третьем, шаге и возникала ошибка. Под обычным пользователем функция пыталась обработать некорректный параметр "Полные права" и аварийно завершалась. Этот эффект «маскировки» ошибки часто сбивает с толку и заставляет искать проблему в настройках прав доступа, а не в самом коде.

Пошаговое решение проблемы

Теперь, когда мы понимаем причины, исправить ошибку и написать надежный код не составит труда. Разберем шаги.

Шаг 1. Исправляем имя роли в коде

Первое, что нужно сделать — заменить синоним роли на ее системное имя. Откройте конфигуратор, найдите нужную роль в ветке `Общие -> Роли` и посмотрите ее свойство «Имя».

Неправильный код:


// Ошибка: используется синоним с пробелом
Если НЕ Пользователи.РолиДоступны("Полные права") Тогда
    // ...
КонецЕсли;

Правильный код:


// Правильно: используется системное имя (идентификатор)
Если НЕ Пользователи.РолиДоступны("ПолныеПрава") Тогда
    ЭтаФорма.Элементы.Магазин.Доступность = Ложь;
КонецЕсли;

После такого исправления код станет корректно работать для всех пользователей.

Шаг 2. Используем правильные методы БСП для проверки полных прав

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

Библиотека стандартных подсистем предоставляет специальный, более надежный метод для этой задачи — Пользователи.ЭтоПолноправныйПользователь(). Эта функция сама учитывает все нюансы и проверяет наличие у пользователя всех необходимых ролей.

Рекомендуемый вариант кода:


// Надежная проверка с использованием специальной функции БСП
Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
    ЭтаФорма.Элементы.Магазин.Доступность = Ложь;
КонецЕсли;

Такой подход делает ваш код более универсальным и устойчивым к обновлениям конфигурации. Вы абстрагируетесь от конкретных имен ролей и доверяете эту проверку механизмам БСП.

Совет по отладке: как быстро проверить существование роли

Если вы сомневаетесь, правильно ли указано имя роли, или существует ли она вообще в метаданных, есть простой способ это проверить. Можно использовать объект Метаданные. Выполните в отладчике на сервере или в окне «Вычислить выражение» следующий код:

Метаданные.Роли.Найти("ПолныеПрава")

Этот прием позволяет быстро диагностировать опечатки и не тратить время на поиски несуществующей проблемы в правах пользователя.

Подведем итог: ошибка «Недопустимое значение параметра» при проверке ролей — классический пример того, как важны детали. Всегда используйте в коде системные имена ролей без пробелов, а для стандартных проверок, таких как определение администратора, применяйте готовые функции БСП. Это сделает ваш код чище, надежнее и проще в поддержке.

← На главную