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

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

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

Ситуация, которую описывает автор, является типовой для разработчиков, работающих с механизмом ролей и прав доступа в 1С. Стек вызовов, предоставленный в сообщении, четко указывает на место возникновения ошибки:


{ОбщийМодуль.Пользователи.Модуль(209)}:      Если РольДоступна(СокрЛП(ИмяРоли)) Тогда // Не заменять на РолиДоступны.
{ОбщийМодуль.ижтисиБухгалтерия.Модуль(267)}:    ЕстьПраво = Пользователи.РолиДоступны("ижтисиБухгалтерскиеДанные");
{Документ.ЗаданиеНаРаботу.Форма.ФормаДокумента.Форма(2436)}:    РольБухгалтерииДоступна = ижтисиБухгалтерия.РольБухгалтерииДоступна();
{Документ.ЗаданиеНаРаботу.Форма.ФормаДокумента.Форма(104)}:    ДобавитьКомандыДействий();

Эта ошибка указывает на то, что функция РольДоступна() получила параметр, который она не может обработать. В данном контексте, параметр номер '1' — это имя роли.

Выясняем причину ошибки: некорректное имя роли и изменение поведения платформы 8.3

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

  1. Опечатки в имени роли.
  2. Несоблюдения регистра (хотя обычно 1С нечувствительна к регистру в именах метаданных, но лучше всегда соблюдать).
  3. Наличия лишних пробелов в начале или конце строки (для этого в коде и используется СокрЛП(), но это не всегда спасает от внутренних пробелов).
  4. Отсутствия роли в метаданных конфигурации, например, если роль была удалена или переименована, а код не обновили.

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

Шаги по устранению ошибки

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

1. Проверяем корректность имени роли

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

  1. Сверьте имя: Убедитесь, что строка, передаваемая в функцию (например, "ижтисиБухгалтерскиеДанные" из стека), точно совпадает с именем роли в конфигураторе.
  2. Проверьте регистр: Хотя 1С обычно нечувствительна к регистру для имен метаданных, лучше всегда придерживаться точного написания.
  3. Удалите лишние пробелы: Даже если вы используете СокрЛП(), убедитесь, что в исходной строке нет внутренних или невидимых символов.

2. Используем объект Метаданные для получения имени роли

Наиболее надежный и рекомендуемый способ избежать подобных ошибок — это обращаться к именам ролей через объект Метаданные. Это гарантирует, что мы используем имя роли, которое существует в конфигурации, и позволяет платформе на этапе компиляции или конфигурации проверять корректность ссылки. Если вы переименуете роль, платформа сообщит об ошибке в местах, где используется такая ссылка.

Вместо жестко закодированной строки, например, "ижтисиБухгалтерскиеДанные", мы можем использовать:


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

// Правильно и надежно
Если Пользователи.РолиДоступны(Метаданные.Роли.ижтисиБухгалтерскиеДанные.Имя) Тогда
    // ...
КонецЕсли;

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

3. Предварительная проверка существования роли в 1С 8.3

Для предотвращения ошибки «Недопустимое значение параметра» в платформе 8.3 при использовании РольДоступна(), особенно если имя роли формируется динамически или может быть опциональным, мы можем предварительно проверить наличие роли в метаданных.

Мы используем метод Найти() для объекта Метаданные.Роли. Если роль не найдена, то вызов РольДоступна() можно пропустить или обработать иным образом.


ИмяПроверяемойРоли = "ИмяНесуществующейИлиНовойРоли";

// Предварительная проверка наличия роли
Если Метаданные.Роли.Найти(ИмяПроверяемойРоли) <> Неопределено Тогда
    // Роль существует, можно безопасно вызывать РольДоступна()
    Если РольДоступна(ИмяПроверяемойРоли) Тогда
        // Код, выполняемый при наличии и доступности роли
    КонецЕсли;
Иначе
    // Роль с таким именем не найдена в метаданных
    // Обработка ситуации: например, вывести сообщение, записать в журнал и т.д.
    Сообщить("Внимание! Роль '" + ИмяПроверяемойРоли + "' не найдена в метаданных конфигурации. Проверка прав невозможна.");
КонецЕсли;

4. Используем рекомендованные функции для проверки прав (БСП и ПравоДоступа)

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

Проверка прав с помощью ПравоДоступа()

В большинстве случаев, когда роль предоставляет права на объекты метаданных (например, на чтение, изменение документа, справочника), вместо прямой проверки доступности роли РольДоступна() рекомендуется использовать метод ПравоДоступа(). Этот метод более устойчив к изменениям состава ролей, так как он проверяет наличие конкретного права на конкретный объект метаданных, а не факт наличия самой роли.

Например, если нам нужно проверить, есть ли у пользователя право на чтение документа «Задание на работу», мы можем использовать:


Если ПравоДоступа("Просмотр", Метаданные.Документы.ЗаданиеНаРаботу) Тогда
    // У пользователя есть право на просмотр документа "ЗаданиеНаРаботу"
    // Выполняем действия, доступные для пользователей с этим правом
Иначе
    // У пользователя нет права на просмотр
КонецЕсли;

Метод ПравоДоступа() позволяет проверять различные типы прав, такие как "Просмотр", "Редактирование", "Добавление", "Удаление", "Вывод" и другие, что делает его очень гибким инструментом для управления доступом на уровне объектов.

Использование Пользователи.РолиДоступны() из Библиотеки стандартных подсистем (БСП)

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

В коде автора уже используется этот общий модуль:

ЕстьПраво = Пользователи.РолиДоступны("ижтисиБухгалтерскиеДанные");

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

Пример использования с проверкой через Метаданные.Роли для повышения надежности:


// ИмяРолиДляПроверки = "ижтисиБухгалтерскиеДанные";
ИмяРолиДляПроверки = Метаданные.Роли.ижтисиБухгалтерскиеДанные.Имя; // Более надежный способ

Если Пользователи.РолиДоступны(ИмяРолиДляПроверки) Тогда
    // Код, выполняемый если роль доступна
Иначе
    // Код, выполняемый если роль недоступна
КонецЕсли;

Контекст выполнения функции РольДоступна()

Мы также должны помнить о контексте выполнения. Функция РольДоступна() доступна на сервере, в толстом клиенте, во внешнем соединении и в мобильном приложении (серверный вызов). Если она будет вызвана в клиентском контексте, где она недоступна (например, напрямую в клиентской процедуре управляемой формы без обращения к серверу), это приведет к другой ошибке: «Процедура или функция с указанным именем не определена». Однако, в нашем случае, судя по стеку вызовов, проблема связана именно с некорректным параметром, а не с контекстом выполнения.

Рекомендации для работы с ролями в управляемом приложении

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

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

Итоговое решение

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

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

Применение этих подходов позволит нам эффективно устранить ошибку и создать более надежный и устойчивый код для управления правами доступа в 1С:Предприятии.

← На главную