Почему функция РольДоступна() возвращает Ложь для пользователя с новой ролью в УНФ 3.0 и как это исправить?

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

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

Разберем причину: Особенности БСП и «Полные права»

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

Выясним причину глубже: БСП использует механизм Идентификаторов объектов метаданных. Если вы добавили роль в конфигураторе, но не обновили данные в справочнике идентификаторов в режиме «Предприятие», программные методы проверки могут не увидеть новую роль. Кроме того, в современных версиях 1С состав доступных ролей пользователя формируется динамически. Иногда возникают сценарии, когда при изменении состава профиля 1С не запускает автоматическое обновление, и в этом случае может помочь точечный пересчет прав доступа для пользователя или группы.

Решение 1: Использование программного интерфейса БСП

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


// Вместо стандартной проверки:
// Если Не РольДоступна("мРедактированиеСтоимостиДоставки") Тогда

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

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

Решение 2: Принудительное обновление справочников метаданных

Если роль назначена, но система ее «не видит» даже для обычного пользователя, необходимо убедиться, что справочник ИдентификаторыОбъектовМетаданных актуален. Разберем по шагам, как это сделать:

  1. Запустите информационную базу в режиме «Предприятие» с параметром командной строки /С ЗапуститьОбновлениеИнформационнойБазы.
  2. Если это не помогло, воспользуйтесь консолью разработчика или специальной обработкой из состава БСП «Обновление вспомогательных данных», чтобы перечитать состав метаданных.
  3. Проверьте, появилась ли ваша роль в списке при создании или редактировании Профиля групп доступа. Чтобы быстро понять, в какие профили уже включена роль, используйте отчет по списку профилей с отбором по роли.

Решение 3: Комбинированная проверка прав в коде

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


// Проверяем наличие конкретной роли или наличие полных прав
Если Не (РольДоступна("мРедактированиеСтоимостиДоставки") Или РольДоступна("ПолныеПрава")) Тогда
    Элементы.СтоимостьДоставки.Доступность = Ложь;
КонецЕсли;

Этот метод считается «классическим» для обхода проблем с видимостью ролей у администраторов в самописных участках кода. Однако помните, что в БСП правильнее доверять общим модулям подсистемы Пользователи.

Решение 4: Альтернатива через «Дополнительные права пользователей»

Рассмотрим более гибкий вариант, который часто применяется в УНФ 3.0. Вместо создания новых ролей в дереве метаданных (что усложняет поддержку и обновление конфигурации), можно использовать механизм дополнительных прав. Это позволяет настраивать доступ к конкретным полям или действиям через пользовательский интерфейс без изменения структуры ролей.

Выясним, как это реализовать:

  1. Добавьте новый элемент в план видов характеристик ДополнительныеПраваПользователей.
  2. В коде формы проверяйте значение этого права для текущего пользователя.
  3. Настраивайте доступ в режиме «Предприятие» в разделе «Настройки — Настройки пользователей и прав».

Такой подход позволяет избежать проблем с функцией РольДоступна() и дает администратору возможность гибко управлять правами, не заходя в конфигуратор.

Рекомендации по реализации в УНФ 3.0

Подведем итог нашему анализу. Если вы решили продолжать работу с ролями, выполните следующие действия:

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

Помните, что УНФ 3.0 активно использует механизм функциональных опций и параметров сеанса. Если проверка прав должна выполняться часто (например, при открытии каждой строки в списке), рассмотрите вариант записи наличия прав в параметр сеанса при начале работы системы. Это значительно ускорит работу интерфейса, так как проверка булевого значения в памяти быстрее, чем обращение к серверу для проверки метаданных роли.

← На главную