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