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