Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 21:27

Формирование книги покупок. Помогите оптимизировать код.

Автор Ice-Dragon1988, 13 дек 2011, 17:18

0 Пользователей и 1 гость просматривают эту тему.

Ice-Dragon1988

   Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты);
   Ит.ИспользоватьСубконто(ВидыСубконто.Основание);
   Ит.ИспользоватьСубконто(ВидыСубконто.СчетНДС,ПризнакНДС);
   Ит.ИспользоватьСубконто(ВидыСубконто.ПриходДокумент);
   Ит.ИспользоватьСубконто(ВидыСубконто.СтавкиНДС);
   Ит.ВыполнитьЗапрос(ДатаС,ДатаПо,"Т60");
   Ит.ВыбратьСубконто(1);
   Пока Ит.ПолучитьСубконто(1)=1 Цикл
      Ит.ВыбратьСубконто(2);
      Пока Ит.ПолучитьСубконто(2)=1 Цикл
         Ит.ВыбратьСубконто(3);
         Пока Ит.ПолучитьСубконто(3)=1 Цикл
            Если (Ит.Субконто(3).Код = "18.8.1") или (Ит.Субконто(3).Код = "18.8.10") Тогда
               Продолжить; //в книгу покупок не попадает
            КонецЕсли;
            Ит.ВыбратьСубконто(4,,,,,"ДатаДок");
            Пока Ит.ПолучитьСубконто(4)=1 Цикл
               Если (Найти("ПлатежноеТребованиеНПлатежноеПоручение",Ит.Субконто(4).Вид())>0) Или (ПустоеЗначение(Ит.Субконто(4).Вид())=1) Тогда     
                  Продолжить;
               КонецЕсли;
               
               СуммаНДС=Ит.КО("К");
               
               Если (Ит.КО("С")<>0) или (Ит.КО("К")<>0) Тогда //временно по "К" много хвостов
                  НоваяСтрока();
                  НомерОпл="";
                  СуммаОпл=0;
                  Контрагент=Ит.Субконто(1);
                  Основание=Ит.Субконто(2);
                  ДокПр=Ит.Субконто(4);
                  ДатаПР=ДокПр.ДатаДок;
                  НомерПР=ПредставлениеДокумента(ДокПр,1);
                  
                  СтоимостьБезНДС=0;
                  Ит.ВыбратьСубконто(5);
                  Пока Ит.ПолучитьСубконто(5)=1 Цикл
                     СтрСостояние="Заполнение: ";               
                     Для Поз=1 По 5 Цикл                        
                        СтрСостояние=СтрСостояние+Ит.Субконто(Поз);   
                     КонецЦикла;                                   
                     Состояние(СтрСостояние);                     
                     
                     СтавкаНДС=Ит.Субконто(5).Ставка; 
                     
                     Если Ит.Субконто(5) = РасчСтавка Тогда      //*** 140110 
                        СтавкаНДС  = 999;
                     КонецЕсли;                                               
                     
                     РФ=0;
                     Попытка
                        РФ=ДокПр.РФ;
                     Исключение
                     КонецПопытки;
                     
                     Если СтавкаНДС=0 Тогда
                        СтоимостьБезНДС=СтоимостьБезНДС+Ит.КО();
                     Иначе
                        Если РФ=0 Тогда
                           Если СтавкаНДС=10 Тогда
                              Стоимость10=Стоимость10+?((Ит.КО("С") = 0) И (Ит.КО("К") <> 0),Окр(Ит.КО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.КО("С")) - Ит.КО("К");
                              СуммаНДС10=СуммаНДС10+Мин(Ит.КО("К"),СуммаНДС);
                              Стоимость10 = Макс(Стоимость10,0);
                           ИначеЕсли (СтавкаНДС = 18) или  (СтавкаНДС = 20) или  (СтавкаНДС = 999) или (СтавкаНДС =  16.67) Тогда       //*** 140110   
                              Стоимость20=Стоимость20+?((Ит.КО("С") = 0) И (Ит.КО("К") <> 0),Окр(Ит.КО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.КО("С")) - Ит.КО("К");
                              СуммаНДС20=СуммаНДС20+Мин(Ит.КО("К"),СуммаНДС);
                              Стоимость20 = Макс(Стоимость20,0);
                           Иначе  //***
                              Сообщить("Другая ставка - "+СтавкаНДС+ "   " + Ит.Субконто(1)+ "  " + Ит.Субконто(2)+ "  " +Ит.Субконто(3)+ "  " + Ит.Субконто(4)+ "  " + Ит.Субконто(5));
                           КонецЕсли;
                        Иначе
                           СтоимостьРФ=СтоимостьРФ+?((Ит.КО("С") = 0) И (Ит.КО("К") <> 0),Окр(Ит.КО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.КО("С")) - Ит.КО("К");
                           СуммаНДСРФ=СуммаНДСРФ+Мин(Ит.КО("К"),СуммаНДС);
                           СтоимостьРФ = Макс(СтоимостьРФ,0);
                        КонецЕсли;
                     КонецЕсли;
                  КонецЦикла;//Пока Ит.ПолучитьСубконто(4)=1 Цикл
                  
                                    
                  СуммаПР=Ит.КО("С");
                  ВсегоПокупок = Стоимость10+СуммаНДС10+Стоимость20+СуммаНДС20+СтоимостьРФ+СуммаНДСРФ+СтоимостьБезНДС;
                  ОсталосьЗакрытьПокупок=ВсегоПокупок;
                  Стр=0;
                  КоличествоСтрок=Таб.КоличествоСтрок(); 
                  Если Таб.НайтиЗначение(Ит.Субконто(),Стр,"Контрагент")=1 Тогда
                     Пока Ит.Субконто()=Таб.ПолучитьЗначение(Стр,"Контрагент") Цикл
                        Если (ОсталосьЗакрытьПокупок<=0) Или (Таб.ПолучитьЗначение(Стр,"Осталось")<=0) Тогда   
                           Стр=Стр+1;
                           Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; 
                           Продолжить;
                        КонецЕсли;                                                                             
                  
                        Если Ит.Субконто(2)=Таб.ПолучитьЗначение(Стр,"Основание") Тогда
                           СтрНачала=Стр;
                           сзСтрСовпадения.УдалитьВсе();
                           ДобавлятьСтроку=0;
                           //Проверка на непосредственное указание документа поступления в документе оплаты
                           _Стр=0;
                           Если Таб.НайтиЗначение(ДокПр,_Стр,"ДокументПоставкиГиппо")=1 Тогда
                              ДокументПоставкиГиппо=Таб.ПолучитьЗначение(_Стр,"ДокументПоставкиГиппо");
                              Пока ДокументПоставкиГиппо=Таб.ПолучитьЗначение(_Стр,"ДокументПоставкиГиппо") Цикл
                                 Если ДобавлятьСтроку=1 Тогда НоваяСтрокаДок(Ит) КонецЕсли;
                                 ДокОпл=Таб.ПолучитьЗначение(_Стр,"ПлатДок");
                                 ДатаОпл=?(ПустоеЗначение(Таб.ПолучитьЗначение(_Стр,"Выписка"))=0,Таб.ПолучитьЗначение(_Стр,"Выписка").ДатаДок,Таб.ПолучитьЗначение(_Стр,"ПлатДок").ДатаДок);
                                 НомерОпл="№"+СокрЛП(Строка(Таб.ПолучитьЗначение(_Стр,"ПлатДок").НомерДок));
                                 СуммаОпл=Мин(Таб.ПолучитьЗначение(_Стр,"Осталось"),ОсталосьЗакрытьПокупок);
                                 Таб.УстановитьЗначение(_Стр,"Осталось",Таб.ПолучитьЗначение(_Стр,"Осталось")-СуммаОпл);
                                 ОсталосьЗакрытьПокупок=ОсталосьЗакрытьПокупок-СуммаОпл;
                                 сзСтрСовпадения.Установить(_Стр,_Стр);
                                 Сопоставлено=1;
                                 ДобавлятьСтроку=1;
                                 _Стр=_Стр+1;
                                 Если (_Стр>КоличествоСтрок) Или (ОсталосьЗакрытьПокупок=0) Тогда Прервать КонецЕсли;   
                              КонецЦикла;
                           КонецЕсли;
                           Если ОсталосьЗакрытьПокупок<>0 Тогда
                              //Проверка на полное совпадение
                              Пока Ит.Субконто(2)=Таб.ПолучитьЗначение(Стр,"Основание") Цикл
                                 Если сзСтрСовпадения.НайтиЗначение(Стр)>0 Тогда
                                    Стр=Стр+1;
                                    Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; /
                                    Продолжить;
                                 КонецЕсли;
                                 Если Таб.ПолучитьЗначение(Стр,"Осталось")=ОсталосьЗакрытьПокупок Тогда
                                    Если ДобавлятьСтроку=1 Тогда НоваяСтрокаДок(Ит) КонецЕсли;
                                    ДокОпл=Таб.ПолучитьЗначение(Стр,"ПлатДок");
                                    ДатаОпл=?(ПустоеЗначение(Таб.ПолучитьЗначение(Стр,"Выписка"))=0,Таб.ПолучитьЗначение(Стр,"Выписка").ДатаДок,Таб.ПолучитьЗначение(Стр,"ПлатДок").ДатаДок);
                                    НомерОпл="№"+СокрЛП(Строка(Таб.ПолучитьЗначение(Стр,"ПлатДок").НомерДок));
                                    СуммаОпл=Мин(Таб.ПолучитьЗначение(Стр,"Осталось"),ОсталосьЗакрытьПокупок);
                                    Таб.УстановитьЗначение(Стр,"Осталось",Таб.ПолучитьЗначение(Стр,"Осталось")-СуммаОпл);
                                    ОсталосьЗакрытьПокупок=ОсталосьЗакрытьПокупок-СуммаОпл;
                                    сзСтрСовпадения.Установить(Стр,Стр);
                                    Сопоставлено=0;
                                    ДобавлятьСтроку=1;
                                    Прервать;
                                 КонецЕсли;
                                 Стр=Стр+1;
                                 Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли;
                              КонецЦикла;
                              
                              
                              Если ОсталосьЗакрытьПокупок>0 Тогда
                                 Стр=СтрНачала;
                                 Если сзСтрСовпадения.НайтиЗначение(Стр)>0 Тогда
                                    Стр=Стр+1;
                                    Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; 
                                    Продолжить;
                                 КонецЕсли;
                                 Пока Ит.Субконто(2)=Таб.ПолучитьЗначение(Стр,"Основание") Цикл
                                    Если (ОсталосьЗакрытьПокупок<=0) Или (Таб.ПолучитьЗначение(Стр,"Осталось")<=0) Тогда   
                                       Стр=Стр+1;
                                       Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; 
                                       Продолжить;
                                    КонецЕсли;                                                                             
                                 Если ДобавлятьСтроку=1 Тогда НоваяСтрокаДок(Ит) КонецЕсли;
                                    ДокОпл=Таб.ПолучитьЗначение(Стр,"ПлатДок");
                                    ДатаОпл=?(ПустоеЗначение(Таб.ПолучитьЗначение(Стр,"Выписка"))=0,Таб.ПолучитьЗначение(Стр,"Выписка").ДатаДок,Таб.ПолучитьЗначение(Стр,"ПлатДок").ДатаДок);
                                    НомерОпл="№"+СокрЛП(Строка(Таб.ПолучитьЗначение(Стр,"ПлатДок").НомерДок));
                                    СуммаОпл=Мин(Таб.ПолучитьЗначение(Стр,"Осталось"),ОсталосьЗакрытьПокупок);
                                    Таб.УстановитьЗначение(Стр,"Осталось",Таб.ПолучитьЗначение(Стр,"Осталось")-СуммаОпл);
                                    ОсталосьЗакрытьПокупок=ОсталосьЗакрытьПокупок-СуммаОпл;
                                    ДобавлятьСтроку=1;
                                    Сопоставлено=0;
                                    Стр=Стр+1;
                                    Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; 
                                 КонецЦикла;
                              КонецЕсли;
                           КонецЕсли;
                        Иначе
                           Стр=Стр+1;
                        КонецЕсли;
                        Если Стр>КоличествоСтрок Тогда Прервать КонецЕсли; 
                     КонецЦикла;
                  КонецЕсли; 
                  //Возвраты
               ИначеЕсли (Ит.ДО("С")<>0) или (Ит.ДО("К")<>0) Тогда
                  Если Ит.Субконто(4).вид() = "РТ_ВозвратПостащику" Тогда
                     Если Ит.Субконто(1).ВидКонтрагента=Перечисление.ВидыКонтрагентов.ОсобыеЗаказчики Тогда
                        Продолжить;
                     КонецЕсли;
                     НоваяСтрока();
                     НомерОпл="";
                     СуммаОпл=0;
                     Контрагент=Ит.Субконто(1);
                     Основание=Ит.Субконто(2);
                     ДокПр=Ит.Субконто(4);
                     ДатаПР=ДокПр.ДатаДок;
                     НомерПР=ПредставлениеДокумента(ДокПр,1);
                     СуммаНДС=Ит.ДО("К");
                     
                     СтоимостьБезНДС=0;
                     Ит.ВыбратьСубконто(5);
                     Пока Ит.ПолучитьСубконто(5)=1 Цикл
                        СтавкаНДС=Ит.Субконто(5).Ставка;
                        
                        Если Ит.Субконто(5) = РасчСтавка Тогда      //*** 140110     
                           СтавкаНДС  = 999;
                        КонецЕсли;                                                   
                        
                        РФ=0;
                        Попытка
                           РФ=ДокПр.РФ;
                        Исключение
                        КонецПопытки;
                        
                        Если СтавкаНДС=0 Тогда
                           СтоимостьБезНДС=СтоимостьБезНДС+Ит.КО();
                        Иначе
                           Если РФ=0 Тогда
                              Если СтавкаНДС=10 Тогда
                                 Стоимость10=Стоимость10+?((Ит.ДО("С") = 0) И (Ит.ДО("К") <> 0),Окр(Ит.ДО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.ДО("С")) - Ит.ДО("К");
                                 СуммаНДС10=СуммаНДС10+Ит.ДО("К");
                                 //СуммаНДС10=СуммаНДС10+Мин(Ит.ДО("К"),СуммаНДС);
                                 //Стоимость10 = Макс(Стоимость10,0);
                              ИначеЕсли (СтавкаНДС = 18) или  (СтавкаНДС = 20) или  (СтавкаНДС = 999) или (СтавкаНДС =  16.67) Тогда       //*** 140110   
                                 Стоимость20=Стоимость20+?((Ит.ДО("С") = 0) И (Ит.ДО("К") <> 0),Окр(Ит.ДО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.ДО("С")) - Ит.ДО("К");
                                 СуммаНДС20=СуммаНДС20+Ит.ДО("К");
                                 //СуммаНДС20=СуммаНДС20+Мин(Ит.ДО("К"),СуммаНДС);
                                 //Стоимость20 = Макс(Стоимость20,0);
                              Иначе //***
                                 Сообщить("Другая ставка - " + СтавкаНДС  + "   " + Ит.Субконто(1)+ "  " + Ит.Субконто(2) + "  " + Ит.Субконто(3) + "  " + Ит.Субконто(4) + "  " + Ит.Субконто(5));
                              КонецЕсли;
                           Иначе
                              СтоимостьРФ=СтоимостьРФ+?((Ит.ДО("С") = 0) И (Ит.ДО("К") <> 0),Окр(Ит.ДО("К")*(100+СтавкаНДС)/СтавкаНДС),Ит.ДО("С")) - Ит.ДО("К");
                              СуммаНДСРФ=СуммаНДСРФ+Мин(Ит.ДО("К"),СуммаНДС);
                              //СтоимостьРФ = Макс(СтоимостьРФ,0);
                           КонецЕсли;
                        КонецЕсли;
                     КонецЦикла;//Пока Ит.ПолучитьСубконто(4)=1 Цикл
                     
                     СуммаПР=Ит.ДО("С");
                     ВсегоПокупок = Стоимость10+СуммаНДС10+Стоимость20+СуммаНДС20+СтоимостьРФ+СуммаНДСРФ+СтоимостьБезНДС;
                  КонецЕсли;
               КонецЕсли;//Если (Ит.КО("С")<>0) Тогда
            КонецЦикла;//Пока Ит.ПолучитьСубконто(4)=1 Цикл
         КонецЦикла;//Пока Ит.ПолучитьСубконто(3)=1 Цикл
      КонецЦикла;//Пока Ит.ПолучитьСубконто(2)=1 Цикл
   КонецЦикла;//Пока Ит.ПолучитьСубконто(1)=1 Цикл

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск