Создать администратора. Используется при обновлении и начальном заполнении информационной базы.
// Используется при обновлении и начальном заполнении информационной базы.
// 1) Создает первого администратора и сопоставляет его с новым или существующим
// пользователем в справочнике Пользователи.
// 2) Сопоставляет администратора, указанного в параметре ПользовательИБ, с новым или
// существующим пользователем в справочнике Пользователи.
//
// Параметры:
// ПользовательИБ - Неопределено - создать первого администратора, если не существует.
// - ПользовательИнформационнойБазы - используется, когда нужно сопоставить
// существующего администратора с новым или существующим пользователем
// в справочнике Пользователи.
//
// Возвращаемое значение:
// Неопределено - первый администратор уже существует.
// СправочникСсылка.Пользователи - пользователь в справочнике, с которым сопоставлен созданный
// первый администратор или указанный существующий.
//
Функция СоздатьАдминистратора(ПользовательИБ = Неопределено) Экспорт
Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
ВызватьИсключение НСтр("ru = 'Справочник Пользователи недоступен в неразделенном режиме.'");
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
// Добавление администратора.
Если ПользовательИБ = Неопределено Тогда
ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ПользователиИБ.Количество() = 0 Тогда
Если ОбщегоНазначения.РазделениеВключено() Тогда
ВызватьИсключение
НСтр("ru = 'Невозможно автоматически создать первого администратора области данных.'");
КонецЕсли;
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.Имя = "Администратор";
ПользовательИБ.ПолноеИмя = ПользовательИБ.Имя;
ПользовательИБ.Роли.Очистить();
ПользовательИБ.Роли.Добавить(Метаданные.Роли.ПолныеПрава);
РольАдминистратораСистемы = Метаданные.Роли.АдминистраторСистемы;
Если НЕ ПользовательИБ.Роли.Содержит(РольАдминистратораСистемы) Тогда
ПользовательИБ.Роли.Добавить(РольАдминистратораСистемы);
КонецЕсли;
ПользовательИБ.Записать();
Иначе
// Если существует пользователь с правами администратора,
// тогда первый администратор уже создан и его не требуется создавать.
Для Каждого ТекущийПользовательИБ Из ПользователиИБ Цикл
Если ПользователиСлужебный.РолиАдминистратораДоступны(ТекущийПользовательИБ) Тогда
Возврат Неопределено; // Первый администратор уже создан.
КонецЕсли;
КонецЦикла;
// Первый администратор создан некорректно.
ТекстОшибки =
НСтр("ru = 'Список пользователей информационной базы не пустой, однако не удалось
|найти ни одного пользователя с ролями Полные права и Администратор системы.
|
|Вероятно, пользователи создавались в конфигураторе.
|Требуется назначить роли Полные права и Администратор системы хотя бы одному пользователю.'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Иначе
Если Не ПользователиСлужебный.РолиАдминистратораДоступны(ПользовательИБ) Тогда
ТекстОшибки =
НСтр("ru = 'Невозможно создать пользователя в справочнике для пользователя
|информационной базы ""%1"",
|так как у него нет ролей Полные права и Администратор системы.
|
|Вероятно, пользователь был создан в конфигураторе.
|Для автоматического создания пользователя в справочнике требуется
|назначить ему роли Полные права и Администратор системы.'");
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ПользовательИБ));
КонецЕсли;
НайтиНеоднозначныхПользователейИБ(Неопределено, ПользовательИБ.УникальныйИдентификатор);
КонецЕсли;
Если ПользователиСлужебный.ПользовательПоИдентификаторуСуществует(
ПользовательИБ.УникальныйИдентификатор) Тогда
Пользователь = Справочники.Пользователи.НайтиПоРеквизиту(
"ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
// Если администратор сопоставлен с внешним пользователем - это ошибка,
// требуется очистить сопоставление.
Если НЕ ЗначениеЗаполнено(Пользователь) Тогда
ВнешнийПользователь = Справочники.ВнешниеПользователи.НайтиПоРеквизиту(
"ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
ВнешнийПользовательОбъект = ВнешнийПользователь.ПолучитьОбъект();
ВнешнийПользовательОбъект.ИдентификаторПользователяИБ = Неопределено;
ВнешнийПользовательОбъект.ОбменДанными.Загрузка = Истина;
ВнешнийПользовательОбъект.Записать();
КонецЕсли;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Пользователь) Тогда
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользовательИБ.ПолноеИмя);
Если ЗначениеЗаполнено(Пользователь)
И ЗначениеЗаполнено(Пользователь.ИдентификаторПользователяИБ)
И Пользователь.ИдентификаторПользователяИБ <> ПользовательИБ.УникальныйИдентификатор
И ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
Пользователь.ИдентификаторПользователяИБ) <> Неопределено Тогда
Пользователь = Неопределено;
КонецЕсли;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Пользователь) Тогда
Пользователь = Справочники.Пользователи.СоздатьЭлемент();
ПользовательСоздан = Истина;
Иначе
Пользователь = Пользователь.ПолучитьОбъект();
ПользовательСоздан = Ложь;
КонецЕсли;
Пользователь.Наименование = ПользовательИБ.ПолноеИмя;
ОписаниеПользователяИБ = Новый Структура;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить(
"УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор);
Пользователь.ДополнительныеСвойства.Вставить(
"ОписаниеПользователяИБ", ОписаниеПользователяИБ);
Пользователь.ДополнительныеСвойства.Вставить("СозданиеАдминистратора",
?(ПользовательИБ = Неопределено,
НСтр("ru = 'Выполнено создание первого администратора.'"),
?(ПользовательСоздан,
НСтр("ru = 'Администратор сопоставлен с новым пользователем справочника.'"),
НСтр("ru = 'Администратор сопоставлен с существующим пользователем справочника.'")) ) );
Пользователь.Записать();
Возврат Пользователь.Ссылка;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ТребуетсяСоздатьПервогоАдминистратора (БСП)
ПриСозданииАдминистратора (БСП)
РолиАдминистратораДоступны (БСП)
ЗаполнитьНаименованиеПредопределенныхЭлементов (БСП)
ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора (БСП)
ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)