Имя: Пароль:
1C
1С v8
(ЗУП 2.5) Рассчет НДФЛ
0 vechiy
 
19.10.11
12:56
Коллеги, подскажите, каким алгоритмом рассчитывается НДФЛ в зупе?
1 zak555
 
19.10.11
12:58
их два
2 almar
 
19.10.11
13:01
(0) Бывает 13 процентов, бывает 30, бывает 9
3 zak555
 
19.10.11
13:06
(2) есть исчисленный, есть удержанный
4 vechiy
 
19.10.11
13:08
(3) можно подробней?:) там же не просто на 0.13 умножается
5 zak555
 
19.10.11
13:09
(4) совершенно верно
6 zak555
 
19.10.11
13:09
причём копьё не учитывается
7 zak555
 
19.10.11
13:10
открой модуль и посмотри
8 vechiy
 
19.10.11
13:11
пытаюсь вот найти. в каком модуле хоть?)
9 zak555
 
19.10.11
13:11
модули расчёта из 77 комплексной :
10 vechiy
 
19.10.11
13:11
ну и в чем вообще суть алгоритма то..)
11 zak555
 
19.10.11
13:12
НДФЛ по ставке 13% (или 30% для нерезидентов) - исчисленный

//******************************************************************************
//    Предопределенная процедура
//
Процедура ПровестиРасчет()
   
   // если запись исправлена или фиксирована, то ее не рассчитываем
   Если (Исправлена=1) или (Фиксирована=1) Тогда
       глСообщениеТрассировки(глСообщенияТрассировки, "" + ?(Исправлена=1,"Результат записи исправлен вручную","Запись фиксирована") + ". Расчет не проводился.", , 1);
       Возврат
   КонецЕсли;
   
   Результат = 0;
   
   // в таблице ДоходыВычетыНалогиСотрудников могут находиться предварительно собранные
   // данные о доходах сотрудника, если это не так - соберем их заново
   ДоходыУжеСобраны=0;
   Если ДатаГод(ДатаОкончания) = ДатаГод(ПериодРегистрации.ДатаОкончания) Тогда // данные в групповых расчетах собираются только за год расчета
       Если ТипЗначения(глДоходыВычетыНалогиСотрудников)=100 Тогда
           Если глДоходыВычетыНалогиСотрудников.КоличествоСтрок() > 12 Тогда // доходы собирались в групповом расчете - и они актуальны
               ДоходыВычетыНалогиСотрудников = глДоходыВычетыНалогиСотрудников;
               ДоходыУжеСобраны=1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   Если ДоходыУжеСобраны = 0 Тогда
       глСообщениеТрассировки(глСообщенияТрассировки, "Сбор данных о доходах и вычетах за " + ДатаГод(ДатаОкончания) +" год", 0, 1);
       ДоходыВычетыНалогиСотрудников = "";
       Если глСобратьДанныеДляНДФЛВыбор(Объект.ЮрЛицо, ДоходыВычетыНалогиСотрудников,Объект,ДатаОкончания) = 0 Тогда
           глСообщениеТрассировки(глСообщенияТрассировки, "Не удалось обработать данные о доходах и вычетах!" , 1, 1);
           Возврат
       КонецЕсли;
   КонецЕсли;
   
   СтрокаИтоговойТаблицы="";
   ДоходыВычетыНалогиСотрудников.НайтиЗначение(глПолучитьУникальныйКодСотрудника(Объект)+"01",СтрокаИтоговойТаблицы,1);    
   Если СтрокаИтоговойТаблицы = 0 Тогда // работа процедуры глСобратьДанныеДляНДФЛ была прервана - делать больше нечего
       глСообщениеТрассировки(глСообщенияТрассировки, "Не удалось обработать данные о доходах и вычетах!" , 1, 1);
       Возврат
   КонецЕсли;
   
   ИтогиПоГодуСотра=СоздатьОбъект("Справочник.НКИтогиПоГоду");
   ИтогиПоГодуСотра.ИспользоватьВладельца(Объект);
   ИтогиПоГодуСотра.НайтиПоКоду(Строка(ДатаГод(ДатаОкончания)));
   СальдоСотра = ИтогиПоГодуСотра.ДолгНаНачалоГода.Получить(КонГода(ДатаОкончания));
   
   // определим месяц, по который доходы физлица менялись
   Месяц = ДатаМесяц(ДатаОкончания);
   ПоследнийМесяц = Месяц;
   СписокПредыдущегоМесяца = СоздатьОбъект("СписокЗначений");
   // во 2 колонке - таблица доходов
   ТаблицаДоходов = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-1,2); // начнем с текущего месяца
   Если ТипЗначения(ТаблицаДоходов) = 100 Тогда  // доходы были
       ТаблицаДоходов.Выгрузить(СписокПредыдущегоМесяца,,,"1,2,3,4");
   КонецЕсли;
   Для Сч=Месяц+1 По 12 Цикл
       
       // во 2 колонке - таблица доходов
       ТаблицаДоходов = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Сч-1,2);
       
       Если ТипЗначения(ТаблицаДоходов) <> 100 Тогда  // доходов не было
           Продолжить
       КонецЕсли;
       
       СписокДляСравнения = СоздатьОбъект("СписокЗначений");
       ТаблицаДоходов.Выгрузить(СписокДляСравнения,,,"1,2,3,4");
       
       Если  глСпискиИдентичны(СписокДляСравнения,СписокПредыдущегоМесяца) = 1 Тогда
           Продолжить
       КонецЕсли;
       
       СписокПредыдущегоМесяца = СписокДляСравнения;
       ПоследнийМесяц = Сч; // доходы за этот месяц не совпадают с доходами предыдущего месяца - запомним его
       
   КонецЦикла;
   
   Год = ДатаГод(ДатаОкончания);  
   
   Если Год>=2011 Тогда  
       
       СтатусНеРезидента=Объект.Физлицо.СтатусНеРезидента.Получить(КонГода(ДатаОкончания));
       Резидент=?(СтатусНеРезидента=0,1,0);
       
       Если Резидент = 1 Тогда
           // на конец года сотрудник - резидент, проверим статус в текущем месяце
           СтатусНеРезидента=Объект.Физлицо.СтатусНеРезидента.Получить(КонМесяца(ДатаОкончания));
           Резидент=?(СтатусНеРезидента=0,1,0);
           
       КонецЕсли;
       
       
       СтавкаНалога=?(Резидент=0,Константа.СтавкаНДФЛсДоходовНеРезидентов.Получить(КонГода(ДатаОкончания)),
       Константа.СтавкаНДФЛсЗарплатыРезидентов.Получить(КонГода(ДатаОкончания)))
       /100;
       глСообщениеТрассировки(глСообщенияТрассировки, "Работник" + ?(Резидент=0," не","") + " является налоговым резидентом РФ; ставка НДФЛ составила " + СтавкаНалога*100 +"%", 0, 1);
       
       
       // налоговая база - 13 колонка
       НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+ПоследнийМесяц-1,13);
       
       Если (Резидент = 1) Тогда // налог исчисляется по доходам нарастающим итогом за год
           
           МесяцСменыСтатусаРезидента = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы,"МесяцСменыСтатусаРезидента");
           
           Если МесяцСменыСтатусаРезидента=0 Тогда
               // не менялся статус
               ИсчисленоПоТекущийМесяц=Окр(НалоговаяБаза*СтавкаНалога);
               глСообщениеТрассировки(глСообщенияТрассировки, "Данные нарастающим итогом с начала года по _П01:" ,0 , 1, ДатаОкончания, "ДММММГГГГ");
               глСообщениеТрассировки(глСообщенияТрассировки, "Налоговая база:_П01; Исчислено налога:_П02", 0, -1, НалоговаяБаза, "Ч15.2", ИсчисленоПоТекущийМесяц, "Ч15.2");
               
               // данные за предыдущий месяц
               ИсчисленоПоПредыдущийМесяц = 0;
               Если Месяц>1 Тогда
                   // налог исчисленный собран по периоду действия в 4 колонке
                   ИсчисленоПоПредыдущийМесяц = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-2,4);    
                   глСообщениеТрассировки(глСообщенияТрассировки, "Исчислено налога по предыдущий месяц:_П01", 0, 1, ИсчисленоПоПредыдущийМесяц, "Ч15.2");
               КонецЕсли;
               
               // налог за месяц исчисляется с зачетом исчисленной ранее суммы
               Результат = ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра;
               глСообщениеТрассировки(глСообщенияТрассировки, "Начислено налога за текущий месяц:_П01", 0, 0, ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра, "Ч15.2");
               
           Иначе // менялся статус резидента
               
               
               // расчет налога резидента за период с МесяцСменыСтатусаРезидента по  Месяц
               
               НалоговаяБаза = НалоговаяБаза - ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+МесяцСменыСтатусаРезидента-2,13);
               ИсчисленоПоТекущийМесяц=Окр(НалоговаяБаза*СтавкаНалога);
               глСообщениеТрассировки(глСообщенияТрассировки, "Данные нарастающим итогом с начала года по _П01:" ,0 , 1, ДатаОкончания, "ДММММГГГГ");
               глСообщениеТрассировки(глСообщенияТрассировки, "Налоговая база:_П01; Исчислено налога:_П02", 0, -1, НалоговаяБаза, "Ч15.2", ИсчисленоПоТекущийМесяц, "Ч15.2");
               
               // данные за предыдущий месяц
               ИсчисленоПоПредыдущийМесяц = 0;
               Если Месяц>1 Тогда
                   // налог исчисленный собран по периоду действия в 4 колонке
                   ИсчисленоПоПредыдущийМесяц = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-2,4);
                   //Вычтем исчисленный налог, когда сотрудник был нерезидентом
                   ИсчисленоПоПредыдущийМесяц = ИсчисленоПоПредыдущийМесяц - ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+МесяцСменыСтатусаРезидента-2,4);    
                   глСообщениеТрассировки(глСообщенияТрассировки, "Исчислено налога по предыдущий месяц:_П01", 0, 1, ИсчисленоПоПредыдущийМесяц, "Ч15.2");
               КонецЕсли;
               
               // налог за месяц исчисляется с зачетом исчисленной ранее суммы
               Результат13 = ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра;
               
               
               // расчет налога нерезидента за период с 1 меняца по МесяцСменыСтатусаРезидента-1
               СтавкаНалога= Константа.СтавкаНДФЛсДоходовНеРезидентов.Получить(КонГода(ДатаОкончания))/100;
               ИсчисленоПоТекущийМесяц = 0;
               Если МесяцСменыСтатусаРезидента>2 Тогда
                   
                   Для Сч = 1 По МесяцСменыСтатусаРезидента-1 Цикл
                       НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы-1+Сч,13);
                       Если Сч > 1 Тогда
                           НалоговаяБаза = НалоговаяБаза - ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Сч-2,13);
                       КонецЕсли;
                       ИсчисленоПоТекущийМесяц = ИсчисленоПоТекущийМесяц + Окр(НалоговаяБаза * СтавкаНалога);
                   КонецЦикла;
                   
               Иначе
                   //первый месяц
                   НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы,13);
                   ИсчисленоПоТекущийМесяц = Окр(НалоговаяБаза * СтавкаНалога);
                   
               КонецЕсли;
               УщеИсчислено = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+МесяцСменыСтатусаРезидента-2,4);
               
               ДоначисленоНерезиден = ИсчисленоПоТекущийМесяц - УщеИсчислено;
               Если (Результат13>0) и (ДоначисленоНерезиден<0) Тогда
                   Результат = Результат13;
               Иначе
                   Результат = Результат13 + ДоначисленоНерезиден;
               КонецЕсли;    
               
               глСообщениеТрассировки(глСообщенияТрассировки, "Начислено налога за текущий месяц:_П01", 0, 0, Результат, "Ч15.2");
               
           КонецЕсли;
           
       Иначе
           
           // налог исчисляется по каждому месяцу отдельно - вычетаем доход, полученный по предыдущий месяц
           Если ПоследнийМесяц>1 Тогда
               
               ИсчисленоПоТекущийМесяц = 0;
               Для Сч = 1 По ПоследнийМесяц Цикл
                   НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы-1+Сч,13);
                   Если Сч > 1 Тогда
                       НалоговаяБаза = НалоговаяБаза - ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Сч-2,13);
                   КонецЕсли;
                   ИсчисленоПоТекущийМесяц = ИсчисленоПоТекущийМесяц + Окр(НалоговаяБаза * СтавкаНалога);
               КонецЦикла;
               
               // данные за предыдущий месяц
               // налог исчисленный собран по периоду действия в 4 колонке
               ИсчисленоПоПредыдущийМесяц = 0;
               Если Месяц>1 Тогда
                   ИсчисленоПоПредыдущийМесяц = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-2,4);    
               КонецЕсли;
               
               ИсчисленоНалога = ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра;
               
           Иначе
               
               ИсчисленоНалога = Окр(НалоговаяБаза * СтавкаНалога)-СальдоСотра;
               
           КонецЕсли;
           
           глСообщениеТрассировки(глСообщенияТрассировки, "Данные за _П01:" ,0 , 1, ДатаОкончания, "ДММММГГГГ");
           глСообщениеТрассировки(глСообщенияТрассировки, "Налоговая база:_П01; Исчислено налога:_П02", 0, -1, НалоговаяБаза,"Ч15.2", Окр(НалоговаяБаза * СтавкаНалога),"Ч15.2");
           глСообщениеТрассировки(глСообщенияТрассировки, "Начислено налога за текущий месяц:_П01", 0, 0, ИсчисленоНалога,"Ч15.2");
           
           Результат = ИсчисленоНалога;
       КонецЕсли;
       
   Иначе
       
       // ставка налога зависит от резидентства физлица (пп. 1 и 3 ст. 224 НК РФ)
       СтатусНеРезидента=Объект.Физлицо.СтатусНеРезидента.Получить(КонГода(ДатаОкончания));
       Резидент=?(СтатусНеРезидента=0,1,0);
       СтавкаНалога=?(Резидент=0,Константа.СтавкаНДФЛсДоходовНеРезидентов.Получить(КонГода(ДатаОкончания)),
       Константа.СтавкаНДФЛсЗарплатыРезидентов.Получить(КонГода(ДатаОкончания)))    /100;
   
       глСообщениеТрассировки(глСообщенияТрассировки, "Работник" + ?(Резидент=0," не","") + " является налоговым резидентом РФ; ставка НДФЛ составила " + СтавкаНалога*100 +"%", 0, 1);
       
       // налоговая база - 13 колонка
       НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+ПоследнийМесяц-1,13);
       
       Если (Резидент = 1) Тогда // налог исчисляется по доходам нарастающим итогом за год
           
           ИсчисленоПоТекущийМесяц=Окр(НалоговаяБаза*СтавкаНалога);
           глСообщениеТрассировки(глСообщенияТрассировки, "Данные нарастающим итогом с начала года по _П01:" ,0 , 1, ДатаОкончания, "ДММММГГГГ");
           глСообщениеТрассировки(глСообщенияТрассировки, "Налоговая база:_П01; Исчислено налога:_П02", 0, -1, НалоговаяБаза, "Ч15.2", ИсчисленоПоТекущийМесяц, "Ч15.2");
           
           // данные за предыдущий месяц
           ИсчисленоПоПредыдущийМесяц = 0;
           Если Месяц>1 Тогда
               // налог исчисленный собран по периоду действия в 4 колонке
               ИсчисленоПоПредыдущийМесяц = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-2,4);    
               глСообщениеТрассировки(глСообщенияТрассировки, "Исчислено налога по предыдущий месяц:_П01", 0, 1, ИсчисленоПоПредыдущийМесяц, "Ч15.2");
           КонецЕсли;
           
           // налог за месяц исчисляется с зачетом исчисленной ранее суммы
           Результат = ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра;
           глСообщениеТрассировки(глСообщенияТрассировки, "Начислено налога за текущий месяц:_П01", 0, 0, ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра, "Ч15.2");
           
       Иначе
           
           // налог исчисляется по каждому месяцу отдельно - вычетаем доход, полученный по предыдущий месяц
           Если ПоследнийМесяц>1 Тогда
               
               ИсчисленоПоТекущийМесяц = 0;
               Для Сч = 1 По ПоследнийМесяц Цикл
                   НалоговаяБаза=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы-1+Сч,13);
                   Если Сч > 1 Тогда
                       НалоговаяБаза = НалоговаяБаза - ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Сч-2,13);
                   КонецЕсли;
                   ИсчисленоПоТекущийМесяц = ИсчисленоПоТекущийМесяц + Окр(НалоговаяБаза * СтавкаНалога);
               КонецЦикла;
               
               // данные за предыдущий месяц
               // налог исчисленный собран по периоду действия в 4 колонке
               ИсчисленоПоПредыдущийМесяц = 0;
               Если Месяц>1 Тогда
                   ИсчисленоПоПредыдущийМесяц = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+Месяц-2,4);    
               КонецЕсли;
               
               ИсчисленоНалога = ИсчисленоПоТекущийМесяц-ИсчисленоПоПредыдущийМесяц-СальдоСотра;
               
           Иначе
               
               ИсчисленоНалога = Окр(НалоговаяБаза * СтавкаНалога)-СальдоСотра;
               
           КонецЕсли;
           
           глСообщениеТрассировки(глСообщенияТрассировки, "Данные за _П01:" ,0 , 1, ДатаОкончания, "ДММММГГГГ");
           глСообщениеТрассировки(глСообщенияТрассировки, "Налоговая база:_П01; Исчислено налога:_П02", 0, -1, НалоговаяБаза,"Ч15.2", Окр(НалоговаяБаза * СтавкаНалога),"Ч15.2");
           глСообщениеТрассировки(глСообщенияТрассировки, "Начислено налога за текущий месяц:_П01", 0, 0, ИсчисленоНалога,"Ч15.2");
           
           Результат = ИсчисленоНалога;
       КонецЕсли;
       
   КонецЕсли;

   
КонецПроцедуры //ПровестиРасчет()
12 zak555
 
19.10.11
13:12
НДФЛ по ставке 13% (или 30% для нерезидентов) - удержанный

//******************************************************************************
//    Предопределенная процедура
//
Процедура ПровестиРасчет()

   // если запись исправлена или фиксирована, то ее не рассчитываем
   Если (Исправлена=1) или (Фиксирована=1) Тогда
       глСообщениеТрассировки(глСообщенияТрассировки, "" + ?(Исправлена=1,"Результат записи исправлен вручную","Запись фиксирована") + ". Расчет не проводился.", 0, 1);
       Возврат
   КонецЕсли;
   
   Результат = 0;
   
   НалогКУдержанию = 0;
   БылоУдержано = 0;
   УдержаноДругихНалогов=0;

   // данные по предыдущий месяц
   Месяц = ДатаМесяц(ДатаОкончания)-1;
   Если Месяц>0 Тогда
       // в таблице ДоходыВычетыНалогиСотрудников могут находиться предварительно собранные
       // данные о доходах сотрудника, если это не так - соберем их заново
       ДоходыУжеСобраны=0;
       Если ДатаГод(ДатаОкончания) = ДатаГод(ПериодРегистрации.ДатаОкончания) Тогда // данные в групповых расчетах собираются только за год расчета
           Если ТипЗначения(глДоходыВычетыНалогиСотрудников)=100 Тогда
               Если глДоходыВычетыНалогиСотрудников.КоличествоСтрок() > 12 Тогда // доходы собирались в групповом расчете - и они актуальны
                   ДоходыУжеСобраны=1;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       
       ДоходыВычетыНалогиСотрудников = "";
       Если ДоходыУжеСобраны = 0 Тогда
           глСообщениеТрассировки(глСообщенияТрассировки, "Сбор данных о доходах и вычетах за " + ДатаГод(ДатаОкончания) +" год", 0, 1);
           Если глСобратьДанныеДляНДФЛВыбор(Объект.ЮрЛицо, ДоходыВычетыНалогиСотрудников,Объект,ДатаОкончания) = 0 Тогда
               глСообщениеТрассировки(глСообщенияТрассировки, "Не удалось обработать данные о доходах и вычетах!" , 1, 1);
               Возврат
           КонецЕсли;;
       Иначе
           ДоходыВычетыНалогиСотрудников = глДоходыВычетыНалогиСотрудников;
       КонецЕсли;
       
       СтрокаИтоговойТаблицы="";
       ДоходыВычетыНалогиСотрудников.НайтиЗначение(глПолучитьУникальныйКодСотрудника(Объект)+глДополнитьСтроку(Месяц,2),СтрокаИтоговойТаблицы,1);
       Если СтрокаИтоговойТаблицы = 0 Тогда // работа процедуры глСобратьДанныеДляНДФЛ была прервана - делать больше нечего
           глСообщениеТрассировки(глСообщенияТрассировки, "Не удалось обработать данные о доходах и вычетах!" , 1, 1);
           Возврат
       КонецЕсли;
       // налог исчисленный собран по периоду регистрации в 7 колонке
       НалогКУдержанию = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы,7);    
       глСообщениеТрассировки(глСообщенияТрассировки, "Исчислено НДФЛ с января по " + Формат(НачМесяца(ДатаОкончания)-1,"ДММММГГГГ") + ": " + НалогКУдержанию, 0, 1);
       // налог удержанный собран в 10 колонке
       Если ДатаГод(ПериодРегистрации.ДатаНачала) > ДатаГод(ДатаНачала) Тогда  
           // если это перерасчет НДФЛ с прошлого года
           БылоУдержано = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+1,10);    
       Иначе
           БылоУдержано = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы,10);    
       КонецЕсли;        
       
       глСообщениеТрассировки(глСообщенияТрассировки, "Удержано НДФЛ с января по " + Формат(НачМесяца(ДатаОкончания)-1,"ДММММГГГГ") + ": " + БылоУдержано, 0, -1);
   КонецЕсли;
     
   ЖурналРасчетов = СоздатьОбъект("ЖурналРасчетов.Зарплата");
                 
   Если ПериодРегистрации.ДатаНачала > ПериодДействия.ДатаНачала Тогда
       НачПериода = ПериодДействия;
   Иначе
       НачПериода = ПериодРегистрации;
   КонецЕсли;
                     
   Выплачено=0;
   ВыплаченоЗаМесяц=0;    
   НалогКУдержаниюЗаМесяц=0;
   УдержаноДругихНалоговЗаМесяц=0;
   НужныйПериод = 0;
   ТекущийПериодРегистрации = НачПериода;    
   ЖурналРасчетов.ВыбратьПоЗначению("ФизЛицо", Объект.ФизЛицо, ПериодРегистрации, ПериодРегистрации);
   Пока ЖурналРасчетов.ПолучитьЗапись()=1 Цикл
       Если ЖурналРасчетов.Объект.ЮрЛицо <> Объект.ЮрЛицо Тогда
           Продолжить;
       КонецЕсли;
       ВР=ЖурналРасчетов.ВидРасч;
       Если (ВР = ВидРасчета.НДФЛУдержанный)и(ЖурналРасчетов.ДатаОкончания = ДатаОкончания) Тогда
           НужныйПериод = 1;      
       КонецЕсли;    
       Если (ВР=ВидРасчета.ПеречислениеВБанк) или (ВР = ВидРасчета.ВыплатаЗарплаты) или (ВР = ВидРасчета.УдержаниеПоИсполнительномуЛисту) Тогда            
           ВыплаченоЗамесяц = ВыплаченоЗамесяц + ЖурналРасчетов.Результат            
       ИначеЕсли (ВР=ВидРасчета.НДФЛ)и(ЖурналРасчетов.ДатаОкончания = ДатаОкончания) Тогда
           НалогКУдержаниюЗаМесяц = НалогКУдержаниюЗаМесяц + ЖурналРасчетов.Результат        
       ИначеЕсли ((ВР = ВидРасчета.НДФЛУдержанный)или (ВР=ВидРасчета.НДФЛсДивидендовУдержанный) или (ВР=ВидРасчета.НДФЛпо35процентовУдержанный))и(ЖурналРасчетов.ДатаОкончания < ДатаОкончания) Тогда
           УдержаноДругихНалоговЗаМесяц = УдержаноДругихНалоговЗаМесяц + ЖурналРасчетов.Результат;    
       КонецЕсли;      
       Если ТекущийПериодРегистрации.ДатаОкончания <> ЖурналРасчетов.ПериодРегистрации.ДатаОкончания Тогда
           ТекущийПериодРегистрации = ЖурналРасчетов.ПериодРегистрации;
           Если НужныйПериод = 1 Тогда
               НужныйПериод = 0;
               Выплачено = Выплачено + ВыплаченоЗаМесяц;
               НалогКУдержанию = НалогКУдержанию + НалогКУдержаниюЗаМесяц;
               УдержаноДругихНалогов = УдержаноДругихНалогов + УдержаноДругихНалоговЗаМесяц;
               ВыплаченоЗаМесяц = 0;                                          
               НалогКУдержаниюЗаМесяц = 0;
               УдержаноДругихНалоговЗаМесяц = 0;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;  
     
   Если НужныйПериод = 1 Тогда
       Выплачено = Выплачено + ВыплаченоЗаМесяц;
       НалогКУдержанию = НалогКУдержанию + НалогКУдержаниюЗаМесяц;
       УдержаноДругихНалогов = УдержаноДругихНалогов + УдержаноДругихНалоговЗаМесяц;
   КонецЕсли;
   
   глСообщениеТрассировки(глСообщенияТрассировки, "Выплачено (перечислено на счета в банках) в " + Формат(ДатаОкончания,"ДММММГГГГ") + ": " + ВыплаченоЗамесяц, 0, 0);
   // ограничим сумму удержанного налога накопленной за месяц суммой выплаты
   // такова наша интерпретация п.4 ст. 226 НК РФ
   Результат=Макс(Мин(НалогКУдержанию-БылоУдержано,Цел(Выплачено-УдержаноДругихНалогов)),0);
   глСообщениеТрассировки(глСообщенияТрассировки, "К удержанию в " + Формат(ДатаОкончания,"ДММММГГГГ") + ": " + Результат, 0, 0);

КонецПроцедуры // ПровестиРасчет()
13 vechiy
 
19.10.11
13:14
пестец. сел курить.
14 almar
 
19.10.11
13:16
(13) Главное, когда покуришь, руками эти процедуры не трогай
15 ZanderZ
 
19.10.11
13:18
(14) я думаю в ЗУП 2,5 он их и не найдет
(13) кури ПроведениеРасчетов.ПолучитьДанныеНДФЛПоРегистратору
16 vechiy
 
19.10.11
13:19
мне нужно понимание алгоритма, менять ничо не надо.
эти алгоритмы ведь заданы законодательно? правильно?
17 almar
 
19.10.11
13:21
(16) Почитай налоговый кодекс, главу про НДФЛ, там проще, чем изучать законодательство по коду 1С
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший