Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ЕСВ больничные. Модуль расчета.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
sVasilich
Даже не знаю в какую ветку пистаь. Может программистам надо было...

Модуль расчета ЕСВБольничный, вернее его окончание:

Процедура ПровестиРасчет()

//
//код процедуры
//
    Если Перерасчет = 1 Тогда
        Результат = ЕдВзносБол;    
    Иначе      

        Если (Константа.РасчетВзносовСПереходящихНачислений = Перечисление.ДаНет.Да) ИЛИ  (ПустоеЗначение(Константа.РасчетВзносовСПереходящихНачислений)=1) Тогда  
            Результат = Окр(ЕдВзносБол, 2);
        Иначе    
            Результат = Окр(ЕдВзносБол, 2) - УжеУдержано;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


Ставим точку остановки на строке Если Перерасчет = 1 Тогда:
Цитата
УжеУдержано = 21.23
ЕдВзносБол = 25.9534
Результат = 0
Перерасчет = 1


Теперь ставим точку останова перед выходом, на последний КонецЕсли:
Цитата
УжеУдержано = 21.23
ЕдВзносБол = 25.9534
Результат = 25.95
Перерасчет = 1


Эти цифры верны.

Но в журнал расчетов упорно записывается 4,72 0_о Как так может быть? Где он ещё раз вычитает УжеУдержано??
Acid
может там цикл какой-то есть. покажите весь модуль расчета.
sVasilich
Вроде ничего %) Вот, смотрите. Там одна процедура эта и всё.
// ===============================
Процедура ПровестиРасчет()  
    Перем ноЕСВСотр;
    Перем ПоПериодуРегистрации;
    
    Если глПроверитьЗаписьЖурнала(Контекст,"РасчетЗаработнойПлаты, ВводЛюбогоРасчета") = 0 Тогда
        Возврат;
    КонецЕсли;

    Результат = 0;
    
    Зрп = СоздатьОбъект("ЖурналРасчетов.Зарплата");
    НП = НачалоПериодаПоДате(ДатаНачала);
    КП = КонецПериодаПоДате(ДатаНачала);  

    ДатаС = Зрп.НачалоТекущегоПериода();        
    Облагаемое    = 0;
    ОблагаемоеГПХ = 0;
    ОблагаемоеБол = 0;
    УжеУдержано   = 0;

    БазаУжеУдержано = 0;
    БазаБолУжеУдержано = 0;
    БазаГПХУжеУдержано = 0;
    
    БазаДляЕСВ    = ГруппаРасчетов.БазаЕСВ;
    БазаДляЕСВГПХ = ГруппаРасчетов.БазаЕСВГПХ;
    БазаДляЕСВБол = ГруппаРасчетов.БазаЕСВБольн;
    БазаЕСВРассчитываетсяПомесячно = ГруппаРасчетов.БазаЕСВРассчитываетсяПомесячно;

    //по периоду регистрации (все начисления, кроме больничных и отпуска не за текущий период)
    Если (НП <> ДатаС) Тогда  
        //по периоду действия
        Зрп.ВыбратьЗаписиПоОбъекту(Объект,НП,КП);
        ПоПериодуРегистрации = 0;
    Иначе
        //по периоду регистрации
        Зрп.ВыбратьПериодПоОбъекту(Объект,НП);
        ПоПериодуРегистрации = 1;
    КонецЕсли;
    Пока Зрп.ПолучитьЗапись() = 1 Цикл
        //Пересчет и сторно теперь должны попадать в текущий период
        Если (Зрп.ПериодРегистрации.ДатаНачала > НП) и ((Зрп.Перерасчет = 1)  или (Зрп.Сторно = 1))Тогда
            Продолжить;
        КонецЕсли;
        Если (Зрп.ПериодРегистрации.ДатаНачала < НП) и (НП<ДатаС) Тогда                                  
            //за прошлый период учитываются только больничные
            Если (Зрп.ВидРасч.ВходитВГруппу(ГруппаРасчетов.БазаЕСВРассчитываетсяПомесячно) = 1) и
                НЕ((Зрп.ВидРасч = ВидРасчета.ДоплатаПоБольничномуЛисту) или (Зрп.ВидРасч = ВидРасчета.ОплатаБольничного)) Тогда
                Продолжить;
            КонецЕсли;
        ИначеЕсли (НП = ДатаС) Тогда
            // в текущем не учитываем прошлый больничный, он уже учтен
            Если ((Зрп.ВидРасч = ВидРасчета.ДоплатаПоБольничномуЛисту) или (Зрп.ВидРасч = ВидРасчета.ОплатаБольничного)) и
                (Зрп.ПериодДействия.ДатаНачала < ПериодРегистрации.ДатаНачала) Тогда
                Продолжить;
            КонецЕсли;
            // в текущем не учитываем будующий отпуск
            Если (Зрп.ВидРасч.ВходитВГруппу(ГруппаРасчетов.БазаЕСВРассчитываетсяПомесячно) = 1) и
                (Зрп.ПериодДействия.ДатаНачала > ПериодРегистрации.ДатаНачала) Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        Если (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВ) = 1) или (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВГПХ) = 1)
            или (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВБол) = 1) Тогда  

            Если (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВ) = 1) Тогда  
                //основные начисления
                Облагаемое = Облагаемое + Зрп.Результат;      
                // Накапливаем сумму, период регистрации меньше текущего периода
                // с таких начислений взносы уже удержаны
                Если (Зрп.ПериодРегистрации.ДатаНачала < ПериодРегистрации.ДатаНачала) Тогда
                    БазаУжеУдержано = БазаУжеУдержано + Зрп.Результат;  
                КонецЕсли;    
            ИначеЕсли (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВГПХ) = 1) Тогда    
                //Оплата по договору ГПХ
                ОблагаемоеГПХ = ОблагаемоеГПХ + Зрп.Результат;
                // Накапливаем сумму, период регистрации меньше текущего периода  
                // с таких начислений взносы уже удержаны
                Если (Зрп.ПериодРегистрации.ДатаНачала < ПериодРегистрации.ДатаНачала) Тогда
                    БазаГПХУжеУдержано = БазаГПХУжеУдержано + Зрп.Результат;  
                КонецЕсли;    
            ИначеЕсли (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВБол) = 1) Тогда    
                //оплата больничного
                ОблагаемоеБол = ОблагаемоеБол + Зрп.Результат;      
    
                // Накапливаем сумму, период регистрации меньше текущего периода  
                // с таких начислений взносы уже удержаны
                Если (Зрп.ПериодРегистрации.ДатаНачала < ПериодРегистрации.ДатаНачала) Тогда
                    БазаБолУжеУдержано = БазаБолУжеУдержано + Зрп.Результат;  
                КонецЕсли;
            КонецЕсли;

        ИначеЕсли (Зрп.ВидРасч = ВидРасчета.ЕСВБольн)  
            и (Зрп.ПериодРегистрации.ДатаНачала <= ПериодРегистрации.ДатаНачала) Тогда
            УжеУдержано = УжеУдержано + Зрп.Результат;
        КонецЕсли;
    КонецЦикла;
    
    //Если считали по периоду регистрации, то еще надо проверить по периоду действия:
    // - начисленное в предыдущих периодах за этот период (отпускные)
    // - удержанный ЕСВ за этот период
    Если ПоПериодуРегистрации = 1 Тогда
        Зрп.ВыбратьЗаписиПоОбъекту(Объект,НП,КП);
        Пока Зрп.ПолучитьЗапись() = 1 Цикл
            Если Зрп.ПериодРегистрации.ДатаНачала >= ПериодРегистрации.ДатаНачала Тогда
                //Нужны только записи предыдущих периодов регистрации
                Продолжить;
            КонецЕсли;
            
            Если (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВ) = 1) и
            (НачМесяца(Зрп.ПериодДействия.ДатаНачала) = НП) Тогда
                Облагаемое = Облагаемое + Зрп.Результат;
            ИначеЕсли (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВГПХ) = 1)
            И (НачМесяца(Зрп.ПериодДействия.ДатаНачала) = НП) Тогда
                ОблагаемоеГПХ = ОблагаемоеГПХ + Зрп.Результат;
            ИначеЕсли (Зрп.ВидРасч.ВходитВГруппу(БазаДляЕСВБол) = 1)
            И (НачМесяца(Зрп.ПериодДействия.ДатаНачала) = НП) Тогда
                //оплата больничного
                ОблагаемоеБол = ОблагаемоеБол + Зрп.Результат;      
            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
    
    //основные начисления
    спЛьготы = глПолучитьЛьготыДляНалога(Объект,"ЕСВ",КП);  //пока льгот нет
    ЕдВзносБол = 0; ЕдВзносГПХ = 0;
    
    Если (ОблагаемоеБол <> 0) Тогда
        
        // ЕСВ с сотрудника
        спДоп = СоздатьОбъект("СписокЗначений");
        глПолучитьСтавку(ноЕСВСотр, "ЕСВ", "о ставке отчислений единого соц.взноса с сотрудника");
        ноЕСВС = ноЕСВСотр.Родитель;            
        КПП = ?(КП < глДатаПереходаНаЕСВ, глДатаПереходаНаЕСВ, КП);
            
        глПарсить(ноЕСВС.Дополнительно.Получить(КПП),спДоп);
        МаксБазаСотЕСВ = Число(спДоп.Получить("Макс. база"));
        спДоп = 0;  
        Облагаемое = Мин(Облагаемое,МаксБазаСотЕСВ);
        //Оплата ГПХ
        ОблагаемоеГПХ = Мин(ОблагаемоеГПХ,МаксБазаСотЕСВ-Облагаемое);
    
        //Оплата больничного
        ОблагаемоеБол = Мин(ОблагаемоеБол,МаксБазаСотЕСВ-Облагаемое-ОблагаемоеГПХ);
        тбШкала = глПолучитьШкалуДляНалога(Объект,"ЕСВБольн",КП,спЛьготы);
    
        тбШкалаТек = глПолучитьШкалуДляНалога(Объект,"ЕСВБольн",ПериодРегистрации.ДатаОкончания,спЛьготы);        
        ЕдВзносБол = глРассчитатьНалогПоШкале(ОблагаемоеБол,тбШкала,спЛьготы,,,БазаБолУжеУдержано,тбШкалаТек);  
    КонецЕсли;
    
    Если Перерасчет = 1 Тогда
        Результат = ЕдВзносБол;    
    Иначе      

        Если (Константа.РасчетВзносовСПереходящихНачислений = Перечисление.ДаНет.Да) ИЛИ  (ПустоеЗначение(Константа.РасчетВзносовСПереходящихНачислений)=1) Тогда  
            Результат = Окр(ЕдВзносБол, 2);
        Иначе    
            Результат = Окр(ЕдВзносБол, 2) - УжеУдержано;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
