#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ДляВсехСтрок( ЗначениеРазрешено(ФизическиеЛица.ФизическоеЛицо, 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) + "]." + ИмяРеквизитаДатаНачала, , Отказ);
КонецЕсли;
КонецЦикла;
ПериодыДействияРеквизита.Добавить(Новый Структура("ДатаНачала,ДатаОкончания", ДатаНачала, ДатаОкончания));
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецЕсли