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