Ввод данных для расчета общего среднего заработка / Модуль

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

&НаКлиенте
Перем ТаблицаРедактируется;

&НаКлиенте
Перем ТекущееЗначение;

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

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

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

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

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

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

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

&НаКлиенте
Процедура ФиксПериодРасчетаВручнуюПриИзменении(Элемент)
	ФиксПериодРасчетаПриИзменении();
КонецПроцедуры

#Область РедактированиеПериодаРасчета

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

&НаКлиенте
Процедура НачалоПериодаРасчетаСтрокойНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура OK(Команда) 
	
	ВыбратьИЗакрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура Отмена(Команда)
	
	Модифицированность = Ложь;
	Закрыть();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьРасшифровкуГодовойПремии(Команда)
	
	ОткрытьФормуРасшифровкиДляГодовойПремии(Элементы.ГодовыеПремии.ТекущиеДанные);
	
КонецПроцедуры

&НаКлиенте
Процедура ДополнитьДанныеСреднегоЗаработка(Команда)

	ДополнитьПредположительно();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция РезультатРедактированияВремени(Форма)

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

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

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

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

#Область ЗаполнениеФормы

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

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

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

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

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

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

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

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

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

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

#Область ЧтениеДанныхУчетаСреднегоЗаработка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьИнформациюОбИндексации()
	
	// Формирует поясняющую надпись об индексации.
	
	ПредыдущийКоэффициент = 1;
	ИнфоНадписьКоэффициентыИндексации = "";
	ИндексСтроки = ДанныеОбИндексации.Количество() - 1;
	Пока ИндексСтроки >= 0 Цикл
		СтрокаИндексации = ДанныеОбИндексации[ИндексСтроки];
		Если СтрокаИндексации.КоэффициентИндексации <> ПредыдущийКоэффициент Тогда
			ТекстИндексации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru = '%1 года c коэффициентом %2'"), 
								Формат(КонецМесяца(СтрокаИндексации.Период) + 1, "ДФ='д ММММ гггг'"), 
								Формат(СтрокаИндексации.КоэффициентИндексации / ПредыдущийКоэффициент, "ЧДЦ=10"));
			ИнфоНадписьКоэффициентыИндексации = ТекстИндексации + Символы.ПС + ИнфоНадписьКоэффициентыИндексации;
			ПредыдущийКоэффициент = СтрокаИндексации.КоэффициентИндексации;
		КонецЕсли;	
		ИндексСтроки = ИндексСтроки - 1;
	КонецЦикла;	
	СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ИнфоНадписьКоэффициентыИндексации, 1);
	
	Элементы.СведенияОбИндексацииГруппа.Заголовок = ?(ЗначениеЗаполнено(ИнфоНадписьКоэффициентыИндексации), 
														НСтр("ru = 'Индексация заработка сотрудника выполнялась:'"), 
														НСтр("ru = 'Индексация заработка сотрудника не выполнялась'"));
														
	Элементы.КоэффициентыИндексацииИнформационныйТекст.Заголовок = ИнфоНадписьКоэффициентыИндексации;
	ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ПерейтиКДокументамИндексации", "Видимость", ЗначениеЗаполнено(ИнфоНадписьКоэффициентыИндексации));
	
КонецПроцедуры	

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

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

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

&НаСервере
Процедура УстановитьВидимостьГодовыхПремий()
	
	ЕстьСтрокиГодовыхПремий = ГодовыеПремии.Количество() > 0;
	Если Элементы.ГодовыеПремии.Видимость <> ЕстьСтрокиГодовыхПремий Тогда
		Элементы.ГодовыеПремии.Видимость = ЕстьСтрокиГодовыхПремий;
	КонецЕсли;
	
КонецПроцедуры

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

#Область ВспомогательныеПроцедурыИФункции

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПостфиксПоИмениЯчейки(ИмяЯчейки)
	
	Если СтрНайти(ИмяЯчейки, "Значение") > 0 Тогда 
		Возврат СтрЗаменить(ИмяЯчейки, "СреднийЗаработокЗначение", "");
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция МесяцПоПостфиксу(ПостфиксКолонки)
	Возврат Дата(Лев(ПостфиксКолонки, 4), Прав(ПостфиксКолонки, 2), 1);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция РедактируемаяСтрокаРасчетов(ИмяСтроки)
	ИменаРедактируемыхСтрок = НРег("НормаДнейПроизводственныйКалендарь, НормаЧасовПроизводственныйКалендарь");
	Возврат СтрНайти(ИменаРедактируемыхСтрок,НРег(ИмяСтроки)) <> 0;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПостфиксКолонки(Месяц)
	Возврат Формат(Месяц, "ДФ=ггггММ")
КонецФункции

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

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

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

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

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

&НаКлиенте
Процедура ОткрытьФормуРасшифровкиЗавершение(РезультатРедактирования, ДополнительныеПараметры) Экспорт 

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

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

&НаКлиенте
Процедура ОткрытьФормуРасшифровкиГодовойПремииЗавершение(РезультатРедактирования, ДополнительныеПараметры) Экспорт 

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

&НаКлиенте
Процедура АнализПремийЗавершение(РезультатРедактирования, ДополнительныеПараметры) Экспорт 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ДобавитьСтрокуНаСервере(ИдентификаторСтроки)
	
	ПоискСтрок = Новый Структура("Идентификатор", ИдентификаторСтроки);
	СоздатьСтроку(ОписаниеСтрок.НайтиСтроки(ПоискСтрок)[0]);
	
КонецПроцедуры

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

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

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

КонецПроцедуры		
		
&НаСервере
Функция ПараметрыАнализаПремий()

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

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

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

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