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