Индексация штатного расписания / Форма документа / Модуль формы

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры
	
#КонецОбласти

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

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

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

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

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

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

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

#Область РедактированиеМесяцаСтрокой

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

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

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

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

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

&НаКлиенте
Процедура МесяцСтрокойАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийПроцессыОбработкиДокументов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область РаботаСФормой

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьЗаголовокГруппыИндексируемыеПоказатели(Форма)
	
	Если Форма.Объект.ИндексируемыеПоказатели.Количество() > 0 Тогда
		ЗаголовокПоказателей =  НСтр("ru = 'Индексируемые показатели'") + ": ";
		Для каждого Показатель Из Форма.Объект.ИндексируемыеПоказатели Цикл
			ЗаголовокПоказателей = ЗаголовокПоказателей + Показатель.КраткоеНаименование + ", ";
		КонецЦикла;
	Иначе
		ЗаголовокПоказателей = НСтр("ru = 'Показатели не выбраны'") + " ";
	КонецЕсли;
	
	Форма.Элементы.ГруппаПоказатели.Заголовок = Лев(ЗаголовокПоказателей, СтрДлина(ЗаголовокПоказателей) - 2);
КонецПроцедуры

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

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


#Область РаботаСДаннымиФормы 

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

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

#Область ЗаполнитьПоказателиПоУмолчанию

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

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

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

&НаСервереБезКонтекста
Функция ОкруглениеПоУмолчаниюДляПоказателя(Показатель)
	Возврат Справочники.ПоказателиРасчетаЗарплаты.ОкруглениеПоУмолчаниюДляПоказателя(Показатель);
КонецФункции

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

// Процедура пересчитывает результаты индексации не изменяя состав строк.
// Если указана строка показателя редактируемого в текущий момент - пересчитывается только он.
//
&НаСервере
Процедура ПересчитатьФорму(СтрокаПересчитываемогоПоказателя = Неопределено)
	
	Если Объект.ИндексируемыеПоказатели.Количество() > 0 Тогда
		
		МассивИдентификаторовПозиций = Новый Массив;
		ПересчитатьЗначенияПоказателей(МассивИдентификаторовПозиций, СтрокаПересчитываемогоПоказателя);
		ПересчитатьФОТИСовокупныеТарифныеСтавки(МассивИдентификаторовПозиций)		
	КонецЕсли;
	
КонецПроцедуры

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

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

				КонецЕсли;
			Иначе 
				Если ЗначениеЗаполнено(ИндексируемыйПоказатель.ПутьКДанным) И ЗначениеЗаполнено(ПоказателиПозиции[ИндексируемыйПоказатель.ПутьКДанным + "ТекущееЗначение"]) Тогда
					
					МассивИдентификаторовПозиций.Добавить(ПоказателиПозиции["ИдентификаторСтрокиПозиции"]);
					
					ПоказателиПозиции[ИндексируемыйПоказатель.ПутьКДанным] = ИндексацияЗаработка.ИндексированноеЗначениеПоказателя(ПоказателиПозиции[ИндексируемыйПоказатель.ПутьКДанным + "ТекущееЗначение"],
																			Объект.КоэффициентИндексации, 
																			ОписаниеОкругленияПоказателя);
			КонецЕсли;
			КонецЕсли;				
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры    

&НаСервере
Процедура ДанныеВРеквизит()
	ДополнитьФормуПоказателиПозиций();
	ПоказателиПозицийВРеквизитФормы();
КонецПроцедуры	

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

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

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

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


#Область Серверные_обработчики_событий_формы

&НаКлиенте
Процедура ПриИзмененииМесяцаНачисления()
	ЗарплатаКадрыКлиент.КлючевыеРеквизитыЗаполненияФормыОчиститьТаблицы(ЭтотОбъект);
	ОбработатьИзменениеМесяцНачисления();
КонецПроцедуры

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

&НаКлиенте
Процедура ОбработчикОжиданияМесяцНачисленияПриИзменении()
	ПриИзмененииМесяцаНачисления();
КонецПроцедуры

&НаСервере
Процедура КоэффициентИндексацииПриИзмененииНаСервере()
	
	ПересчитатьФорму();
	
КонецПроцедуры

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

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

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

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

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


#Область КлючевыеРеквизитыЗаполненияФормы

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

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

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

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


#Область ФОТ  

&НаСервере
Процедура ПересчитатьФОТИСовокупныеТарифныеСтавки(ПересчитываемыеСтроки)
	
	ОбновитьФОТ(ПересчитываемыеСтроки);
	
	ПеренестиФОТВДанныеФормы();
	
КонецПроцедуры

&НаСервере
Процедура ПеренестиФОТВДанныеФормы(ИдентификаторСтрокиПозиции = Неопределено)
	
	ФОИспользоватьВилкуСтавокВШтатномРасписании = ПолучитьФункциональнуюОпцию("ИспользоватьВилкуСтавокВШтатномРасписании");

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

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

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

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

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

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

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

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

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