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