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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПервыйГодПриИзменении(Элемент)
	
	ПриИзмененииГодовПериодаРасчета(БылПервыйГод, "ПервыйГод");
	БылПервыйГод = ПервыйГод;

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

&НаКлиенте
Процедура ВторойГодПриИзменении(Элемент)
	
	ПриИзмененииГодовПериодаРасчета(БылВторойГод, "ВторойГод");
	БылВторойГод = ВторойГод;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Возврат ДанныеДляРасчета;
	
КонецФункции	

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьФлажкаПереноситьВДругойПорядокРасчета(Форма)
	
	Если Форма.ПорядокРасчета = ПредопределенноеЗначение("Перечисление.ПорядокРасчетаСреднегоЗаработкаФСС.Постановление2010") Тогда
		// Если это форма для порядка Постановление2010, то не меняем доступность.
		Возврат;
	КонецЕсли;
	
	// Расчет по правилам Постановление2010 доступен
	// - безусловно для всех событий, произошедших раньше 1.01.2011,
	// - по выбору пользователя для событий, произошедших в период с 1.01.2011 по 1.01.2013.

	// Соответственно, годы, данные за которые могут быть востребованными при расчете по правилам 2010 года при расчете по
	// правилам 2011,  это: 2009, 2010, 2011.
	// Нужно сделать флажок сброшенным и недоступным, если не выбрано ни одного их этих годов.	
	
	ГодыДоступенПеренос = Новый Массив;
	ГодыДоступенПеренос.Добавить(2009);
	ГодыДоступенПеренос.Добавить(2010);
	ГодыДоступенПеренос.Добавить(2011);
	
	ГодыРасчета = ГодыРасчета(Форма);
	
	ДоступностьПереносаВДругойПорядокРасчета = Ложь;
	Для Каждого Год Из ГодыРасчета Цикл
		Если ГодыДоступенПеренос.Найти(Год) <> Неопределено Тогда
			ДоступностьПереносаВДругойПорядокРасчета = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Форма.Элементы.ПереноситьВДругойПорядокРасчета.Доступность = ДоступностьПереносаВДругойПорядокРасчета;
	
	Если Не ДоступностьПереносаВДругойПорядокРасчета Тогда
		Форма.ПереноситьВДругойПорядокРасчета = Ложь;
	КонецЕсли;
	
КонецПроцедуры

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

#Область ЗаполнениеДанныхДляРасчетаСреднегоПоДаннымУчета

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

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

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

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

#Область ТаблицаСреднийЗаработок

&НаКлиенте
Процедура Подключаемый_СреднийЗаработокЗначениеПриИзменении(Элемент)
	
	ПриИзмененииЗначенияВЯчейке(Элемент);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

	Если РезультатРедактирования = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеСтроки = ДополнительныеПараметры.ДанныеСтроки;
	Месяц = ДополнительныеПараметры.Месяц;
	ИмяЯчейки = ДополнительныеПараметры.ИмяЯчейки;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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