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