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

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

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

#Область СлужебныйПрограммныйИнтерфейс

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

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

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

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

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

#Область Печать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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