В практике сопровождения решений на платформе 1С (в частности, 1С:ERP Управление предприятием 2, КА 2, УТ 11) администраторы и программисты нередко сталкиваются с двумя взаимосвязанными аномалиями: периодическим сбросом назначенных ролей у сотрудников и внезапным исчезновением практически всех пользователей информационной базы после штатной реструктуризации метаданных. Проанализируем природу обеих проблем и разберем по шагам действенные методы восстановления доступа.
Выясним причину, по которой у учетных записей произвольно исчезают права. В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), администрирование прав кардинально отличается от классического подхода платформы 1С:Предприятие 8.2.
Состав ролей каждого объекта ПользовательИнформационнойБазы рассчитывается динамически. Он формируется программными алгоритмами БСП исключительно на основе элементов справочников Группы доступа и Профили групп доступа в режиме «1С:Предприятие».
Если системный администратор открывает конфигуратор и вручную проставляет флажки ролей проблемному сотруднику, система расценивает это как расхождение с прикладной моделью безопасности. Очистка или сброс ролей до актуального состояния профилей гарантированно происходит в следующих случаях:
Пользователи или ГруппыДоступа.Если в режиме «1С:Предприятие» за пользователем не была закреплена корректная группа доступа, БСП при очередной фоновой проверке полностью очистит коллекцию ПользовательИнформационнойБазы.Роли.
Вторая проблема — исчезновение учетных записей после применения изменений в конфигураторе (когда остается только один последний заведенный пользователь или пользователь без административных прав). Физически перечень пользователей платформы хранится в служебной таблице v8users, а также в бинарном блоке users.usr внутри таблицы параметров PARAMS (в файловом варианте — во внутренних таблицах файла базы данных).
В некоторых релизах платформы (в частности, ветки 8.3.5–8.3.7) присутствовала зарегистрированная ошибка: во время обновления конфигурации базы данных с реструктуризацией таблиц (даже при добавлении единственного реквизита) файл users.usr повреждался или перезаписывался, оставляя в системе лишь сеанс текущего пользователя или запись, добавленную последней.
Если в результате сбоя в базе остался единственный пользователь без административных прав и вход в конфигуратор заблокирован, восстановим административный доступ на уровне СУБД (MS SQL Server или PostgreSQL). Разберем действия по шагам:
v8users:
TRUNCATE TABLE v8users;
PARAMS:
DELETE FROM PARAMS WHERE FileName = 'users.usr';
Если имеется свежая резервная копия базы (например, сделанная перед обновлением), восстанавливать весь объем данных не требуется. Достаточно перенести таблицы пользователей на уровне SQL-сервера:
v8users и запись users.usr в рабочей базе, как описано в первом способе.v8users из копии в рабочую базу командой INSERT INTO ... SELECT ....users.usr из таблицы PARAMS архивной базы в рабочую.После перезапуска кластера 1С список пользователей полностью восстановится до состояния, зафиксированного в архивной копии.
Когда таблица пользователей платформы очищена, прикладные данные в справочнике Пользователи режима «1С:Предприятие» остаются нетронутыми. В них сохранены настройки отчетов, привязка к документам и членство в группах доступа. Каждый элемент справочника связан с учетной записью платформы через реквизит ИдентификаторПользователяИБ.
Посмотрим на пример внешней обработки, которая позволяет восстановить пользователей платформы без потери настроек и истории:
Выборка = Справочники.Пользователи.Выбрать();
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ) Тогда
// Проверяем, существует ли пользователь в платформе
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Выборка.ИдентификаторПользователяИБ);
Если ПользовательИБ = Неопределено Тогда
// Создаем учетную запись с сохраненным идентификатором
НовыйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользовательИБ = НовыйПользовательИБ;
НовыйПользовательИБ.Имя = СокрЛП(Выборка.Наименование);
НовыйПользовательИБ.ПолноеИмя = СокрЛП(Выборка.Наименование);
НовыйПользовательИБ.АутентификацияСтандартная = Истина;
НовыйПользовательИБ.Записать();
// Связываем элемент справочника с созданным пользователем
ОбъектПользователь = Выборка.ПолучитьОбъект();
ОбъектПользователь.ИдентификаторПользователяИБ = НовыйПользовательИБ.УникальныйИдентификатор;
ОбъектПользователь.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
После программного создания учетных записей достаточно запустить регламентные задания БСП по обновлению прав доступа — подсистема автоматически сопоставит пользователей с группами доступа и назначит им требуемый набор ролей.
users.usr устранены разработчиками.