Сотрудники / Форма выбора / Модуль формы

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

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

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

&НаКлиенте
Процедура ПриЗакрытии()
	
	Если ВыбранныеСотрудники.Количество() > 0 Тогда
		ОповеститьОВыборе(ВыбранныеСотрудники.ВыгрузитьЗначения());
	КонецЕсли; 
	
КонецПроцедуры

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


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

&НаКлиенте
Процедура ПериодРаботыДатаНачалаПриИзменении(Элемент)
	
	Если ПериодРаботы.ДатаОкончания < ПериодРаботы.ДатаНачала Тогда
		ПериодРаботы.ДатаОкончания = ПериодРаботы.ДатаНачала;
	КонецЕсли; 
	УстановитьПараметрыОтбораПоПериоду();
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодРаботыДатаОкончанияПриИзменении(Элемент)
	
	Если ПериодРаботы.ДатаНачала > ПериодРаботы.ДатаОкончания Тогда
		ПериодРаботы.ДатаНачала = ПериодРаботы.ДатаОкончания;
	КонецЕсли; 
	УстановитьПараметрыОтбораПоПериоду();
	
КонецПроцедуры

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

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

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

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

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


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

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

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


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

&НаКлиенте
Процедура ТаблицаГруппСотрудниковПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("УстановитьОтборПоГруппеСотрудников", 0.1, Истина);
	
КонецПроцедуры

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

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


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

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

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

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

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

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


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

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

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

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

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

&НаКлиенте
Процедура Изменить(Команда)
	
	Если Элементы.Список.ВыделенныеСтроки.Количество() = 1 Тогда
		
		ВыделеннаяСтрока = Элементы.Список.ДанныеСтроки(Элементы.Список.ВыделенныеСтроки[0]);
		ПоказатьЗначение(, ВыделеннаяСтрока.Ссылка);
		
	КонецЕсли;
		
КонецПроцедуры

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

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

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


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

&НаКлиенте
Процедура ПометитьНаУдалениеСнятьПометкуНаУдалениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		ПометитьНаУдалениеСнятьПометкуНаУдалениеНаСервере(ДополнительныеПараметры.СписокСотрудников, ДополнительныеПараметры.ПометкаУдаления);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

#Область ОбслуживаниеСпискаПодобранныхСотрудников

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

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

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

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

Связанные материалы