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