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