УстановитьСвойстваПользователяИБ (БСП)

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

Установить свойства пользователя. Записывает новые значения свойств указанного пользователя ИБ либо создает нового пользователя ИБ.

// Записывает новые значения свойств указанного пользователя ИБ либо создает нового пользователя ИБ.
// Если пользователь не существует, а также при попытке создания существующего пользователя будет вызвано исключение.
//
// Параметры:
//  ИмяИлиИдентификатор - Строка, УникальныйИдентификатор - имя или уникальный идентификатор пользователя ИБ, свойства 
//                                                          которого нужно установить. Либо имя нового пользователя ИБ.
//  ОбновляемыеСвойства - Структура - см. Пользователи.НовоеОписаниеПользователяИБ.
//    Если какое-либо свойство в структуре не задано, то используется прочитанное или начальное значение.
//    Следующие свойства структуры имеют особенности:
//      * ПользовательИБ          - ПользовательИнформационнойБазы - возвращаемый параметр: пользователь ИБ, свойства 
//                                  которого были записаны. 
//      * УникальныйИдентификатор - УникальныйИдентификатор - возвращаемый параметр: уникальный идентификатор 
//                                  записанного пользователя ИБ.
//      * СтарыйПароль            - Неопределено, Строка - если заданный пароль
//                                  не совпадет с существующим, то будет вызвано исключение.
//
//  СоздатьНового - Булево - указать Истина, чтобы создать нового пользователя ИБ с именем ИмяИлиИдентификатор.
//
//  ЭтоВнешнийПользователь - Булево - указать Истина, если пользователь ИБ соответствует внешнему пользователю
//                                    (элементу справочника ВнешниеПользователи).
//
Процедура УстановитьСвойстваПользователяИБ(Знач ИмяИлиИдентификатор, Знач ОбновляемыеСвойства,
	Знач СоздатьНового = Ложь, Знач ЭтоВнешнийПользователь = Ложь) Экспорт
	
	ИмяПроцедуры = "Пользователи.УстановитьСвойстваПользователяИБ";
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ИмяИлиИдентификатор",
		ИмяИлиИдентификатор, Новый ОписаниеТипов("Строка, УникальныйИдентификатор"));
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ОбновляемыеСвойства",
		ОбновляемыеСвойства, Тип("Структура"));
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "СоздатьНового",
		СоздатьНового, Тип("Булево"));
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ЭтоВнешнийПользователь",
		ЭтоВнешнийПользователь, Тип("Булево"));
	
	СтарыеСвойства = СвойстваПользователяИБ(ИмяИлиИдентификатор);
	ПользовательСуществует = СтарыеСвойства <> Неопределено;
	Если ПользовательСуществует Тогда
		ПользовательИБ = СтарыеСвойства.ПользовательИБ;
	Иначе
		ПользовательИБ = Неопределено;
		СтарыеСвойства = НовоеОписаниеПользователяИБ();
	КонецЕсли;
		
	Если Не ПользовательСуществует Тогда
		Если Не СоздатьНового Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Пользователь информационной базы ""%1"" не существует.'"),
				ИмяИлиИдентификатор);
		КонецЕсли;
		ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
	Иначе
		Если СоздатьНового Тогда
			ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ(
				НСтр("ru = 'Невозможно создать пользователя информационной базы %1, так как он уже существует.'"),
				СтарыеСвойства.Имя,
				СтарыеСвойства.УникальныйИдентификатор);
		КонецЕсли;
		
		Если ОбновляемыеСвойства.Свойство("СтарыйПароль")
		   И ТипЗнч(ОбновляемыеСвойства.СтарыйПароль) = Тип("Строка") Тогда
			
			СтарыйПарольСовпадает = ПользователиСлужебный.СтарыйПарольСовпадаетССохраненным(
				ОбновляемыеСвойства.СтарыйПароль, СтарыеСвойства.УникальныйИдентификатор);
			
			Если Не СтарыйПарольСовпадает Тогда
				ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ(
					НСтр("ru = 'При записи пользователя информационной базы %1 старый пароль указан не верно.'"),
					СтарыеСвойства.Имя,
					СтарыеСвойства.УникальныйИдентификатор);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	// Подготовка новых значений свойств.
	ТекстОшибкиПароля = "";
	НовыеСвойства = ОбщегоНазначения.СкопироватьРекурсивно(СтарыеСвойства);
	Для Каждого КлючИЗначение Из НовыеСвойства Цикл
		Если Не ОбновляемыеСвойства.Свойство(КлючИЗначение.Ключ)
		 Или ОбновляемыеСвойства[КлючИЗначение.Ключ] = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если КлючИЗначение.Ключ <> "Пароль" Тогда
			НовыеСвойства[КлючИЗначение.Ключ] = ОбновляемыеСвойства[КлючИЗначение.Ключ];
			Продолжить;
		КонецЕсли;
		Если ОбновляемыеСвойства.Свойство("СохраняемоеЗначениеПароля")
		   И ОбновляемыеСвойства.СохраняемоеЗначениеПароля <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Настройки = ПользователиСлужебныйПовтИсп.Настройки();
		Если Настройки.ОбщиеНастройкиВхода Тогда
			НастройкиВхода = ?(ЭтоВнешнийПользователь, Настройки.ВнешниеПользователи, Настройки.Пользователи);
			ТекстОшибкиПароля = ПользователиСлужебный.ОшибкаДлиныИлиСложностиПароля(
				ОбновляемыеСвойства.Пароль,
				НастройкиВхода.МинимальнаяДлинаПароля,
				НастройкиВхода.ПарольДолженОтвечатьТребованиямСложности);
		Иначе
			ТекстОшибкиПароля = ПользователиСлужебный.ОшибкаДлиныИлиСложностиПароля(
				ОбновляемыеСвойства.Пароль,
				ПолучитьМинимальнуюДлинуПаролейПользователей(),
				ПолучитьПроверкуСложностиПаролейПользователей());
		КонецЕсли;
		НовыеСвойства.СохраняемоеЗначениеПароля =
			ПользователиСлужебный.СохраняемоеЗначениеСтрокиПароля(ОбновляемыеСвойства.Пароль, Истина);
	КонецЦикла;
	
	СкопироватьСвойстваПользователяИБ(ПользовательИБ, НовыеСвойства);
	
	Если ЗначениеЗаполнено(ТекстОшибкиПароля) Тогда
		ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ(
			НСтр("ru = 'Не удалось записать свойства пользователя информационной базы %1 по причине:
			           |%2.'"),
			ПользовательИБ.Имя,
			?(ПользовательСуществует, СтарыеСвойства.УникальныйИдентификатор, Неопределено),
			ТекстОшибкиПароля);
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь;
	КонецЕсли;
	
	// Попытка записи нового или изменение существующего пользователя ИБ.
	Попытка
		ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь);
	Исключение
		ВызватьИсключение ОписаниеОшибкиПриЗаписиПользователяИБ(
			НСтр("ru = 'Не удалось записать свойства пользователя информационной базы %1 по причине:
			           |%2.'"),
			ПользовательИБ.Имя,
			?(ПользовательСуществует, СтарыеСвойства.УникальныйИдентификатор, Неопределено),
			ИнформацияОбОшибке());
	КонецПопытки;
	
	Если ЗначениеЗаполнено(СтарыеСвойства.Имя) И СтарыеСвойства.Имя <> НовыеСвойства.Имя Тогда
		// Перемещение настроек пользователя.
		ПользователиСлужебный.СкопироватьНастройкиПользователя(СтарыеСвойства.Имя, НовыеСвойства.Имя, Истина);
	КонецЕсли;
	
	Если СоздатьНового Тогда
		ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ.Имя, ЭтоВнешнийПользователь);
	КонецЕсли;
	
	ПользователиПереопределяемый.ПриЗаписиПользователяИнформационнойБазы(СтарыеСвойства, НовыеСвойства);
	ОбновляемыеСвойства.Вставить("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор);
	ОбновляемыеСвойства.Вставить("ПользовательИБ", ПользовательИБ);
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

СвойстваПользователяАбонента (БСП)

СвойстваНеуказанногоПользователя (БСП)

УстановитьЗначениеСвойстваБИП (БСП)

УстановитьПараметрыНабораСвойств (БСП)

СвойстваПользователяИБ (БСП)

СкопироватьСвойстваПользователяИБ (БСП)

ХранимыеСвойстваПользователяИБ (БСП)

СвойстваТекущегоПользователяИБ (БСП)

УстановитьСвойстваПрофиляБезопасности (БСП)

TurboConf - расширение Конфигуратора 1С