Как исправить ошибку нарушения прав доступа при добавлении новой роли в BAS

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе с современными конфигурациями на базе BAS (Business Automation Software), такими как «Бухгалтерия для Украины 2.1» или аналогичные решения на базе БСП (Библиотеки стандартных подсистем), разработчики часто сталкиваются с ситуацией, когда добавление новой роли в Конфигураторе не дает ожидаемого результата. Даже если в роли проставлены полные права на все регистры и документы, пользователь при попытке проведения документа получает ошибку «Нарушение прав доступа». При этом в журнале регистрации фиксируются странные записи об отмене транзакций в регистрах Ключи доступа к объектам.

В этой статье мы подробно разберем, почему стандартных действий в Конфигураторе недостаточно, как работает современный механизм RLS (ограничение доступа на уровне записей) и что нужно сделать, чтобы новая роль корректно заработала в системе.

Причина проблемы: Производительный режим RLS и ключи доступа

В новых редакциях BAS используется так называемый «производительный режим» работы управления доступом. В отличие от старых версий 1С:Предприятия, где права проверялись «на лету» по сложным правилам в запросах, современный механизм БСП опирается на предварительно рассчитанные данные. Эти данные хранятся в специальных служебных регистрах:

Когда вы добавляете новую роль в Конфигураторе, система управления доступом в режиме «1С:Предприятие» еще ничего о ней не знает. Для БСП эта роль — «невидимка». Поскольку система не находит соответствующих ключей доступа для этой роли в своих внутренних таблицах, срабатывает программный запрет, даже если на уровне платформы доступ разрешен. Важно понимать: под полными правами ошибка не воспроизводится, так как для администраторов проверка через ключи доступа отключается на уровне кода конфигурации.

Шаг 1. Обновление идентификаторов объектов метаданных

Первое, что мы должны сделать после внесения изменений в структуру ролей или объектов в Конфигураторе — это заставить систему «увидеть» изменения. Для этого используются идентификаторы объектов метаданных. Если новая роль не зарегистрирована в справочнике Идентификаторы объектов метаданных, подсистема управления доступом не сможет с ней работать.

Проанализируем ситуацию: стандартные обработки обновления БСП могут выдавать ошибки вроде Переменная не определена (ФайловаяСистема) из-за специфических адаптаций BAS. Поэтому мы воспользуемся программным методом. Нам необходимо запустить обновление данных вручную. Для этого можно создать внешнюю обработку или воспользоваться консолью кода и выполнить следующий фрагмент:

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные(Истина);

Параметр Истина указывает системе на необходимость полной перезаписи и проверки существующих идентификаторов. После выполнения этого кода ваша новая роль появится в списке объектов, которыми может оперировать подсистема управления доступом.

Шаг 2. Регистрация роли через Профили групп доступа

Рассмотрим распространенную ошибку: назначение роли пользователю напрямую в Конфигураторе или через карточку пользователя в режиме «Предприятие» без использования профилей. В BAS такой подход работать не будет, так как не запустится механизм генерации ключей доступа.

Правильный алгоритм действий выглядит так:

  1. Перейдите в раздел Администрирование — Настройки пользователей и прав.
  2. Откройте справочник Профили групп доступа.
  3. Создайте новый профиль (например, «Дополнительные права по документам»).
  4. В списке ролей этого профиля найдите вашу новую роль и отметьте её флажком.
  5. Сохраните профиль. При записи профиля система инициализирует необходимые структуры.
  6. Создайте Группу доступа, выберите созданный профиль и добавьте в неё нужного пользователя.

Именно в момент записи Группы доступа система инициирует фоновое задание, которое начнет заполнять те самые «Ключи доступа», на отсутствие которых жаловался журнал регистрации.

Шаг 3. Принудительное обновление вспомогательных данных

Если после создания профиля ошибка сохраняется, значит, автоматическое обновление ключей не отработало или завершилось с ошибкой. Выясним причину и поможем системе обновить данные программно. Рассмотрим использование внутренних процедур БСП, которые отвечают за актуализацию прав.

Нам потребуется вызвать методы служебных модулей. Выполните следующий код в контексте сервера:


// Обновление состава наборов значений доступа
УправлениеДоступомСлужебный.ЗаполнитьСоставНаборовЗначенийДоступа();

// Обновление таблиц групп доступа, чтобы система пересчитала связи пользователей и ролей
УправлениеДоступомСлужебный.ОбновитьТаблицыГруппДоступа();

// Принудительный запуск обновления ключей после изменения метаданных
УправлениеДоступом.ОбновитьДанныеПослеИзмененияСоставаРолей();

Эти методы заставят систему пересмотреть права всех пользователей с учетом новой роли и сформировать недостающие записи в регистрах сведений Ключи доступа к объектам.

Почему не работают стандартные обработки БСП?

Разберем ситуацию, когда внешняя обработка ПроверкаВнедренияБСП.erf или ОбновлениеВспомогательныхДанных.epf выдает ошибку Переменная не определена (ФайловаяСистема). Это происходит потому, что в конфигурациях BAS (особенно версий 2.1 для локальных рынков) модули БСП могут иметь префиксы или быть частично изменены.

Совет: Вместо использования внешних обработок от «чистой» БСП, старайтесь использовать встроенные в вашу конфигурацию функции. Посмотрите в сторону общих модулей с именами УправлениеДоступом.... Если вам нужно запустить полное обновление всех ключей доступа «с нуля» (что может занять длительное время), используйте стандартную регламентную операцию обновления конфигурации, которая запускается при первом входе после обновления версии программы.

Резюме и выводы

Проанализировав проблему нарушения прав доступа в BAS, мы пришли к выводу, что одного лишь Конфигуратора недостаточно. Для успешного внедрения новой роли необходимо:

Соблюдение этого порядка действий гарантирует, что ваши кастомные роли будут работать корректно, а механизм RLS не будет блокировать легитимные действия пользователей.

← На главную