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