Изменение плановых начислений / Форма документа / Модуль формы

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

&НаКлиенте
Перем ИдентификаторЗамераПроведениеНеНужнаРегистрацияОшибки;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	ЗаполнитьДанныеФормыПоОрганизации();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ПодписиДокументовЭлементНажатие(Элемент) 
	ПодписиДокументовКлиент.РасширеннаяПодсказкаНажатие(ЭтаФорма, Элемент.Имя);
КонецПроцедуры
// Конец Обработчик подсистемы "ПодписиДокументов".

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Отбор = Новый Массив;
	Отбор.Добавить(Новый Структура("ЛевоеЗначение, ВидСравнения, ПравоеЗначение", "СпособВыполненияНачисления", ВидСравненияКомпоновкиДанных.ВСписке, МассивСпособовРасчета));

	ВыбратьНачисление("ДобавитьНачислениеВсемСотрудникамЗавершение", Отбор);
	
КонецПроцедуры

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

	ВыбратьНачисление("УдалитьНачислениеВсемСотрудникамЗавершение", Отбор);
	
КонецПроцедуры

&НаКлиенте
Процедура РасчетФОТПодробно(Команда)
	РасчетФОТПодробноНаСервере();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

	ЗаполнитьНачисленияПоказателиСотрудника(ТекущаяСтрока);
	
	УстановитьОтображениеНадписей();
	
КонецПроцедуры

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

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

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

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

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

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

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

#Область ПриПолученииДанныхНаСервере

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

#Область ДанныеСотрудниковВРеквизитФормы

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

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

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

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

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

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

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

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

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

#Область ДополнитьФормуИзменяемымиПоказателями

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

#Область ДобавитьРеквизитыПоказателей

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

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

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

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

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

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

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

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

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

#Область ДобавитьЭлементыПоказателей

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

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

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

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

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

	// Добавим значение показателя после индексации.
	ДобавитьЭлементЗначенияПоказателя(ПутьКДанным, ГруппаЗначенияПоказателя, Заголовок);
	
	// Добавим непроиндексированное (старое) значение показателя.
	ДобавитьЭлементЗначенияПоказателя(ПутьКДанным, ГруппаЗначенияПоказателя, Заголовок, Ложь);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформлениеПоказателя(ПутьКДанным)
	
	УстановитьУсловноеОформлениеПоказателяТолькоПросмотр(ПутьКДанным);
	УстановитьУсловноеОформлениеПоказателяТекст(ПутьКДанным);
	
КонецПроцедуры

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

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

&НаСервере
Функция ГруппаПоказателиСотрудников()
	Возврат Элементы.Найти("ГруппаПоказателиСотрудников");
КонецФункции 

&НаСервере
Функция ИмяРеквизитаПоказательИспользуется(ИмяРеквизита)
	Возврат ИмяРеквизита + "Используется";
КонецФункции 

&НаСервере
Функция ИмяРеквизитаТаблицаПоказателя(ИмяРеквизита)
	Возврат ИмяРеквизита + "Таблица";
КонецФункции 

&НаСервере
Функция ИмяРеквизитаПредставлениеТаблицы(ИмяРеквизита)
	Возврат ИмяРеквизита + "ПредставлениеТаблицы";
КонецФункции 

&НаСервере
Функция ИмяРеквизитаТабличноеПредставление(ИмяРеквизита)
	Возврат ИмяРеквизита + "ТабличноеПредставление";
КонецФункции 

&НаСервере
Функция ИмяТаблицыПоказатели()
	Возврат "Объект.Сотрудники";
КонецФункции 

&НаКлиентеНаСервереБезКонтекста
Функция ПрефиксЭлементаПоказателиСотрудников()
	Возврат "ЗначенияПоказателейСотрудников";
КонецФункции 

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

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

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

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

&НаСервере
Процедура НачисленияСотрудникаВСтроку(СтрокаСотрудника, НачисленияСотрудника, ПредставлениеПустойКоллекцииНачислений)
	
	Если НачисленияСотрудника.Количество() = 0 Тогда
		СтрокаСотрудника.ПредставлениеНачислений = ПредставлениеПустойКоллекцииНачислений;
		Возврат;
	КонецЕсли;
	
	ПредставлениеНачисленийСотрудника = "";
	ПредставлениеОтмененныхНачисленийСотрудника = "";
	ЕстьОтмененныеНачисления = Ложь;
	
	Для каждого СтрокаНачисления Из НачисленияСотрудника Цикл
		
		Если СтрокаНачисления.Действие = Перечисления.ДействияСНачислениямиИУдержаниями.Отменить Тогда
			
			ПредставлениеОтмененныхНачисленийСотрудника = ПредставлениеОтмененныхНачисленийСотрудника + СтрокаНачисления.Представление+ ", ";
			
			ЕстьОтмененныеНачисления = Истина;
			
		Иначе
			
			Если СтрокаНачисления.Размер = 0 Тогда
				ПредставлениеНачисленийСотрудника = ПредставлениеНачисленийСотрудника + СтрокаНачисления.Представление+ ", ";
			Иначе
				ПредставлениеНачисленийСотрудника = ПредставлениеНачисленийСотрудника + СтрокаНачисления.Представление + "=" + СтрокаНачисления.Размер + ", ";
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ПредставлениеНачисленийСотрудника = Лев(ПредставлениеНачисленийСотрудника, СтрДлина(ПредставлениеНачисленийСотрудника) - 2);
	Если ЕстьОтмененныеНачисления Тогда
		
		ПредставлениеОтмененныхНачисленийСотрудника = Лев(ПредставлениеОтмененныхНачисленийСотрудника, СтрДлина(ПредставлениеОтмененныхНачисленийСотрудника) - 2);
		
		Если Не ПустаяСтрока(ПредставлениеНачисленийСотрудника) Тогда
			ПредставлениеНачисленийСотрудника = ПредставлениеНачисленийСотрудника + "; ";
		КонецЕсли;
		
		ПредставлениеНачисленийСотрудника = ПредставлениеНачисленийСотрудника + СтрШаблон(НСтр("ru = 'Отменены: %1'"), ПредставлениеОтмененныхНачисленийСотрудника); 
		
	КонецЕсли;
	
	СтрокаСотрудника.ПредставлениеНачислений = ПредставлениеНачисленийСотрудника;
	
КонецПроцедуры

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

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

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

&НаСервере
Функция ПредставлениеПустойКоллекцииНачислений()
	
	Возврат НСтр("ru='Ввести'");	
	
КонецФункции

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

#Область РеквизитФормыВДанныеСотрудников

&НаСервере
Процедура РеквизитФормыВДанныеСотрудников(ОбъектПолучатель)
	
	Если ЕстьРедактируемыеПоказатели() Тогда
		РеквизитФормыВПоказателиСотрудников(ОбъектПолучатель); 
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура РеквизитФормыВПоказателиСотрудников(ОбъектПолучатель)
	
	Для каждого ПоказателиСотрудника Из Объект.Сотрудники Цикл
		РеквизитФормыВПоказателиСотрудника(ОбъектПолучатель.ПоказателиСотрудников, ПоказателиСотрудника);
		РеквизитФормыВНачисленияСотрудника(ОбъектПолучатель.НачисленияСотрудников, ПоказателиСотрудника);
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаСервере
Функция ЕстьРедактируемыеПоказатели()
	Возврат НЕ КолонкиПоказателей = Неопределено И КолонкиПоказателей.Количество() > 0;
КонецФункции

&НаСервере
Функция ПоказательИспользуется(ПоказателиСотрудника, Показатель)
	ИмяРеквизитаПоказательИспользуется = ИмяРеквизитаПоказательИспользуется(Показатель);
	Возврат ПоказателиСотрудника[ИмяРеквизитаПоказательИспользуется];
КонецФункции

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

#Область ЗаполнитьНачисленияПоказатели

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

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

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

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

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

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

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

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

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

#Область ФормаРедактированияСоставаНачисленийИУдержаний

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

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

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

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

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

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

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

&НаСервере
Функция НайтиПоЗначениюПоляВКоллекцииСтруктур(Коллекция, Поле, Значение)
	
	НайденнаяСтруктура = Неопределено;
	
	Для каждого Структура Из Коллекция Цикл
		Если Структура.Свойство(Поле) 
			И Структура[Поле] = Значение Тогда
			НайденнаяСтруктура = Структура;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат НайденнаяСтруктура;
	
КонецФункции

&НаСервере
Процедура ДобавитьБухучетНачислений(ФильтрСотрудников, МассивНачислений)

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

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

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

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

#Область ФормаРедактированияПлановогоПоказателяПоДокументамОснованиям

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

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

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

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

#Область ПлановыеНачисленияПоказателиСотрудниковСИзменениямиДокумента

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

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

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

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

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

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

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

#Область ДобавитьУдалитьНачислениеВсемСотрудникам

#Область ДобавитьНачислениеВсемСотрудникам

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

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

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

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

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

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

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

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

	Возврат ЭтоПостоянныйПоказатель;
	
КонецФункции
	
#КонецОбласти

#Область УдалитьНачислениеВсемСотрудникам

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

&НаСервере
Процедура УдалитьНачислениеВсемСотрудникамНаСервере(РезультатЗакрытия)
	
	РеквизитФормыВДанныеСотрудников(Объект);

	УдаляемыеСтроки = Новый Массив;
	
	ПредставлениеНачислений = ПредставлениеНачислений(РезультатЗакрытия.ДобавленныеВидыРасчета);
	Отбор = Новый Структура("Начисление");

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

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

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

#Область ФОТ

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

			ДанныеНачисления = ТаблицаНачислений.Добавить();
			ДанныеНачисления.Сотрудник = СтрокаСотрудника.Сотрудник;
			ДанныеНачисления.ГоловнаяОрганизация = ГоловнаяОрганизация;
			ДанныеНачисления.Период = ВремяРегистрации;
			ДанныеНачисления.Начисление = СтрокаНачисления.Начисление;
			ДанныеНачисления.ДокументОснование = СтрокаНачисления.ДокументОснование;
			ДанныеНачисления.Размер = СтрокаНачисления.Размер;
			
			Если Не РассчитатьФОТ Тогда
				ДанныеНачисления.ВкладВФОТ = ДанныеНачисления.Размер;
			КонецЕсли;	
		КонецЦикла;

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

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

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

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


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

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

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

#Область СовокупнаяТарифнаяСтавка

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

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

			ДанныеНачисления = ТаблицаНачислений.Добавить();
			ДанныеНачисления.Сотрудник = СтрокаСотрудника.Сотрудник;
			ДанныеНачисления.ГоловнаяОрганизация = ГоловнаяОрганизация;
			ДанныеНачисления.Период = ВремяРегистрации;
			ДанныеНачисления.Начисление = СтрокаНачисления.Начисление;
			ДанныеНачисления.ДокументОснование = СтрокаНачисления.ДокументОснование;
			ДанныеНачисления.Размер = СтрокаНачисления.Размер;
		КонецЦикла;

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

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

#Область УдалитьНачисленияПоказателиСотрудника

&НаСервере
Функция УдалитьНачисленияПоСотруднику(ИдентификаторСтрокиСотрудника)
	
	ОтборПоСотруднику = Новый Структура("ИдентификаторСтрокиСотрудника", ИдентификаторСтрокиСотрудника);
	
	СтрокиДляУдаления = Объект.НачисленияСотрудников.НайтиСтроки(ОтборПоСотруднику);
	Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
		Объект.НачисленияСотрудников.Удалить(СтрокаДляУдаления);
	КонецЦикла;

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

&НаСервере
Функция УдалитьПоказателиПоСотруднику(ИдентификаторСтрокиСотрудника)
	
	ОтборПоСотруднику = Новый Структура("ИдентификаторСтрокиСотрудника", ИдентификаторСтрокиСотрудника);
	
	СтрокиДляУдаления = Объект.ПоказателиСотрудников.НайтиСтроки(ОтборПоСотруднику);
	Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
		Объект.ПоказателиСотрудников.Удалить(СтрокаДляУдаления);
	КонецЦикла;

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

&НаСервере
Функция УдалитьБухучетПоСотруднику(ИдентификаторСтрокиСотрудника)
	
	ОтборПоСотруднику = Новый Структура("ИдентификаторСтрокиСотрудника", ИдентификаторСтрокиСотрудника);
	
	СтрокиДляУдаления = Объект.БухучетНачислений.НайтиСтроки(ОтборПоСотруднику);
	Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
		Объект.БухучетНачислений.Удалить(СтрокаДляУдаления);
	КонецЦикла;

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

&НаСервере
Функция ЕстьУдаляемыеСотрудники()
	Возврат НЕ (УдаляемыеСотрудники = Неопределено Или УдаляемыеСотрудники.Количество() = 0);
КонецФункции

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

&НаСервере
Процедура ЗафиксироватьУдаляемыхСотрудников(МассивУдаляемыхСотрудников)
	УдаляемыеСотрудники = Новый ФиксированныйМассив(МассивУдаляемыхСотрудников);	
КонецПроцедуры

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

&НаСервере
Процедура УдалитьБухучетНачисленийПоСотруднику(ИдентификаторСтрокиСотрудника)

	ОтборПоСотруднику = Новый Структура("ИдентификаторСтрокиСотрудника", ИдентификаторСтрокиСотрудника);
	
	СтрокиДляУдаления = Объект.БухучетНачислений.НайтиСтроки(ОтборПоСотруднику);
	Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
		Объект.БухучетНачислений.Удалить(СтрокаДляУдаления);
	КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ПредставлениеНачислений(Начисления)
	
	Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъектов(Начисления, "КраткоеНаименование,РеквизитДопУпорядочивания");
	
КонецФункции

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

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

&НаСервере
Функция ВремяРегистрацииСотрудников()
	
	ВремяРегистрацииСотрудников = Новый Соответствие;
	
	Для каждого Строка Из Объект.Сотрудники Цикл
		ВремяРегистрацииСотрудников.Вставить(Строка.ИдентификаторСтрокиСотрудника, Строка.ВремяРегистрации);
	КонецЦикла;
	
	Возврат ВремяРегистрацииСотрудников;
	
КонецФункции

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

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

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

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

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

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

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

&НаСервере
Функция КоличествоСотрудниковДляЗаполненияДоТекущейСтроки()
	Возврат 10;
КонецФункции

&НаСервере
Функция КоличествоСотрудниковДляЗаполненияПослеТекущейСтроки()
	Возврат 10;
КонецФункции

&НаСервере
Процедура РассчитатьКоэффициентИндексации(СтрокаСотрудника)
	
	СтрокаСотрудника.КоэффициентИндексации = УчетСреднегоЗаработкаКлиентСервер.КоэффициентИндексацииЗаработка(
		СтрокаСотрудника.СовокупнаяТарифнаяСтавка, СтрокаСотрудника.СовокупнаяТарифнаяСтавкаТекущееЗначение);
	
КонецПроцедуры

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

#Область ОтображаемыеПоказатели

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

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

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

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

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

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

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

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

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

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

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

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