При работе с современными конфигурациями на базе BAS (Business Automation Software), такими как «Бухгалтерия для Украины 2.1» или аналогичные решения на базе БСП (Библиотеки стандартных подсистем), разработчики часто сталкиваются с ситуацией, когда добавление новой роли в Конфигураторе не дает ожидаемого результата. Даже если в роли проставлены полные права на все регистры и документы, пользователь при попытке проведения документа получает ошибку «Нарушение прав доступа». При этом в журнале регистрации фиксируются странные записи об отмене транзакций в регистрах Ключи доступа к объектам.
В этой статье мы подробно разберем, почему стандартных действий в Конфигураторе недостаточно, как работает современный механизм RLS (ограничение доступа на уровне записей) и что нужно сделать, чтобы новая роль корректно заработала в системе.
В новых редакциях BAS используется так называемый «производительный режим» работы управления доступом. В отличие от старых версий 1С:Предприятия, где права проверялись «на лету» по сложным правилам в запросах, современный механизм БСП опирается на предварительно рассчитанные данные. Эти данные хранятся в специальных служебных регистрах:
Ключи доступа к объектамКлючи доступа к регистрамПути к данным для строкового состава ключей доступаКогда вы добавляете новую роль в Конфигураторе, система управления доступом в режиме «1С:Предприятие» еще ничего о ней не знает. Для БСП эта роль — «невидимка». Поскольку система не находит соответствующих ключей доступа для этой роли в своих внутренних таблицах, срабатывает программный запрет, даже если на уровне платформы доступ разрешен. Важно понимать: под полными правами ошибка не воспроизводится, так как для администраторов проверка через ключи доступа отключается на уровне кода конфигурации.
Первое, что мы должны сделать после внесения изменений в структуру ролей или объектов в Конфигураторе — это заставить систему «увидеть» изменения. Для этого используются идентификаторы объектов метаданных. Если новая роль не зарегистрирована в справочнике Идентификаторы объектов метаданных, подсистема управления доступом не сможет с ней работать.
Проанализируем ситуацию: стандартные обработки обновления БСП могут выдавать ошибки вроде Переменная не определена (ФайловаяСистема) из-за специфических адаптаций BAS. Поэтому мы воспользуемся программным методом. Нам необходимо запустить обновление данных вручную. Для этого можно создать внешнюю обработку или воспользоваться консолью кода и выполнить следующий фрагмент:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные(Истина);
Параметр Истина указывает системе на необходимость полной перезаписи и проверки существующих идентификаторов. После выполнения этого кода ваша новая роль появится в списке объектов, которыми может оперировать подсистема управления доступом.
Рассмотрим распространенную ошибку: назначение роли пользователю напрямую в Конфигураторе или через карточку пользователя в режиме «Предприятие» без использования профилей. В BAS такой подход работать не будет, так как не запустится механизм генерации ключей доступа.
Правильный алгоритм действий выглядит так:
Именно в момент записи Группы доступа система инициирует фоновое задание, которое начнет заполнять те самые «Ключи доступа», на отсутствие которых жаловался журнал регистрации.
Если после создания профиля ошибка сохраняется, значит, автоматическое обновление ключей не отработало или завершилось с ошибкой. Выясним причину и поможем системе обновить данные программно. Рассмотрим использование внутренних процедур БСП, которые отвечают за актуализацию прав.
Нам потребуется вызвать методы служебных модулей. Выполните следующий код в контексте сервера:
// Обновление состава наборов значений доступа
УправлениеДоступомСлужебный.ЗаполнитьСоставНаборовЗначенийДоступа();
// Обновление таблиц групп доступа, чтобы система пересчитала связи пользователей и ролей
УправлениеДоступомСлужебный.ОбновитьТаблицыГруппДоступа();
// Принудительный запуск обновления ключей после изменения метаданных
УправлениеДоступом.ОбновитьДанныеПослеИзмененияСоставаРолей();
Эти методы заставят систему пересмотреть права всех пользователей с учетом новой роли и сформировать недостающие записи в регистрах сведений Ключи доступа к объектам.
Разберем ситуацию, когда внешняя обработка ПроверкаВнедренияБСП.erf или ОбновлениеВспомогательныхДанных.epf выдает ошибку Переменная не определена (ФайловаяСистема). Это происходит потому, что в конфигурациях BAS (особенно версий 2.1 для локальных рынков) модули БСП могут иметь префиксы или быть частично изменены.
Совет: Вместо использования внешних обработок от «чистой» БСП, старайтесь использовать встроенные в вашу конфигурацию функции. Посмотрите в сторону общих модулей с именами УправлениеДоступом.... Если вам нужно запустить полное обновление всех ключей доступа «с нуля» (что может занять длительное время), используйте стандартную регламентную операцию обновления конфигурации, которая запускается при первом входе после обновления версии программы.
Проанализировав проблему нарушения прав доступа в BAS, мы пришли к выводу, что одного лишь Конфигуратора недостаточно. Для успешного внедрения новой роли необходимо:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные(Истина).Ключи доступа к объектам. Если записей нет — используйте вызовы процедур модуля УправлениеДоступомСлужебный.Соблюдение этого порядка действий гарантирует, что ваши кастомные роли будут работать корректно, а механизм RLS не будет блокировать легитимные действия пользователей.