Acid
Все правильно. У вас Больничные переходящие. Т.е. учитываются суммы из прошлого месяца (больничный и ЕСВбольн). 25.95-21,23=4,72 (21,23 провелось в прошлом месяце).
igmig65
Я когдато тоже ломал себе голову, почему так, оказалось, что это запись ПЕРЕРАСЧЕТ, тоесть у вас в отладчике показывает общую сумму по 2 записям пересчитанной, ту что расчитывается в данный момент и той, которую пересчитывает.
sVasilich
Acid, вот именно что перерасчет. Он не должен ещё раз УжеУдержано отнимать (если верить коду).
Если Перерасчет = 1 Тогда
        Результат = ЕдВзносБол;    
    Иначе



igmig65, а какая переменная тогда в журнал расчетов попадает? Где это искать? Получается что он один раз отнимает УжеУдержано в глРассчитатьНалогПоШкале (как я понял) и где-то ещё?
igmig65
Нопример у вас в феврале есть запись ЕСВбольн с результатом 15.00
В марте у вас вводится запись ПЕРЕРАСЧЕТ ЕСВбольн с результатом 3.00
У вас в отладчике на строке:
Если Перерасчет = 1 Тогда
        Результат = ЕдВзносБол;    
    Иначе

покажет: ЕдВзносБол = 18
sVasilich
Да, это я понял. Вопрос в том, где найти 3? Так как в моём случае показывает как раз 3 %) а потом ещё раз от 18 15 отнимает.
igmig65
Я просто, немогу щас сказать точно как правильно, так как обновлял ЗиК ручками. Посмотрите как в 29 расчитывается запаись перерасчет для ЕСВ.
Там почему то плюсуется сумма удержано. Мне кажется что все связано с правилами перерасчета ОсновныеНалоги и НДФЛ, только непойму почему в 29 ЕСВ перерасчет плюсует УжеУдержано, а ЕСВБольничные нет. Может это ошибка. Я просто у себя все натроил не так как в 29, у меня при вводе больничных за прошлый период прерасчет вводится только НДФЛ.
sVasilich
Так и не разобрался где второй раз вычитается УжеУдержано. Поставил следующий костыль, вроде пока работает: если запись перерасчет, то в глРассчитатьНалогПоШкале заношу нулевую БазаБолУжеУдержано.

Если Перерасчет=1 Тогда
    БазаБолУжеУдержано=0;
КонецЕсли;
ЕдВзносБол = глРассчитатьНалогПоШкале(ОблагаемоеБол,тбШкала,спЛьготы,,,БазаБолУжеУдержано,тбШкалаТек);



Начинаю верить в магию icon_bang.gif
endru
Сам когда то с этим разбирался, толком не понял правда, предположил что это платформа пересчитывает сама в случае если "перерасчет",
а потом перешел на 8ку и появились другие проблемы))

Имхо ЗП на восьмерке лучше))
igmig65
Это вроде заложено в правилах перерасчета. Вот как в 029: Правило перерасчета Основные налоги, при вводе почти всех начислений вводится записи перерасчеты по налогам.
Цитата
Так и не разобрался где второй раз вычитается УжеУдержано

Посмотрите в конец модуля расчета ЕСВ:
Если Перерасчет = 1 Тогда
  Если (Константа.РасчетВзносовСПереходящихНачислений = Перечисление.ДаНет.Да) ИЛИ  (ПустоеЗначение(Константа.РасчетВзносовСПереходящихНачислений)=1) Тогда
     Результат = ЕдВзнос + УжеУдержано;
  Иначе
     Результат = ЕдВзнос;
  КонецЕсли;

