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