Каждый разработчик или системный администратор 1С рано или поздно сталкивается с загадочным поведением платформы: при настройке ролей пользователя непосредственно в Конфигураторе, через некоторое время все внесенные изменения бесследно исчезают. Более того, попытка вручную проставить галочки у администратора системы ни к чему не приводит — при первой же синхронизации или перезаписи пользователя список ролей снова очищается. В этой статье мы подробно разберем, почему так происходит, изучим внутренние механизмы Библиотеки стандартных подсистем (БСП) и научимся правильно управлять правами доступа, избегая досадных ошибок в коде.
Для того чтобы понять логику работы системы, нам необходимо принять главное правило современных конфигураций 1С, построенных на базе БСП: управление пользователями и их правами полностью переносится в режим «1С:Предприятие». Конфигуратор в данном случае выступает лишь в роли ведомого исполнителя.
Давайте проанализируем, как связаны сущности в системе:
Пользователи. Каждая запись в этом справочнике ссылается на реального пользователя информационной базы (ИБ) в Конфигураторе.ИдентификаторПользователяИБ.Выясним причину, по которой затираются проставленные вручную роли. БСП запускает механизмы синхронизации (перезаписи) ролей пользователя ИБ «поверх» конфигуратора в следующие моменты:
Пользователи в режиме «1С:Предприятие» и нажимает кнопку «Записать», пустой или измененный набор настроек из интерфейса мгновенно транслируется в Конфигуратор, затирая все ручные правки.ОбновитьРолиПользователей в общем модуле УправлениеДоступомСлужебный.Таким образом, Конфигуратор постоянно приводится в соответствие с данными, хранящимися в регистрах и справочниках подсистемы управления доступом БСП.
Рассмотрим частный, но наиболее распространенный случай. Вы создали новую роль (например, для работы с новым расширением) и хотите назначить ее главному администратору. Вы открываете Конфигуратор, отмечаете эту роль галочкой у пользователя, но после его входа в систему роль пропадает.
Это стандартное, жестко заложенное поведение БСП, связанное с оптимизацией производительности:
ПолныеПрава и АдминистраторСистемы (или Администрирование).ПолныеПрава по умолчанию дает неограниченный доступ ко всем объектам метаданных в обход любых ограничений RLS (Row Level Security), БСП считает избыточным хранить другие роли в профиле этого пользователя.Если мы создали новую роль в Конфигураторе, нам нужно сделать так, чтобы БСП «увидела» ее в режиме «1С:Предприятие» и позволила добавить в нужный профиль групп доступа. Разберем этот процесс по шагам:
ИдентификаторыОбъектовМетаданных. Для этого запустите базу в режиме «1С:Предприятие» с параметром командной строки:
/C ЗапуститьОбновлениеИнформационнойБазы
Или воспользуйтесь специализированной обработкой из состава БСП: ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf.Описанный выше механизм затирания ролей у администраторов создает серьезную проблему для разработчиков, которые используют классические платформенные методы проверки прав.
Посмотрим на классический пример проверки, который часто приводит к ошибкам в конфигурациях на БСП:
// ПРИМЕР КОДА С ОШИБКОЙ
Если РольДоступна("ИнтерактивноеОткрытиеВнешнихОбработок") Тогда
// Выполняем действие, доступное только этой роли
Иначе
ВызватьИсключение "Доступ запрещен!";
КонецЕсли;
В чем заключается проблема? Если данный код выполняется под пользователем с полными правами (Администратором), то платформенная функция РольДоступна() вернет значение Ложь! Происходит это потому, что БСП физически стерла у администратора эту роль в Конфигураторе, оставив только ПолныеПрава. В результате администратор системы парадоксальным образом теряет доступ к функционалу, который открыт обычному пользователю.
Чтобы избежать подобных багов, по стандартам разработки 1С необходимо использовать функции БСП. Перепишем этот код правильно:
// ПРАВИЛЬНЫЙ ВАРИАНТ ПРОВЕРКИ
Если Пользователи.РолиДоступны("ИнтерактивноеОткрытиеВнешнихОбработок") Тогда
// Данный блок кода успешно выполнится и для Администратора, и для обычного пользователя с этой ролью
Иначе
ВызватьИсключение "Доступ запрещен!";
КонецЕсли;
Давайте проанализируем, как работает функция Пользователи.РолиДоступны() изнутри:
Пользователи.ЭтоПолноправныйПользователь().Истина**, независимо от того, отмечена ли проверяемая роль в Конфигураторе физически.Для успешной и бесконфликтной работы с правами в современных конфигурациях 1С всегда придерживайтесь правила: все настройки прав производятся исключительно в режиме «1С:Предприятие» через профили и группы доступа. Забудьте о ручном редактировании ролей пользователей в Конфигураторе, а при написании программного кода всегда используйте метод Пользователи.РолиДоступны() вместо устаревшего РольДоступна(). Это убережет вашу систему от неожиданных сбоев и обеспечит корректную работу прав для всех категорий пользователей.