а вот ЕСВбольн:
Если Перерасчет = 1 Тогда
  Результат = ЕдВзносБол;    
Иначе

попробуйте исправить как для ЕСВ, тоесть:
Если Перерасчет = 1 Тогда
     Если (Константа.РасчетВзносовСПереходящихНачислений = Перечисление.ДаНет.Да) ИЛИ  (ПустоеЗначение(Константа.РасчетВзносовСПереходящихНачислений)=1) Тогда
            Результат = ЕдВзносБол + УжеУдержано;
     Иначе
            Результат = ЕдВзносБол;
     КонецЕсли;

Вот здесь тогда вы вернете назад Ужеудержано
sVasilich
igmig65, спасибо, тоже вариант.

Цитата
Это вроде заложено в правилах перерасчета.


Похоже на то. Непонятно только зачем такой бред было делать. Я думал правила перерасчета только записи вводят, что было бы логичнее, имхо. Запутанно у них получилось, а самое плохе, что, как я понял, отредактировать это дело нельзя :\
igmig65
Цитата
а самое плохе, что, как я понял, отредактировать это дело нельзя :\

почему нельзя, правила перерасчета настриваемые, только точно как что влияет не скажу, гдето находил описание настроек для правил перерасчета в нете, но где непомню. Там имеет значение не только расчеты влияющие на эти правила и расчеты на которые влияют(окна справа и слева), но и период ввода этих перерасчетов (переключатели внизу). Я напрмер когда обновлял ручками, просто забыл про эти правила, вот у меня теперь ЕСВ перерасчет за прошлый период невводится, а вводится только ЕСВбольн. Просто забыл галочки поставить в правилах, а получается он и ненужен, ведь в тек.месяце за прошлый ЕСВ уже недолжно быть, а в 029 вводится, только расчет зависит от константы еще.
sVasilich
Я неправильно выразился)

Имею в виду что механизм нам представлен в виде "чёрного ящика": ручку дёрнул, что-то изменилось, а программной реализации не видно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.