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