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

////////////////////////////////////////////////////////////////////////////////
//                          ИСПОЛЬЗОВАНИЕ ФОРМЫ                               //
//
// Дополнительные параметры открытия формы подбора:
//
// РасширенныйПодбор - Булево - если Истина - открывается расширенная форма
//  подбора пользователей. Используется вместе с параметром ПараметрыРасширеннойФормыПодбора.
// ПараметрыРасширеннойФормыПодбора - Строка - адрес временного хранилища
//  со структурой ПользователиСлужебный.НовыеПараметрыРасширеннойФормыПодбора
//

#Область ОписаниеПеременных

&НаКлиенте
Перем ПоследнийЭлемент;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// Начальное значение настройки до загрузки данных из настроек.
	ВыбиратьИерархически = Истина;
	
	НовыйХранимыеПараметры();
	
	ЗаполнитьПараметрыДинамическихСписков(Параметры.Назначение);
	
	Если Параметры.РежимВыбора Тогда
		СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ВыборПодбор");
		РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
		
	ИначеЕсли Пользователи.ЭтоПолноправныйПользователь() Тогда
		// Добавление отбора пользователей, подготовленных ответственным за список.
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ВнешниеПользователиСписок, "Подготовлен", Истина, ,
			НСтр("ru = 'Подготовленные ответственным за список'"), Ложь,
			РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
	КонецЕсли;
	
	// Скрытие пользователей с пустым идентификатором, если значение параметра Истина.
	Если Параметры.СкрытьПользователейБезПользователяИБ Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ВнешниеПользователиСписок,
			"ИдентификаторПользователяИБ",
			ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(),
			ВидСравненияКомпоновкиДанных.НеРавно);
	КонецЕсли;
	
	ОформитьИСкрытьНедействительныхВнешнихПользователей();
	НастроитьПараметрыСпискаВнешнихПользователейДляКомандыУстановитьПароль();
	НастроитьПорядокГруппыВсеВнешниеПользователи(ГруппыВнешнихПользователей);
	
	ХранимыеПараметры.РасширенныйПодбор = Параметры.РасширенныйПодбор;
	Элементы.ВыбранныеПользователиИГруппы.Видимость = ХранимыеПараметры.РасширенныйПодбор;
	Элементы.ВидПользователей.Видимость = Не ХранимыеПараметры.РасширенныйПодбор;
	
	Если Не ПравоДоступа("Редактирование", Метаданные.Справочники.ГруппыВнешнихПользователей) Тогда
		Элементы.ВнешниеПользователиСписокКонтекстноеМенюНазначитьГруппы.Видимость = Ложь;
		Элементы.НазначитьГруппы.Видимость = Ложь;
	КонецЕсли;
	
	РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
	Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда
		Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда
			Элементы.ПользователиИБ.Видимость = Ложь;
		КонецЕсли;
		Элементы.СведенияОВнешнихПользователях.Видимость = Ложь;
	КонецЕсли;
	
	Если Параметры.РежимВыбора Тогда
		
		Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда
			Элементы.ПользователиИБ.Видимость = Ложь;
		КонецЕсли;
		Элементы.СведенияОВнешнихПользователях.Видимость = Ложь;
		Элементы.ГруппыВнешнихПользователей.РежимВыбора = ХранимыеПараметры.ВыборГруппВнешнихПользователей;
		
		// Скрытие переданного пользователя из формы выбора пользователей.
		Если ТипЗнч(Параметры.СкрываемыеПользователи) = Тип("СписокЗначений") Тогда
			ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
				ВнешниеПользователиСписок,
				"Ссылка",
				Параметры.СкрываемыеПользователи,
				ВидСравненияКомпоновкиДанных.НеВСписке);
		КонецЕсли;
		
		// Отключение перетаскивания пользователя в формах выбора и подбора пользователей.
		Элементы.ВнешниеПользователиСписок.РазрешитьНачалоПеретаскивания = Ложь;
		
		Если ЗначениеЗаполнено(Параметры.ИдентификаторыНесуществующихПользователейИБ) Тогда
			ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
				ВнешниеПользователиСписок, "ИдентификаторПользователяИБ",
				Параметры.ИдентификаторыНесуществующихПользователейИБ,
				ВидСравненияКомпоновкиДанных.ВСписке, , Истина,
				РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
		КонецЕсли;
		
		Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда
			// Режим подбора.
			Элементы.ВнешниеПользователиСписок.МножественныйВыбор = Истина;
			
			Если ХранимыеПараметры.РасширенныйПодбор Тогда
				СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "РасширенныйПодбор");
				ИзменитьПараметрыРасширеннойФормыПодбора();
			КонецЕсли;
			
			Если ХранимыеПараметры.ВыборГруппВнешнихПользователей Тогда
				Элементы.ГруппыВнешнихПользователей.МножественныйВыбор = Истина;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Элементы.ВнешниеПользователиСписок.РежимВыбора  = Ложь;
		Элементы.ГруппыВнешнихПользователей.РежимВыбора = Ложь;
		Элементы.Комментарии.Видимость = Ложь;
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьВнешнегоПользователя", "Видимость", Ложь);
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьГруппуВнешнихПользователей", "Видимость", Ложь);
	КонецЕсли;
	
	НастроитьФормуПоИспользованиюГруппПользователей(Ложь, Истина);
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов")
	 Или Не Пользователи.ЭтоПолноправныйПользователь() Тогда
		
		Элементы.ФормаИзменитьВыделенные.Видимость = Ложь;
		Элементы.ВнешниеПользователиСписокКонтекстноеМенюИзменитьВыделенные.Видимость = Ложь;
	КонецЕсли;
	
	ОписаниеОбъекта = Новый Структура;
	ОписаниеОбъекта.Вставить("Ссылка", Справочники.Пользователи.ПустаяСсылка());
	ОписаниеОбъекта.Вставить("ИдентификаторПользователяИБ", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ОписаниеОбъекта);
	
	Если Не УровеньДоступа.УправлениеСписком Тогда
		Элементы.ФормаУстановитьПароль.Видимость = Ложь;
		Элементы.ВнешниеПользователиСписокКонтекстноеМенюУстановитьПароль.Видимость = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ЗавершитьИЗакрыть.Отображение = ОтображениеКнопки.Картинка;
	КонецЕсли;
	
	ПользователиСлужебный.НастроитьПолеНомерКартинкиДинамическогоСписка(ВнешниеПользователиСписок);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если Параметры.РежимВыбора Тогда
		ПроверкаИзмененияТекущегоЭлементаФормы();
	КонецЕсли;
	
#Если МобильныйКлиент Тогда
	Если ХранимыеПараметры.ИспользоватьГруппы Тогда
		Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные = Неопределено,
			НСтр("ru = 'Группы внешних пользователей'"),
			Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка));
	КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыВнешнихПользователей")
	   И Источник = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока
	 Или ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах")
	 Или ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда
		
		Элементы.ГруппыВнешнихПользователей.Обновить();
		Элементы.ВнешниеПользователиСписок.Обновить();
		ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
		
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") Тогда
		
		Если ВРег(Источник) = ВРег("ИспользоватьГруппыПользователей") Тогда
			ПодключитьОбработчикОжидания("ПриИзмененииИспользованияГруппПользователей", 0.1, Истина);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	Если ТипЗнч(Настройки["ВыбиратьИерархически"]) = Тип("Булево") Тогда
		ВыбиратьИерархически = Настройки["ВыбиратьИерархически"];
	КонецЕсли;
	
	Если НЕ ВыбиратьИерархически Тогда
		ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВыбиратьИерархическиПриИзменении(Элемент)
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьНедействительныхПользователейПриИзменении(Элемент)
	ПереключитьОтображениеНедействительныхПользователей(ПоказыватьНедействительныхПользователей);
КонецПроцедуры

&НаКлиенте
Процедура ВидПользователейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораНазначения", ЭтотОбъект);
	ПользователиСлужебныйКлиент.ВыбратьНазначение(ЭтотОбъект, НСтр("ru = 'Выбор вида пользователей'"), Ложь, Истина, ОписаниеОповещения);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыГруппыВнешнихПользователей

&НаКлиенте
Процедура ГруппыВнешнихПользователейПриИзменении(Элемент)
	
	СписокПриИзмененииНаСервере();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ГруппыВнешнихПользователейПриАктивизацииСтроки(Элемент)
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
#Если МобильныйКлиент Тогда
	Если Не ХранимыеПараметры.РасширенныйПодбор Тогда
		Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные = Неопределено,
			НСтр("ru = 'Группы внешних пользователей'"),
			Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка));
		ТекущийЭлемент = Элементы.ВнешниеПользователиСписок;
	КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ГруппыВнешнихПользователейПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыВнешнихПользователейПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	Если ВыбиратьИерархически Тогда
		ПоказатьПредупреждение(,
			НСтр("ru = 'Для перетаскивания пользователя в группы отключите
			           |флажок ""Показывать пользователей нижестоящих групп"".'"));
		Возврат;
	КонецЕсли;
	
	Если Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = Строка
		Или Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение Тогда
		Перемещение = Истина;
	Иначе
		Перемещение = Ложь;
	КонецЕсли;
	
	ТекущаяСтрокаГруппы = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока;
	ГруппаСТипомВсеОбъектыАвторизации = 
		Элементы.ГруппыВнешнихПользователей.ДанныеСтроки(ТекущаяСтрокаГруппы).ВсеОбъектыАвторизации;
	
	Если Строка = ХранимыеПараметры.ГруппаВсеПользователи
		И ГруппаСТипомВсеОбъектыАвторизации Тогда
		СообщениеПользователю = Новый Структура("Сообщение, ЕстьОшибки, Пользователи",
			НСтр("ru = 'Из групп с типом участников ""Все пользователи заданного типа"" исключение пользователей невозможно.'"),
			Истина,
			Неопределено);
	Иначе
		ГруппаПомеченаНаУдаление = Элементы.ГруппыВнешнихПользователей.ДанныеСтроки(Строка).ПометкаУдаления;
		КоличествоПользователей = ПараметрыПеретаскивания.Значение.Количество();
		ДействиеИсключитьПользователя = (ХранимыеПараметры.ГруппаВсеПользователи = Строка);
		ВключитьВГруппу = (ХранимыеПараметры.ГруппаВсеПользователи = ТекущаяСтрокаГруппы) ИЛИ ГруппаСТипомВсеОбъектыАвторизации;
		
		Если КоличествоПользователей = 1 Тогда
			Если ДействиеИсключитьПользователя Тогда
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Исключить пользователя ""%1"" из группы ""%2""?'"),
					Строка(ПараметрыПеретаскивания.Значение[0]),
					Строка(Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока));
				
			ИначеЕсли Не ГруппаПомеченаНаУдаление Тогда
				Если ВключитьВГруппу Тогда
					Шаблон = НСтр("ru = 'Включить пользователя ""%1"" в группу ""%2""?'");
				ИначеЕсли Перемещение Тогда
					Шаблон = НСтр("ru = 'Переместить пользователя ""%1"" в группу ""%2""?'");
				Иначе
					Шаблон = НСтр("ru = 'Скопировать пользователя ""%1"" в группу ""%2""?'");
				КонецЕсли;
				
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					Шаблон,
					Строка(ПараметрыПеретаскивания.Значение[0]),
					Строка(Строка));
			Иначе
				Если ВключитьВГруппу Тогда
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Включить пользователя ""%2"" в эту группу?'");
				ИначеЕсли Перемещение Тогда
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Переместить пользователя ""%2"" в эту группу?'");
				Иначе
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Скопировать пользователя ""%2"" в эту группу?'");
				КонецЕсли;
				
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					Шаблон,
					Строка(Строка),
					Строка(ПараметрыПеретаскивания.Значение[0]));
			КонецЕсли;
		Иначе
			Если ДействиеИсключитьПользователя Тогда
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Исключить пользователей (%1) из группы ""%2""?'"),
					КоличествоПользователей,
					Строка(Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока));
				
			ИначеЕсли Не ГруппаПомеченаНаУдаление Тогда
				Если ВключитьВГруппу Тогда
					Шаблон = НСтр("ru = 'Включить пользователей (%1) в группу ""%2""?'");
				ИначеЕсли Перемещение Тогда
					Шаблон = НСтр("ru = 'Переместить пользователей (%1) в группу ""%2""?'");
				Иначе
					Шаблон = НСтр("ru = 'Скопировать пользователей (%1) в группу ""%2""?'");
				КонецЕсли;
				
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					Шаблон,
					КоличествоПользователей,
					Строка(Строка));
			Иначе
				Если ВключитьВГруппу Тогда
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Включить пользователей (%2) в эту группу?'");
				ИначеЕсли Перемещение Тогда
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Переместить пользователей (%2) в эту группу?'");
				Иначе
					Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Скопировать пользователей (%2) в эту группу?'");
				КонецЕсли;
				
				ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					Шаблон,
					Строка(Строка),
					КоличествоПользователей);
			КонецЕсли;
		КонецЕсли;
		
		ДополнительныеПараметры = Новый Структура("ПараметрыПеретаскивания, Строка, Перемещение",
			ПараметрыПеретаскивания.Значение, Строка, Перемещение);
		Оповещение = Новый ОписаниеОповещения("ГруппыВнешнихПользователейПеретаскиваниеОбработкаВопроса", ЭтотОбъект, ДополнительныеПараметры);
		ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да);
		Возврат;
		
	КонецЕсли;
	
	ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВнешниеПользователи

&НаКлиенте
Процедура ВнешниеПользователиСписокПриИзменении(Элемент)
	
	СписокПриИзмененииНаСервере();
	
КонецПроцедуры

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

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

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

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

&НаСервереБезКонтекста
Процедура ВнешниеПользователиСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	ПользователиСлужебный.ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки);
	
КонецПроцедуры

&НаКлиенте
Процедура ВнешниеПользователиСписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокВыбранныхПользователейИГрупп

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	УдалитьИзСпискаВыбранных();
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СоздатьГруппуВнешнихПользователей(Команда)
	
	ТекущиеДанные = Элементы.ГруппыВнешнихПользователей.ТекущиеДанные;
	Если Не СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(ТекущиеДанные) Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ВсеОбъектыАвторизации Тогда
		ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Невозможно добавить подгруппу к группе ""%1"", 
			           |так как в число ее участников входят все пользователи выбранных видов.'"),
			ТекущиеДанные.Наименование));
		Возврат;
	КонецЕсли;
		
	Элементы.ГруппыВнешнихПользователей.ДобавитьСтроку();
	
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьПароль(Команда)
	
	ТекущиеДанные = Элементы.ВнешниеПользователиСписок.ТекущиеДанные;
	
	Если СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(ТекущиеДанные) Тогда
		ПользователиСлужебныйКлиент.ОткрытьФормуСменыПароля(ТекущиеДанные.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)
	
	Если ХранимыеПараметры.РасширенныйПодбор Тогда
		МассивПользователей = РезультатВыбора();
		ОповеститьОВыборе(МассивПользователей);
		Модифицированность = Ложь;
		Закрыть(МассивПользователей);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьПользователяКоманда(Команда)
	
	МассивПользователей = Элементы.ВнешниеПользователиСписок.ВыделенныеСтроки;
	ПолучитьКартинкиИЗаполнитьСписокВыбранных(МассивПользователей);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьВыборПользователяИлиГруппы(Команда)
	
		УдалитьИзСпискаВыбранных();
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьСписокВыбранныхПользователейИГрупп(Команда)
	
	УдалитьИзСпискаВыбранных(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьГруппу(Команда)
	
	МассивГрупп = Элементы.ГруппыВнешнихПользователей.ВыделенныеСтроки;
	ПолучитьКартинкиИЗаполнитьСписокВыбранных(МассивГрупп);
	
КонецПроцедуры

&НаКлиенте
Процедура СведенияОВнешнихПользователях(Команда)
	
	ОткрытьФорму(
		"Отчет.СведенияОПользователях.ФормаОбъекта",
		Новый Структура("КлючВарианта", "СведенияОВнешнихПользователях"),
		ЭтотОбъект,
		"СведенияОВнешнихПользователях");
	
КонецПроцедуры

#Область ПоддержкаГрупповогоИзмененияОбъектов

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

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Возвращаемое значение:
//   Структура:
//   * ВыборГруппВнешнихПользователей - Булево
//   * ОтборОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь
//   * РасширенныйПодбор - Булево
//   * ЗаголовокФормыПодбора - Строка
//   * ГруппаВсеПользователи - СправочникСсылка.ГруппыВнешнихПользователей
//   * ИспользоватьГруппы - Булево
//
&НаСервере
Функция НовыйХранимыеПараметры()
	
	ХранимыеПараметры = Новый Структура;
	ХранимыеПараметры.Вставить("ВыборГруппВнешнихПользователей", Параметры.ВыборГруппВнешнихПользователей);
	ХранимыеПараметры.Вставить("ОтборОбъектАвторизации", 
		?(Параметры.Отбор.Свойство("ОбъектАвторизации"), Параметры.Отбор.ОбъектАвторизации, Неопределено));
	ХранимыеПараметры.Вставить("РасширенныйПодбор", Ложь);
	ХранимыеПараметры.Вставить("ЗаголовокФормыПодбора", "");
	ХранимыеПараметры.Вставить("ГруппаВсеПользователи", ВнешниеПользователи.ГруппаВсеВнешниеПользователи());
	ХранимыеПараметры.Вставить("ИспользоватьГруппы", ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей"));
	Возврат ХранимыеПараметры;
	
КонецФункции

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

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

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

&НаСервере
Процедура НастроитьПорядокГруппыВсеВнешниеПользователи(Список)
	
	Перем Порядок;
	
	// Порядок.
	Порядок = Список.КомпоновщикНастроек.Настройки.Порядок;
	Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок";
	
	Порядок.Элементы.Очистить();
	
	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Предопределенный");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ЭлементПорядка.Использование = Истина;
	
	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Наименование");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ЭлементПорядка.Использование = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверкаИзмененияТекущегоЭлементаФормы()
	
	Если ТекущийЭлемент <> ПоследнийЭлемент Тогда
		ПриИзмененииТекущегоЭлементаФормы();
		ПоследнийЭлемент = ТекущийЭлемент;
	КонецЕсли;
	
#Если ВебКлиент Тогда
	ПодключитьОбработчикОжидания("ПроверкаИзмененияТекущегоЭлементаФормы", 0.7, Истина);
#Иначе
	ПодключитьОбработчикОжидания("ПроверкаИзмененияТекущегоЭлементаФормы", 0.1, Истина);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииТекущегоЭлементаФормы()
	
	Если ТекущийЭлемент = Элементы.ГруппыВнешнихПользователей Тогда
		Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийГруппы;
		
	ИначеЕсли ТекущийЭлемент = Элементы.ВнешниеПользователиСписок Тогда
		Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийПользователя;
		
	КонецЕсли
	
КонецПроцедуры

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

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

&НаСервере
Функция РезультатВыбора()
	
	ВыбранныеПользователиТаблицаЗначений = ВыбранныеПользователиИГруппы.Выгрузить( , "Пользователь");
	МассивПользователей = ВыбранныеПользователиТаблицаЗначений.ВыгрузитьКолонку("Пользователь");
	Возврат МассивПользователей;
	
КонецФункции

&НаСервере
Процедура ИзменитьПараметрыРасширеннойФормыПодбора()
	
	// Загрузка списка выбранных пользователей.
	ПараметрыПодбора = ПользователиСлужебный.НовыеПараметрыРасширеннойФормыПодбора();
	Если ЗначениеЗаполнено(Параметры.ПараметрыРасширеннойФормыПодбора) Тогда
		УказанныеПараметры = ПолучитьИзВременногоХранилища(Параметры.ПараметрыРасширеннойФормыПодбора);
		Если ТипЗнч(УказанныеПараметры) = Тип("Структура") Тогда
			ЗаполнитьЗначенияСвойств(ПараметрыПодбора, УказанныеПараметры);
		КонецЕсли;
	Иначе
		ЗаполнитьЗначенияСвойств(ПараметрыПодбора, Параметры);
	КонецЕсли;
	Если ТипЗнч(ПараметрыПодбора.ВыбранныеПользователи) = Тип("Массив") Тогда
		Для Каждого ВыбранныйПользователь Из ПараметрыПодбора.ВыбранныеПользователи Цикл
			ВыбранныеПользователиИГруппы.Добавить().Пользователь = ВыбранныйПользователь;
		КонецЦикла;
		Пользователи.ЗаполнитьНомераКартинокПользователей(ВыбранныеПользователиИГруппы,
			"Пользователь", "НомерКартинки");
	КонецЕсли;
	ХранимыеПараметры.ЗаголовокФормыПодбора = ПараметрыПодбора.ЗаголовокФормыПодбора;
	
	// Установка параметров расширенной формы подбора.
	Элементы.ЗавершитьИЗакрыть.Видимость                      = Истина;
	Элементы.ГруппаВыбратьПользователя.Видимость              = Истина;
	// Включение видимости списка выбранных пользователей.
	Элементы.ВыбранныеПользователиИГруппы.Видимость           = Истина;
	ИспользоватьГруппыПользователей = ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей");
	Элементы.ГруппаВыбратьГруппу.Видимость                    = ИспользоватьГруппыПользователей;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ГруппыИПользователи.Группировка                 = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.ГруппыИПользователи.ВажностьПриОтображении      = ВажностьПриОтображении.ОченьВысокая;
		Элементы.ГруппаСодержимое.Группировка                              = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
		Элементы.ГруппаВыбратьГруппу.Видимость                   = Ложь;
		Элементы.ГруппаВыбратьПользователя.Видимость             = Ложь;
		Элементы.Переместить(Элементы.ВыбранныеПользователиИГруппы, Элементы.ГруппаСодержимое, Элементы.ВыбранныеПользователиИГруппы);
	ИначеЕсли ИспользоватьГруппыПользователей Тогда
		Элементы.ГруппыИПользователи.Группировка                 = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.ВнешниеПользователиСписок.Высота                = 5;
		Элементы.ГруппыВнешнихПользователей.Высота               = 3;
		Высота                                        = 17;
		// Включение отображения заголовков списков ПользователиСписок и ГруппыПользователей.
		Элементы.ГруппыВнешнихПользователей.ПоложениеЗаголовка   = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ВнешниеПользователиСписок.ПоложениеЗаголовка    = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ВнешниеПользователиСписок.Заголовок             = НСтр("ru = 'Пользователи в группе'");
		Элементы.ВыбратьГруппу.Видимость                         = ХранимыеПараметры.ВыборГруппВнешнихПользователей;
	Иначе
		Элементы.ОтменитьВыборПользователя.Видимость             = Истина;
		Элементы.ОчиститьСписокВыбранных.Видимость               = Истина;
	КонецЕсли;
	
	// Добавление количества выбранных пользователей в заголовке выбранных пользователей и групп.
	ОбновитьЗаголовокСпискаВыбранныхПользователейИГрупп();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЗаголовокСпискаВыбранныхПользователейИГрупп()
	
	Если ХранимыеПараметры.ИспользоватьГруппы Тогда
		ЗаголовокВыбранныеПользователиИГруппы = НСтр("ru = 'Выбранные пользователи и группы (%1)'");
	Иначе
		ЗаголовокВыбранныеПользователиИГруппы = НСтр("ru = 'Выбранные пользователи (%1)'");
	КонецЕсли;
	
	КоличествоПользователей = ВыбранныеПользователиИГруппы.Количество();
	Если КоличествоПользователей <> 0 Тогда
		Элементы.СписокВыбранныхПользователейИГрупп.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ЗаголовокВыбранныеПользователиИГруппы, КоличествоПользователей);
	Иначе
		
		Если ХранимыеПараметры.ИспользоватьГруппы Тогда
			Элементы.СписокВыбранныхПользователейИГрупп.Заголовок = НСтр("ru = 'Выбранные пользователи и группы'");
		Иначе
			Элементы.СписокВыбранныхПользователейИГрупп.Заголовок = НСтр("ru = 'Выбранные пользователи'");
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПриИзмененииИспользованияГруппПользователей()
	
	НастроитьФормуПоИспользованиюГруппПользователей(Истина);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФормуПоИспользованиюГруппПользователей(ИзменилосьИспользованиеГрупп = Ложь, 
		УстановитьТекущуюСтроку = Ложь)
	
	ГруппаВсеВнешниеПользователи = ВнешниеПользователи.ГруппаВсеВнешниеПользователи();
	
	Если ИзменилосьИспользованиеГрупп Тогда
		ХранимыеПараметры.ИспользоватьГруппы = ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей");
	КонецЕсли;
	
	Если УстановитьТекущуюСтроку Тогда
		Если ТипЗнч(Параметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") 
			И ХранимыеПараметры.ИспользоватьГруппы Тогда

			Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = Параметры.ТекущаяСтрока;
		Иначе
			ТекущийЭлемент = Элементы.ВнешниеПользователиСписок;
			Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ГруппаВсеВнешниеПользователи;
		КонецЕсли;
	ИначеЕсли НЕ ХранимыеПараметры.ИспользоватьГруппы Тогда
		Если Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока <> ГруппаВсеВнешниеПользователи Тогда
			Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ГруппаВсеВнешниеПользователи;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ВыбиратьИерархически.Видимость = ХранимыеПараметры.ИспользоватьГруппы;
	Элементы.НазначитьГруппы.Видимость = ?(ХранимыеПараметры.РасширенныйПодбор, Ложь, ХранимыеПараметры.ИспользоватьГруппы);
	
	Элементы.СоздатьГруппуВнешнихПользователей.Видимость =
		ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Справочники.ГруппыВнешнихПользователей)
		И ХранимыеПараметры.ИспользоватьГруппы;
	
	ВыборГруппВнешнихПользователей = ХранимыеПараметры.ВыборГруппВнешнихПользователей
		И ХранимыеПараметры.ИспользоватьГруппы
	 	И Параметры.РежимВыбора;
	
	Если Параметры.РежимВыбора Тогда
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьГруппуВнешнихПользователей", "Видимость", ?(ХранимыеПараметры.РасширенныйПодбор,
				Ложь, ВыборГруппВнешнихПользователей));
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьВнешнегоПользователя", "КнопкаПоУмолчанию", ?(ХранимыеПараметры.РасширенныйПодбор,
				Ложь, Не ВыборГруппВнешнихПользователей));
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьВнешнегоПользователя", "Видимость", Не ХранимыеПараметры.РасширенныйПодбор);
		
		АвтоЗаголовок = Ложь;
		
		Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда
			// Режим подбора.
			Если ВыборГруппВнешнихПользователей Тогда
				Заголовок = ?(ХранимыеПараметры.РасширенныйПодбор, ХранимыеПараметры.ЗаголовокФормыПодбора,
					НСтр("ru = 'Подбор внешних пользователей и групп'"));
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьВнешнегоПользователя", "Заголовок", НСтр("ru = 'Выбрать внешних пользователей'"));
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьГруппуВнешнихПользователей", "Заголовок", НСтр("ru = 'Выбрать группы'"));
			Иначе
				Заголовок = ?(ХранимыеПараметры.РасширенныйПодбор, ХранимыеПараметры.ЗаголовокФормыПодбора,
					НСтр("ru = 'Подбор внешних пользователей'"));
			КонецЕсли;
		Иначе
			// Режим выбора.
			Если ВыборГруппВнешнихПользователей Тогда
				Заголовок = НСтр("ru = 'Выбор внешнего пользователя или группы'");
				
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьВнешнегоПользователя", "Заголовок", НСтр("ru = 'Выбрать внешнего пользователя'"));
			Иначе
				Заголовок = НСтр("ru = 'Выбор внешнего пользователя'");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
	// Принудительное обновление видимости после изменения функциональной
	// опции без использования команды ОбновитьИнтерфейс.
	Элементы.ГруппыВнешнихПользователей.Видимость = Ложь;
	Элементы.ГруппыВнешнихПользователей.Видимость = Истина;
	
КонецПроцедуры

&НаСервере
Функция ПеремещениеПользователяВНовуюГруппу(МассивПользователей, НоваяГруппаВладелец, Перемещение)
	
	Если НоваяГруппаВладелец = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТекущаяГруппаВладелец = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока;
	СообщениеПользователю = ПользователиСлужебный.ПеремещениеПользователяВНовуюГруппу(
		МассивПользователей, ТекущаяГруппаВладелец, НоваяГруппаВладелец, Перемещение);
	
	Элементы.ВнешниеПользователиСписок.Обновить();
	Элементы.ГруппыВнешнихПользователей.Обновить();
	
	Возврат СообщениеПользователю;
	
КонецФункции

&НаКлиенте
Процедура ПереключитьОтображениеНедействительныхПользователей(ПоказатьНедействительных)
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		ВнешниеПользователиСписок, "Недействителен", Ложь, , ,
		НЕ ПоказатьНедействительных);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСодержимоеФормыПриИзмененииГруппы(Форма)
	
	Элементы = Форма.Элементы;
	ГруппаВсеВнешниеПользователи = ПредопределенноеЗначение(
		"Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи");
	
	Если НЕ Форма.ХранимыеПараметры.ИспользоватьГруппы
		ИЛИ Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ГруппаВсеВнешниеПользователи Тогда
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
			"ВсеВнешниеПользователи", Истина);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
			"ВыбиратьИерархически", Истина);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
			"ГруппаВнешнихПользователей", ГруппаВсеВнешниеПользователи);
	Иначе
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
			"ВсеВнешниеПользователи", Ложь);
		
#Если Сервер Тогда
		Если ЗначениеЗаполнено(Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока) Тогда
			ТекущиеДанные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
				Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока, "ВсеОбъектыАвторизации");
		Иначе
			ТекущиеДанные = Неопределено;
		КонецЕсли;
#Иначе
		ТекущиеДанные = Элементы.ГруппыВнешнихПользователей.ТекущиеДанные;
#КонецЕсли
		
		Если ТекущиеДанные <> Неопределено
		   И Не ТекущиеДанные.Свойство("ГруппировкаСтроки")
		   И ТекущиеДанные.ВсеОбъектыАвторизации Тогда
			
			ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
				"ВыбиратьИерархически", Истина);
		Иначе
			ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
				"ВыбиратьИерархически", Форма.ВыбиратьИерархически);
		КонецЕсли;
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ВнешниеПользователиСписок,
			"ГруппаВнешнихПользователей", Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока);
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Процедура СписокПриИзмененииНаСервере()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
		МодульУправлениеДоступомСлужебный.ЗапуститьОбновлениеДоступа();
	КонецЕсли;
	
КонецПроцедуры

#Область ПеретаскиваниеПользователей

// Обработчик вопроса.
// 
// Параметры:
//  Ответ - КодВозвратаДиалога
//  ДополнительныеПараметры - Структура:
//    * ПараметрыПеретаскивания - Массив из СправочникСсылка.ВнешниеПользователи
//    * Строка - СправочникСсылка.ГруппыВнешнихПользователей
//    * Перемещение - Булево
//
&НаКлиенте
Процедура ГруппыВнешнихПользователейПеретаскиваниеОбработкаВопроса(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу(
		ДополнительныеПараметры.ПараметрыПеретаскивания, ДополнительныеПараметры.Строка, ДополнительныеПараметры.Перемещение);
	ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю)
	
	Если СообщениеПользователю.Сообщение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Оповестить("Запись_ГруппыВнешнихПользователей");
	
	Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда
		ПоказатьОповещениеПользователя(
			НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.ДиалогИнформация);
	Иначе
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1
				|Следующие пользователи не были включены в выбранную группу:
				|%2'"), СообщениеПользователю.Сообщение, СообщениеПользователю.Пользователи), РежимДиалогаВопрос.ОК);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораНазначения(МассивТипов, ДополнительныеПараметры) Экспорт
	
	ЗаполнитьПараметрыДинамическихСписков(МассивТипов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВидПользователейОчистка(Элемент, СтандартнаяОбработка)
	
	ЗаполнитьПараметрыДинамическихСписков();
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.ВнешниеПользователиСписок);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.ВнешниеПользователиСписок);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.ВнешниеПользователиСписок);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

#КонецОбласти

#КонецОбласти