Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расчет НДФЛ
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
EritikWoW
Ребят кому не сложно помогите оптимизировать и решить проьлему зацикливания создания строк, а то я уже не соображаю ! За ранее ООООГРОМНОЕ СПАСИБО ! =)

Функция РасчетНДФЛ()
    Ставка = РегистрыСведений.СтавкиНДФЛ.Выбрать(Дата(01,01,0001),КонецГода(Дата));
    ТабНДФЛ = НДФЛПроводки.Выгрузить();
    ТабНач = НачисленияПроводки.Выгрузить();
    ТабВзнос = ВзносыПроводки.Выгрузить();
    ТабОтрВБУ = ОтражениеВРеглУчете.Выгрузить();
    НольОдин = Число("0,01");
Для Каждого Строчка из ТабНач Цикл
Если Строчка.СчетКт.Ссылка =  ПланыСчетов.Хозрасчетный.РасчетыПоДругимВыплатам.Ссылка Тогда
Работник = Строчка.Сотрудник;        

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

Для Каждого Строчка из ТабНач Цикл
     Для каждого Строка из ТабНДФЛ Цикл
           Для каждого ст из ТабНач Цикл
                 Для каждого Стро из ТабНДФЛ цикл


Для такого пользования ТабНач и ТабНДФЛ нужно скопировать в другие и во внутренних циклах ходить по этим другим.
Иначе сбивается позиционирование внешних обходов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.