Компенсация за задержку выплаты заработной платы / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьКомпенсации() Экспорт
	
	Сотрудники = СотрудникиПоШапкеДокумента();
	НевыплаченнаяЗарплата = НевыплаченнаяЗарплата(Сотрудники);
	КомпенсацияЗаЗадержку = КомпенсацияЗаЗадержкуЗарплаты(НевыплаченнаяЗарплата);
	ЗаполнитьКомпенсацией(КомпенсацияЗаЗадержку);
	
КонецПроцедуры	

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

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

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

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

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

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

Функция КомпенсацияЗаЗадержкуЗарплаты(Зарплата)
	
	ДлинаСуток = 86400;
	
	ДеньВыплаты = НачалоДня(ПланируемаяДатаВыплаты);
	
	КомпенсацияЗаЗадержкуЗарплаты = Начисления.ВыгрузитьКолонки();

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

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

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

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

Функция ПериодыИзмененияСтавкиОбщие(ПервыйДеньЗадержки, ДеньВыплаты)
	
	ДлинаСуток = 86400;
	
	Дата272ФЗ = '20161003';
	ДоляСтавкиЦБДо272ФЗ = 300;
	ДоляСтавкиЦБПо272ФЗ = 150;
	
	ПериодыИзмененияСтавки = НовыеПериодыИзмененияСтавки();

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

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

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

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

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

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

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

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

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

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

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

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

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