Перем ОсновнойЭУ;
Перем мПлатформа;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "";
	выхИменаСвойств = выхИменаСвойств + ",ПодсветкаСтрок";
КонецФункции

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура КПСпискаПользователейДействияПользователя(Кнопка)
	
	ТекущаяСтрока = ОсновнойЭУ.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	АнализЖурналаРегистрации = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализЖурналаРегистрации");
	#Если Сервер И Не Сервер Тогда
		АнализЖурналаРегистрации = Обработки.ирАнализЖурналаРегистрации.Создать();
	#КонецЕсли
	АнализЖурналаРегистрации.ОткрытьСПараметром("Пользователь", Новый УникальныйИдентификатор(ТекущаяСтрока.УникальныйИдентификатор), ТекущаяСтрока.Имя);

КонецПроцедуры

Процедура КПСпискаПользователейМодификацияПользователя(Кнопка)
	ТекущаяСтрока = ОсновнойЭУ.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ТипыСобытий = Новый Массив;
	ТипыСобытий.Добавить("_$User$_.New");
	ТипыСобытий.Добавить("_$User$_.Update");
	ТипыСобытий.Добавить("_$User$_.Delete");
	АнализЖурналаРегистрации = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализЖурналаРегистрации");
	#Если Сервер И Не Сервер Тогда
		АнализЖурналаРегистрации = Обработки.ирАнализЖурналаРегистрации.Создать();
	#КонецЕсли
	АнализЖурналаРегистрации.ОткрытьСОтбором(,, Новый Структура("Событие, Данные", ТипыСобытий, ТекущаяСтрока.Имя));
КонецПроцедуры

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирКлиент.СоздатьМенеджерСохраненияНастроекФормыЛкс(ЭтаФорма);
	мПлатформа = ирКэш.Получить();
	ОбновитьДоступныеРоли();
	Если РазделениеДанных.Количество() = 0 Тогда
		Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
			Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.Разделять Тогда
				СтрокаРазделителя = РазделениеДанных.Добавить();
				СтрокаРазделителя.Разделитель = ОбщийРеквизит.Имя;
				СтрокаРазделителя.Представление = ОбщийРеквизит.Представление();
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли; 
	НастройкаОтбораСтрок = ОсновнойЭУ.НастройкаОтбораСтрок;
	Для каждого НастройкаОтбораСтроки Из НастройкаОтбораСтрок Цикл
		НастройкаОтбораСтроки.Доступность = Истина;
	КонецЦикла; 
	ИсторияОтборов = Новый Массив;
	Если ирКэш.НомерВерсииПлатформыЛкс() < 803016 Тогда
		ЭлементыФормы.Пользователи.Колонки.ДатаБлокировки.Видимость = Ложь;
		ЭлементыФормы.Пользователи.Колонки.ДатаБлокировки.ИзменятьВидимость = Ложь;
		ЭлементыФормы.КоманднаяПанельСпискаПользователей.Кнопки.Разблокировать.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс(); // Антибаг платформы 8.3.22 https://www.hostedredmine.com/issues/948691
	КонецЕсли;
	УправлениеСпискомПользователей_ОбновитьСписокПользователей();
	ОбработатьПараметрИмяПользователя();
	ОсновнойЭУ.Значение.Сортировать("Имя");
	Если ЗначениеЗаполнено(НачальноеЗначениеВыбора) Тогда
		СтрокаПользователя = Пользователи.Найти(НачальноеЗначениеВыбора, "Имя");
		Если СтрокаПользователя <> Неопределено Тогда
			ЭлементыФормы.Пользователи.ТекущаяСтрока = СтрокаПользователя;
		КонецЕсли; 
	КонецЕсли;
	ирКлиент.ДописатьРежимВыбораВЗаголовокФормыЛкс(ЭтаФорма);
	Если Метаданные.Справочники.Найти("Пользователи") = Неопределено Тогда
		ЭлементыФормы.Пользователи.Колонки.Ссылка.Видимость = Ложь;
	КонецЕсли;
	ОбновитьПодменюПоследниеВыбранные();
	Если Пользователи.Количество() < 10 Тогда
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Пользователи;
	КонецЕсли; 

КонецПроцедуры

Процедура ОбработатьПараметрИмяПользователя()
	
	Если ЗначениеЗаполнено(ЭтаФорма.ПараметрИмяПользователя) Тогда
		СтрокаПользователя = ОсновнойЭУ.Значение.Найти(ЭтаФорма.ПараметрИмяПользователя, "Имя");
		Если СтрокаПользователя <> Неопределено Тогда
			ОсновнойЭУ.ТекущаяСтрока = СтрокаПользователя;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

Функция УправлениеСпискомПользователей_ОбновитьСписокПользователей(Знач УникальныйИдентификатор = "") Экспорт
	
	СостояниеСтрокТаблицы = ирКлиент.ТабличноеПолеСостояниеСтрокЛкс(ОсновнойЭУ, "УникальныйИдентификатор");
	ПользователиИнфобазы = ПользователиИнформационнойБазы.ПолучитьПользователей();
	//ПользователиИнфобазы.Добавить(ПользователиИнформационнойБазы.НайтиПоИмени("")); // Смыла в этом нет
	Разница = ПользователиИнфобазы.Количество() - ОсновнойЭУ.Значение.Количество();
	Если Разница > 0  Тогда
		Для Счетчик = 1 По Разница Цикл
			ОсновнойЭУ.Значение.Добавить();
		КонецЦикла; 
	ИначеЕсли Разница < 0 Тогда
		Для Счетчик = 1 По -Разница Цикл
			ОсновнойЭУ.Значение.Удалить(ОсновнойЭУ.Значение.Количество()-1);
		КонецЦикла; 
	КонецЕсли; 
	Счетчик = 0;
	СсылкиПользователей = СсылкиПользователей();
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Пользователи.Количество(), "Чтение");
	Для каждого Пользователь Из ПользователиИнфобазы Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		ТекущиеДанные = ОсновнойЭУ.Значение[Счетчик];
		УправлениеСпискомПользователей_ОбновитьСтрокуПользователя(Пользователь, ТекущиеДанные, СсылкиПользователей);
		Счетчик = Счетчик + 1;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	ОсновнойЭУ.Значение.Сортировать("Имя");
	ирКлиент.ТабличноеПолеВосстановитьСостояниеСтрокЛкс(ОсновнойЭУ, СостояниеСтрокТаблицы);
	ЭтаФорма.Обновить();
	
КонецФункции

Функция УправлениеСпискомПользователей_ОбновитьСтрокуПользователя(Знач Пользователь = Неопределено, Знач ТекущиеДанные, Знач СсылкиПользователей = Неопределено)
	
	#Если Сервер И Не Сервер Тогда
		ТекущиеДанные = Пользователи.Добавить();
	#КонецЕсли
	Если Пользователь = Неопределено Тогда
		Пользователь = ПользовательИБИзСтрокиСписка(ТекущиеДанные);
	Иначе
		ТекущиеДанные.Имя = Пользователь.Имя;
	КонецЕсли; 
	ТекущиеДанные.ПолноеИмя = Пользователь.ПолноеИмя;
	ТекущиеДанные.ПарольУстановлен = Пользователь.ПарольУстановлен;
	ТекущиеДанные.ПоказыватьВСпискеВыбора = Пользователь.ПоказыватьВСпискеВыбора;
	ТекущиеДанные.АутентификацияСтандартная = Пользователь.АутентификацияСтандартная;
	ТекущиеДанные.АутентификацияОС = Пользователь.АутентификацияОС;
	ТекущиеДанные.АутентификацияOpenID = Пользователь.АутентификацияOpenID;
	Попытка
		ТекущиеДанные.ПользовательОС = Пользователь.ПользовательОС;
	Исключение
		ТекущиеДанные.ПользовательОС = "<Неверные данные>";
	КонецПопытки; 
	Если Пользователь.Язык = Неопределено Тогда
		ТекущиеДанные.Язык = "";
		ТекущиеДанные.ЯзыкПредставление = "";
	Иначе
		ТекущиеДанные.Язык = Пользователь.Язык.Имя;
		ТекущиеДанные.ЯзыкПредставление = Пользователь.Язык;
	КонецЕсли; 
	Если Пользователь.ОсновнойИнтерфейс = Неопределено Тогда
		ТекущиеДанные.ОсновнойИнтерфейс = "";
		ТекущиеДанные.ОсновнойИнтерфейсПредставление = "";
	Иначе
		ТекущиеДанные.ОсновнойИнтерфейс = Пользователь.ОсновнойИнтерфейс.Имя;
		ТекущиеДанные.ОсновнойИнтерфейсПредставление = Пользователь.ОсновнойИнтерфейс;
	КонецЕсли; 
	РезультатРоли = Новый СписокЗначений;
	Для каждого Роль Из Пользователь.Роли Цикл
		РезультатРоли.Добавить(Роль.Имя,Роль);
	КонецЦикла; 
	РезультатРоли.СортироватьПоЗначению();
	РезультатИмена         = "";
	РезультатПредставление = "";
	Для каждого Роль Из РезультатРоли Цикл
		РезультатИмена         = РезультатИмена+Роль.Значение+", ";
		РезультатПредставление = РезультатПредставление+Роль.Представление+", ";
	КонецЦикла; 
	ТекущиеДанные.РолиИмена = Сред(РезультатИмена,1,СтрДлина(РезультатИмена)-2);
	ТекущиеДанные.РолиПредставление = Сред(РезультатПредставление,1,СтрДлина(РезультатПредставление)-2);
	ТекущиеДанные.УникальныйИдентификатор = Пользователь.УникальныйИдентификатор;
	ТекущиеДанные.СохраняемоеЗначениеПароля = Пользователь.СохраняемоеЗначениеПароля;
	ТекущиеДанные.РежимЗапуска = Пользователь.РежимЗапуска;
	Если ирКэш.ДоступнаЗащитаОтОпасныхДействийЛкс() Тогда
		ТекущиеДанные.ЗащитаОтОпасныхДействий = Пользователь.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях;
	КонецЕсли;
	Если ирКэш.ДоступноВосстановлениеПароляПользователямЛкс() Тогда
		ТекущиеДанные.АдресЭлектроннойПочты = Пользователь.АдресЭлектроннойПочты;
		ТекущиеДанные.ЗапрещеноВосстанавливатьПароль = Пользователь.ЗапрещеноВосстанавливатьПароль;
	КонецЕсли; 
	Если РазделениеДанных.Количество() > 0 Тогда
		ТекущиеДанные.РазделениеДанныхПредставление = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(Пользователь.РазделениеДанных);
	КонецЕсли;  
	ТекущиеДанные.Ссылка = Неопределено;
	Если СсылкиПользователей <> Неопределено Тогда
		СтрокаСсылки = СсылкиПользователей.Найти(Пользователь.УникальныйИдентификатор, "ИдентификаторПользователяИБ");
		Если СтрокаСсылки <> Неопределено Тогда
			ТекущиеДанные.Ссылка = СтрокаСсылки.Ссылка;
		КонецЕсли; 
	КонецЕсли;
	НастройкиКлиентскогоПриложения = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиКлиентскогоПриложения",,, Пользователь.Имя);
	Если НастройкиКлиентскогоПриложения = Неопределено Тогда
		НастройкиКлиентскогоПриложения = Новый НастройкиКлиентскогоПриложения;
	КонецЕсли;
	ЗаполнитьЗначенияСвойств(ТекущиеДанные, НастройкиКлиентскогоПриложения); 
	Если ЭлементыФормы.Пользователи.Колонки.ДатаБлокировки.Видимость Тогда
		МоментНачала = ирОбщий.ТекущееВремяВМиллисекундахЛкс(); 
		ОбновитьДатуАвтоблокировкиПользователя(ТекущиеДанные, Пользователь);
		ДлительностьМС = ирОбщий.ТекущееВремяВМиллисекундахЛкс() - МоментНачала;
		Если ДлительностьМС * Пользователи.Количество() > 5000 Тогда
			// https://www.hostedredmine.com/issues/951192
			ЭлементыФормы.Пользователи.Колонки.ДатаБлокировки.Видимость = Ложь;
			ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонЛкс("Колонка ""%1"" не будет заполнена и скрыта, т.е. ее заполнение происходит очень долго", ЭлементыФормы.Пользователи.Колонки.ДатаБлокировки.ТекстШапки));
		КонецЕсли;
	КонецЕсли;
	
КонецФункции

//.
// Параметры:
//    ТекущиеДанные - ОбработкаТабличнаяЧастьСтрока.ирРедакторПользователей.Пользователи - 
// Возвращаемое значение:
//     - 
Функция ПользовательИБИзСтрокиСписка(Знач ТекущиеДанные) Экспорт
	Результат = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ТекущиеДанные.УникальныйИдентификатор));
	Возврат Результат;
КонецФункции

//.
// Параметры:
//    ТекущиеДанные - ОбработкаТабличнаяЧастьСтрока.ирРедакторПользователей.Пользователи - 
//    Пользователь - ПользовательИнформационнойБазы, Неопределено - для ускорения 
Процедура ОбновитьДатуАвтоблокировкиПользователя(ТекущиеДанные, Знач Пользователь = Неопределено) Экспорт
	Если Пользователь = Неопределено Тогда
		Пользователь = ПользовательИБИзСтрокиСписка(ТекущиеДанные);
	КонецЕсли;
	БлокировкаПользователя = БлокировкаПользователя(Пользователь.Имя);
	Если БлокировкаПользователя = Неопределено Тогда
		ТекущиеДанные.ДатаБлокировки = Неопределено;
	Иначе
		ТекущиеДанные.ДатаБлокировки = БлокировкаПользователя.ВремяНачалаБлокировки;
	КонецЕсли;
КонецПроцедуры

Функция БлокировкаПользователя(Знач ИмяПользователя)
	
	БлокировкаАутентификацииМой = Вычислить("БлокировкаАутентификации");
	#Если Сервер И Не Сервер Тогда
		БлокировкаАутентификацииМой = БлокировкаАутентификации;
	#КонецЕсли
	БлокировкаПользователя = БлокировкаАутентификацииМой.ПолучитьБлокировки(Новый Структура("ИмяПользователя", ИмяПользователя));
	Если БлокировкаПользователя.Количество() > 0 Тогда
		БлокировкаПользователя = БлокировкаПользователя[0];
	Иначе
		БлокировкаПользователя = Неопределено;
	КонецЕсли;
	Возврат БлокировкаПользователя;

КонецФункции

Процедура ПользователиПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	РедактироватьПользователя(Элемент);
	
КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейОбновить(Кнопка)
	
	УправлениеСпискомПользователей_ОбновитьСписокПользователей();
	
КонецПроцедуры

Процедура ПользователиПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Если ПодсветкаСтрок <> Ложь Тогда
		Сеансы = ПолучитьСеансыИнформационнойБазы(); // Иногда выполняется долго
	КонецЕсли;
	// Оптимизировать
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
		Если Сеансы <> Неопределено Тогда
			Для Каждого Сеанс Из Сеансы Цикл
				Если Сеанс.Пользователь = Неопределено Тогда
					Продолжить;
				КонецЕсли; 
				Если ирОбщий.СтрокиРавныЛкс(Сеанс.Пользователь.УникальныйИдентификатор, ДанныеСтроки.УникальныйИдентификатор) Тогда
					ОформлениеСтроки.ЦветФона = Новый Цвет(235, 255, 255);
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли; 
		Если ирОбщий.СтрокиРавныЛкс(ИмяПользователя(), ДанныеСтроки.Имя) Тогда
			ОформлениеСтроки.ЦветТекста = ирОбщий.ЦветТекстаТекущегоЭлементаЛкс();
		КонецЕсли; 
		ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
		ОформлениеСтроки.Ячейки.НастройкиУправляемогоПриложения.Видимость = Ложь;
	КонецЦикла; 
	
КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейЗапуститьПодПользователем(Кнопка)
	
	Если ОсновнойЭУ.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	УникальныйИдентификатор = Новый УникальныйИдентификатор(ОсновнойЭУ.ТекущаяСтрока.УникальныйИдентификатор);
	ФормаЗапуска = ЭтотОбъект.ПолучитьФорму("ЗапускПодПользователем",, УникальныйИдентификатор);
	ФормаЗапуска.ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УникальныйИдентификатор);
	Если ФормаЗапуска.ПользовательИБ = Неопределено Тогда
		УправлениеСпискомПользователей_ОбновитьСписокПользователей();
		Возврат;
	КонецЕсли;
	ирКлиент.ОткрытьФормуВМинимальномРазмереЛкс(ФормаЗапуска);
	
КонецПроцедуры

Процедура ПользователиПередНачаломДобавления(Элемент, Отказ, Копирование)
	
	Отказ = Истина;
	ФормаРедактированияПользователя = ПолучитьФорму("ПользовательИнфобазы");
	Если Копирование Тогда
		ФормаРедактированияПользователя.ПользовательДляКопированияНастроек = ПользовательИБИзСтрокиСписка(Элемент.ТекущаяСтрока);
	КонецЕсли; 
	ФормаРедактированияПользователя.Открыть();

КонецПроцедуры

Процедура ПользователиПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	ВыделенныеСтроки = ЭлементыФормы.Пользователи.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли; 
	Ответ = Вопрос("Вы действительно хотите удалить выделенных (" + ВыделенныеСтроки.Количество() + ") пользователей?", РежимДиалогаВопрос.ОКОтмена);
	Если Ответ = КодВозвратаДиалога.ОК Тогда
		Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
			ПользовательИБИзСтрокиСписка(ВыделеннаяСтрока).Удалить();
		КонецЦикла;
		УправлениеСпискомПользователей_ОбновитьСписокПользователей();
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбновлениеОтображения()
	
	КоличествоПользователей = ОсновнойЭУ.Значение.Количество();

КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	
	Если ТипЗнч(Параметр) = Тип("ПользовательИнформационнойБазы") Тогда
		Если ИмяСобытия = "ЗаписанОбъект" Тогда
			УправлениеСпискомПользователей_ОбновитьСписокПользователей(); 
		КонецЕсли;
		ПоследниеВыбранныеДобавить(Параметр.УникальныйИдентификатор);
	КонецЕсли;
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 

КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейИзменениеВыбранных(Кнопка = Неопределено)
	
	ФормаУстановкиНастроек = ПолучитьФорму("ИзменениеВыбранныхПользователей");
	Если ЭлементыФормы.Пользователи.ТекущаяСтрока <> Неопределено Тогда
		ФормаУстановкиНастроек.ПараметрИмяПользователя = ЭлементыФормы.Пользователи.ТекущаяСтрока.Имя;
	КонецЕсли;
	ПараметрИменаПользователей = Новый Массив;
	Для Каждого ВыделеннаяСтрока Из ЭлементыФормы.Пользователи.ВыделенныеСтроки Цикл
		ПараметрИменаПользователей.Добавить(ВыделеннаяСтрока.Имя);
	КонецЦикла;
	ФормаУстановкиНастроек.ПараметрИменаПользователей = ПараметрИменаПользователей;
	РезультатФормы = ФормаУстановкиНастроек.ОткрытьМодально();
	Если РезультатФормы = Истина Тогда 
		УправлениеСпискомПользователей_ОбновитьСписокПользователей();
	КонецЕсли;
	
КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейОбработатьВКонсолиКода(Кнопка)
	
	ВыделенныеПользователи = Новый Массив;
	Для Каждого ВыделеннаяСтрока Из ЭлементыФормы.Пользователи.ВыделенныеСтроки Цикл
		ВыделенныеПользователи.Добавить(ПользовательИБИзСтрокиСписка(ВыделеннаяСтрока));
	КонецЦикла;
	СтруктураПараметров = Новый Структура("ВыделенныеПользователи", ВыделенныеПользователи);
	ТекстАлгоритма = "Для Каждого Пользователь Из ВыделенныеПользователи Цикл
	|	//: Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору();
	|
	|КонецЦикла;";
	ирОбщий.ОперироватьСтруктуройЛкс(ТекстАлгоритма, , СтруктураПараметров);
	
КонецПроцедуры

Процедура ПользователиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если РежимВыбора Тогда
		Закрыть(ВыбраннаяСтрока.Имя);
	Иначе
		Колонки = ЭлементыФормы.Пользователи.Колонки;
		Если Колонка = Колонки.Ссылка Тогда
			ирКлиент.ОткрытьЗначениеЛкс(ВыбраннаяСтрока[Колонка.Данные]);
		ИначеЕсли Ложь
			Или Колонка = Колонки.ВариантМасштабаФормКлиентскогоПриложения 
			Или Колонка = Колонки.ВариантИнтерфейсаКлиентскогоПриложения
			Или Колонка = Колонки.ОтображатьПанелиНавигацииИДействий
			Или Колонка = Колонки.ОтображатьПанельРазделов
			Или Колонка = Колонки.СкоростьКлиентскогоСоединения
			Или Колонка = Колонки.РежимОткрытияФормПриложения
		Тогда
			КоманднаяПанельСпискаПользователейИзменениеВыбранных();
		Иначе
			РедактироватьПользователя(Элемент);
		КонецЕсли; 
	КонецЕсли; 

КонецПроцедуры

Процедура РедактироватьПользователя(Знач Элемент)
	
	ФормаРедактированияПользователя = ПолучитьФорму("ПользовательИнфобазы",, Элемент.ТекущаяСтрока.УникальныйИдентификатор);
	ФормаРедактированияПользователя.ПользовательИБ = ПользовательИБИзСтрокиСписка(Элемент.ТекущаяСтрока);
	ФормаРедактированияПользователя.Открыть();

КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейПодсветитьАктивныеСеансы(Кнопка = Неопределено)
	ЭтаФорма.ПодсветкаСтрок = НЕ ПодсветкаСтрок;
	НастроитьЭлементыФормы();
КонецПроцедуры

Процедура НастроитьЭлементыФормы()
	
	ЭлементыФормы.КоманднаяПанельСпискаПользователей.Кнопки.ПодсветитьАктивныеСеансы.Пометка = ПодсветкаСтрок;

КонецПроцедуры

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);

КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейАнализПравДоступа(Кнопка)
	
	Если ЭлементыФормы.Пользователи.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ФормаОтчета = ирКлиент.ПолучитьФормуЛкс("Отчет.ирАнализПравДоступа.Форма",,, ЭлементыФормы.Пользователи.ТекущаяСтрока.Имя);
	ФормаОтчета.Пользователь = ЭлементыФормы.Пользователи.ТекущаяСтрока.Имя;
	ФормаОтчета.ПараметрКлючВарианта = "ПоМетаданным";
	ФормаОтчета.Открыть();
	
КонецПроцедуры

Процедура ПриПовторномОткрытии(СтандартнаяОбработка)
	
	ОбработатьПараметрИмяПользователя();
	
КонецПроцедуры

Процедура ПользователиПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);

КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейРедакторХранилищНастроек(Кнопка)
	
	Если ЭлементыФормы.Пользователи.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ФормаОтчета = ирКлиент.ПолучитьФормуЛкс("Обработка.ирРедакторХранилищНастроек.Форма",,, ЭлементыФормы.Пользователи.ТекущаяСтрока.Имя);
	ФормаОтчета.Пользователь = ЭлементыФормы.Пользователи.ТекущаяСтрока.Имя;
	ФормаОтчета.Открыть();
	
