СоздатьАдминистратора (БСП)

Автор: 1С
ОбщийМодуль.Пользователи
1С БСП

Создать администратора. Используется при обновлении и начальном заполнении информационной базы.

// Используется при обновлении и начальном заполнении информационной базы.
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ТребуетсяСоздатьПервогоАдминистратора (БСП)

РольАдминистратор (БСП)

ЭтоАдминистраторСистемы (БСП)

ПриСозданииАдминистратора (БСП)

РолиАдминистратораДоступны (БСП)

ЗаполнитьНаименованиеПредопределенныхЭлементов (БСП)

ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора (БСП)

ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз