Штатное расписание / Форма списка / Модуль формы

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

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

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


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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

&НаКлиенте
Процедура ОткрытьСписокДокументовУтверждениеШтатногоРасписания(Команда)
	
	ОткрытьФорму("Документ.УтверждениеШтатногоРасписания.ФормаСписка");
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСписокДокументовИзменениеШтатногоРасписания(Команда)
	
	ОткрытьФорму("Документ.ИзменениеШтатногоРасписания.ФормаСписка");
	
КонецПроцедуры

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

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

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

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

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

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

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


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

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

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

&НаСервереБезКонтекста
Процедура СохранитьНастройкиНаСервере(Настройки)
	
	Для Каждого КлючИЗначение Из Настройки Цикл
		ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("СписокПозицийШтатногоРасписания", КлючИЗначение.Ключ, КлючИЗначение.Значение);
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПоследнийПодходящийДокументИзменения(ОтборОрганизация)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	МАКСИМУМ(УтверждениеШтатногоРасписания.МесяцВступленияВСилу) КАК МесяцВступленияВСилу
		|ПОМЕСТИТЬ ВТМаксимальныйПериодУтвержденияШтатногоРасписания
		|ИЗ
		|	Документ.УтверждениеШтатногоРасписания КАК УтверждениеШтатногоРасписания
		|ГДЕ
		|	УтверждениеШтатногоРасписания.Организация = &ОтборОрганизация
		|	И УтверждениеШтатногоРасписания.Проведен
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	ИзменениеШтатногоРасписания.Ссылка
		|ИЗ
		|	Документ.ИзменениеШтатногоРасписания КАК ИзменениеШтатногоРасписания
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимальныйПериодУтвержденияШтатногоРасписания КАК ВТМаксимальныйПериодУтвержденияШтатногоРасписания
		|		ПО ИзменениеШтатногоРасписания.ДатаВступленияВСилу > ВТМаксимальныйПериодУтвержденияШтатногоРасписания.МесяцВступленияВСилу
		|ГДЕ
		|	НЕ ИзменениеШтатногоРасписания.ПометкаУдаления
		|	И (НЕ ИзменениеШтатногоРасписания.Проведен
		|			ИЛИ ИзменениеШтатногоРасписания.ДатаВступленияВСилу >= &МесяцВступленияВСилу)
		|	И ИзменениеШтатногоРасписания.Организация = &ОтборОрганизация
		|
		|УПОРЯДОЧИТЬ ПО
		|	ИзменениеШтатногоРасписания.ДатаВступленияВСилу УБЫВ";
	
	Запрос.УстановитьПараметр("ОтборОрганизация", ОтборОрганизация);
	Запрос.УстановитьПараметр("МесяцВступленияВСилу", НачалоМесяца(ДобавитьМесяц(ТекущаяДатаСеанса(), 1)));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		
		Возврат Выборка.Ссылка;
		
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПоследнийНеПроведенныйДокументУтверждения(ОтборОрганизация)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	УтверждениеШтатногоРасписания.Ссылка
		|ИЗ
		|	Документ.УтверждениеШтатногоРасписания КАК УтверждениеШтатногоРасписания
		|ГДЕ
		|	НЕ УтверждениеШтатногоРасписания.ПометкаУдаления
		|	И НЕ УтверждениеШтатногоРасписания.Проведен
		|	И УтверждениеШтатногоРасписания.Организация = &ОтборОрганизация
		|
		|УПОРЯДОЧИТЬ ПО
		|	УтверждениеШтатногоРасписания.МесяцВступленияВСилу УБЫВ";
	
	Запрос.УстановитьПараметр("ОтборОрганизация", ОтборОрганизация);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		
		Возврат Выборка.Ссылка;
		
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПоследнийДокументУтверждения(ОтборОрганизация)
	
	ПоследнийДокументУтверждения = Новый Структура;
	ПоследнийДокументУтверждения.Вставить("Ссылка", Документы.УтверждениеШтатногоРасписания.ПустаяСсылка());
	ПоследнийДокументУтверждения.Вставить("ДатаУтверждения", '00010101');
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	УтверждениеШтатногоРасписания.Ссылка,
	|	УтверждениеШтатногоРасписания.МесяцВступленияВСилу КАК ДатаУтверждения
	|ИЗ
	|	Документ.УтверждениеШтатногоРасписания КАК УтверждениеШтатногоРасписания
	|ГДЕ
	|	УтверждениеШтатногоРасписания.Проведен
	|	И УтверждениеШтатногоРасписания.Организация = &ОтборОрганизация
	|
	|УПОРЯДОЧИТЬ ПО
	|	УтверждениеШтатногоРасписания.МесяцВступленияВСилу УБЫВ";
	
	Запрос.УстановитьПараметр("ОтборОрганизация", ОтборОрганизация);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		
		ЗаполнитьЗначенияСвойств(ПоследнийДокументУтверждения, Выборка);
		
	КонецЕсли; 
	
	Возврат ПоследнийДокументУтверждения;
	
КонецФункции

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

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

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

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

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

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

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

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

&НаСервере
Функция ПозицииПоПодразделениюУтверждались(Подразделение)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	ШтатноеРасписание.Ссылка КАК Количество
		|ИЗ
		|	Справочник.ШтатноеРасписание КАК ШтатноеРасписание
		|ГДЕ
		|	ШтатноеРасписание.Подразделение = &Подразделение
		|	И НЕ ШтатноеРасписание.ГруппаПозицийПодразделения";
		
	Запрос.УстановитьПараметр("Подразделение", Подразделение);
	
	Возврат НЕ Запрос.Выполнить().Пустой();
	
КонецФункции

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

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

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

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

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

&НаКлиенте
Процедура УтвердитьПозицииЗавершение(ДатаУтверждения, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(ДатаУтверждения) Тогда
		
		КоличествоУтвержденныхПозиций = УтвердитьВыделенныеПозиции(ДатаУтверждения);
		Если КоличествоУтвержденныхПозиций = 0 Тогда
			Пояснение = НСтр("ru='Среди выбранных позиций нет подходящих для утверждения'") + ".";
		Иначе
			Пояснение = ЧислоПрописью(КоличествоУтвержденныхПозиций, "L=ru_RU", НСтр("ru='позиция утверждена,позиции утверждены,позиций утверждено,ж'") + ",,,,,0") + " " + НСтр("ru='с'") + " " + Формат(ДатаУтверждения, "ДЛФ=DD");
		КонецЕсли; 
		
		ПоказатьОповещениеПользователя(НСтр("ru='Утверждение позиций'") + ":", , Пояснение, БиблиотекаКартинок.Информация32);
	
	КонецЕсли; 
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбновитьСтруктуруШтатногоРасписания(Команда)
	
	ОбновитьСтруктуруШтатногоРасписанияНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьСтруктуруШтатногоРасписанияНаСервере()
	
	// Обновляются сведения о подчиненности подразделений
	РегистрыСведений.ПодчиненностьПодразделенийОрганизаций.ПерезаполнитьПодчиненностьПодразделений();
	
	// Обновляется структура штатного расписания
	Справочники.ШтатноеРасписание.ОбновитьСтруктуруШтатногоРасписания();
	
	Элементы.Список.Обновить();
	
КонецПроцедуры

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

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