КонецПроцедуры

Процедура ПользователиПриАктивизацииКолонки(Элемент)
	ирКлиент.ТабличноеПолеПриАктивацииКолонкиЛкс(ЭтаФорма, Элемент);
КонецПроцедуры

Функция ПоследниеВыбранныеНажатие(Кнопка) Экспорт
	
	ирКлиент.ПоследниеВыбранныеНажатиеЛкс(ЭтаФорма, ЭлементыФормы.Пользователи, Метаданные().ТабличныеЧасти.Пользователи.Реквизиты.УникальныйИдентификатор.Имя, Кнопка);
	
КонецФункции

Процедура ПоследниеВыбранныеДобавить(Знач УникальныйИдентификатор) Экспорт 
	УникальныйИдентификатор = "" + УникальныйИдентификатор;
	СтрокаПользователя = Пользователи.Найти(УникальныйИдентификатор, "УникальныйИдентификатор");
	ирКлиент.ПоследниеВыбранныеДобавитьЛкс(ЭтаФорма, СтрокаПользователя.УникальныйИдентификатор, СтрокаПользователя.Имя, ЭлементыФормы.Пользователи);
	ОбновитьПодменюПоследниеВыбранные();
КонецПроцедуры   

Процедура ОбновитьПодменюПоследниеВыбранные()
	ирКлиент.ПоследниеВыбранныеЗаполнитьПодменюЛкс(ЭтаФорма, ЭлементыФормы.КоманднаяПанельСпискаПользователей.Кнопки.ПоследниеВыбранные, ЭлементыФормы.Пользователи);
КонецПроцедуры

Процедура КоманднаяПанельСпискаПользователейРазблокировать(Кнопка)

	Для Каждого ВыделеннаяСтрока Из ЭлементыФормы.Пользователи.ВыделенныеСтроки Цикл
		ОбновитьДатуАвтоблокировкиПользователя(ВыделеннаяСтрока);
		Если ЗначениеЗаполнено(ВыделеннаяСтрока.ДатаБлокировки) Тогда
			// Антибаг платформы 8.3.22 https://www.hostedredmine.com/issues/948691
			//БлокировкаПользователя = БлокировкаПользователя(ВыделеннаяСтрока.Имя);
			//Если БлокировкаПользователя <> Неопределено Тогда
			//	БлокировкаПользователя.Разблокировать();
			//КонецЕсли;
			ирСервер.РазблокироватьАутентифкациюЛкс(ВыделеннаяСтрока.Имя);

			УправлениеСпискомПользователей_ОбновитьСтрокуПользователя(, ВыделеннаяСтрока);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура ОбновитьОтбор()
	
	Реквизиты = Метаданные().ТабличныеЧасти.Пользователи.Реквизиты;
	КолонкиПоиска = Новый Структура;
	КолонкиПоиска.Вставить(Реквизиты.Имя.Имя);
	КолонкиПоиска.Вставить(Реквизиты.ПолноеИмя.Имя);
	КолонкиПоиска.Вставить(Реквизиты.АдресЭлектроннойПочты.Имя);
	ирКлиент.ТабличноеПолеСДаннымиПоискаУстановитьОтборПоПодстрокеЛкс(ЭтаФорма, ЭлементыФормы.Пользователи, ПодстрокаПоиска, КолонкиПоиска);

КонецПроцедуры

Процедура ПодстрокаПоискаПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ОбновитьОтбор();
КонецПроцедуры

Процедура ПодстрокаПоискаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

Процедура ПодстрокаПоискаАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	Если ирКлиент.ПромежуточноеОбновлениеСтроковогоЗначенияПоляВводаЛкс(ЭтаФорма, Элемент, Текст) Тогда 
		ОбновитьОтбор();
	КонецЕсли;
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирРедакторПользователей.Форма.Форма");
ОсновнойЭУ = ЭлементыФормы.Пользователи;
