Имя: Пароль:
1C
1C 7.7
v7: Начало тормозить при формировании отчёта.
0 Роспатнюк Сергей Сер
 
30.05.19
14:28
Добрый день недавно начал тормозить один отчет, ну я сразу подумал что наверно кто то запилил запрос в цикл но нет, сделал замер вот что показывает, подскажите как это можно исправить.

\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1288    Если Материал.ЭтоГруппа() = 1 Тогда                                                            54573    27.938319    23.97
\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1271    Ит.ВыбратьСубконто(ВидыСубконто.Материалы);                                                    1460    25.825278    22.16
\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1248    Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, СписокСчетов, , , , "Проводка", 1 + 4);    2    22.577485    19.37
\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1304    ОборотСумма    = ОборотСумма    + Ит.КО(1);                                                    54518    11.804140    10.13
\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1261    Ит.ВыбратьСубконто(ВидыСубконто.Сотрудники);                                                    346    4.588984    3.94
\\TERM02\1C_BASES\TEST\POD_TEST\EXTFORMS\ДВИЖЕНИЕ МАТЕРИАЛА (НОВЫЙ).ERT    1249    Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);                                                    1    4.278884    3.67

Код процедуры

    ЗаголовокОтчёта     = " % использования ";
    
    Несн        = СоздатьОбъект("ТаблицаЗначений");
    СписокНеснижаемых(Несн);
    
    //--- Подготовка ТЗ с идентичными отчёту колонками
    Если 1 = 1 Тогда
        
        ТаблицаДляСортировки = СоздатьОбъект("ТаблицаЗначений");
        
        ТаблицаДляСортировки.НоваяКолонка("НПП");
        ТаблицаДляСортировки.НоваяКолонка("Код");
        ТаблицаДляСортировки.НоваяКолонка("Артикул");
        //ТаблицаДляСортировки.НоваяКолонка("МестаХранения");
        //ТаблицаДляСортировки.НоваяКолонка("Сотрудник");
        ТаблицаДляСортировки.НоваяКолонка("Материал");
        ТаблицаДляСортировки.НоваяКолонка("Ед_Изм");
        ТаблицаДляСортировки.НоваяКолонка("ОстатокНач");
        ТаблицаДляСортировки.НоваяКолонка("ПриходКол");
        ТаблицаДляСортировки.НоваяКолонка("РасходКол");
        ТаблицаДляСортировки.НоваяКолонка("ОстатокКон");
        ТаблицаДляСортировки.НоваяКолонка("СуммаНач");
        ТаблицаДляСортировки.НоваяКолонка("СуммаКон");
        ТаблицаДляСортировки.НоваяКолонка("СуммаДвижПриход");
        ТаблицаДляСортировки.НоваяКолонка("СуммаДвижРасхода");
        ТаблицаДляСортировки.НоваяКолонка("Использовано");    
        
    КонецЕсли;
    //--- Подготовка ТЗ с идентичными отчёту колонками (конец)
    
    СпМатериалов    = СоздатьОбъект("СписокЗначений");
    
    Несн.Выгрузить(спМатериалов, , , "материал");
    
    Состояние("расчет итогов");
    
    Оборотсумма    = 0;
    
    Таб        = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать2");
    
    Ит        = СоздатьОбъект("БухгалтерскиеИтоги");
    
    //Если ВклСклад = 0 Тогда
    //    
    //ИначеЕсли Склад.Выбран() = 1 Тогда
    //    
    //    // Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения, Склад, , 0);
    //Иначе
    //    
    //    // Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения);
    //КонецЕсли;
    
    Если ВклМОЛ = 0 Тогда
        
    ИначеЕсли МОЛ.выбран() = 1 Тогда
        
        Ит.ИспользоватьСубконто(ВидыСубконто.Сотрудники, МОЛ, , 0);
    Иначе
        
        Ит.ИспользоватьСубконто(ВидыСубконто.Сотрудники);
    КонецЕсли;
    
    Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения, Склад, , 1);
    Ит.ИспользоватьСубконто(ВидыСубконто.Материалы, сзМатериалы, 1, флгВыводитьГруппы);
    
    //Если (Движ = 1) ИЛИ (Ист = 1) Тогда
    //    
    //    // Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, СписокСчетов, , , , "Проводка", 1 + 4);
    //Иначе
    //    
    //    // Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, СписокСчетов, , , , , "К");
    //КонецЕсли;
    
    Сформировать_Колонки("Заголовок");
    Сформировать_Колонки("Шапка");
    
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    
    НПП        = 0;
    
    Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, СписокСчетов, , , , "Проводка", 1 + 4);
    Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
    
    Сч    = 1;    
    
    Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл
        
        Если (ВыводитьМестаХранения = 1) Тогда
            
            Сформировать_Колонки("Субконто1");                
            
        КонецЕсли;
        
        Ит.ВыбратьСубконто(ВидыСубконто.Сотрудники);
        
        Пока Ит.ПолучитьСубконто(ВидыСубконто.Сотрудники) = 1 Цикл            
            
            Если (ВыводитьСотрудников = 1) Тогда
                
                Сформировать_Колонки("Субконто2");                
                
            КонецЕсли;
            
            Ит.ВыбратьСубконто(ВидыСубконто.Материалы);            
            
            Пока Ит.ПолучитьСубконто(ВидыСубконто.Материалы) = 1 Цикл
                
                Если ФлУд = 1 Тогда
                    
                    Если Ит.Субконто(ВидыСубконто.Материалы).ПометкаУдаления() = 0 Тогда
                        
                        Продолжить;
                        
                    КонецЕсли;
                    
                КонецЕсли;
                
                НПП    = НПП + 1;
                Материал    = Ит.Субконто(3);                
                
                Если Материал.ЭтоГруппа() = 1 Тогда
                    
                    Если ФлгВыборГруппы = 1 Тогда
                        
                        Сформировать_Колонки("Субконто3Группа");                    
                        
                    КонецЕсли;
                    
                    Продолжить;
                    
                Иначе
                    
                    Материал    = Ит.Субконто(3);
                    
                    Если Несн.НайтиЗначение(материал, , ) = 0 Тогда
                        
                        ОборотСумма    = ОборотСумма    + Ит.КО(1);
                        ПриходСумма    = ПриходСумма    + Ит.до(1);
                        Конец        = Конец            + Ит.СКД(1) - Ит.СКК(1);
                        Начало        = Начало         + Ит.СНД(1) - Ит.СНК(1);
                        Колначало    = Колначало     + Ит.СНД(3) - Ит.СНК(3);
                        Колконец    = Колконец        + Ит.СКД(3) - Ит.СКК(3);
                        РасходКол    = РасходКол        + Ит.КО(3);
                        ПриходКол    = ПриходКол     + Ит.до(3);
                        
                    КонецЕсли;
                    
                КонецЕсли;
                
                //--- Запись строки в таблицу значений
                Если 1 = 1 Тогда                    
                    
                    //Вр        = Ит.СНД(3) - Ит.СНК(3) + Ит.ДО(3);
                    //Процент    = 100 * (Ит.КО(3) / ?(Вр = 0, 1, Вр);
                    
                    ОстатокНач         = Ит.СНД(3) - Ит.СНК(3);
                    ПриходКол         = Ит.ДО(3);
                    РасходКол         = Ит.КО(3);
                    
                    Вр        = ОстатокНач + ПриходКол;
                    
                    Попытка
                    
                         Процент    = 100 * РасходКол / ?(Вр <> 0, Вр, 1);                                        
                    
                    Исключение
                        
                        Сообщить("Ошибка: ОстатокНач + ПриходКол = " + Строка(Вр) + "  " + Строка(Материал) );
                        Процент    = 9999;
                        
                    КонецПопытки;                    
                    
                    //Процент    = ?(Процент > 100, 100, Процент);                    
                    
                    //--- Отбор по процентам
                    Если 1 = 1 Тогда                        
                        
                        Если (ПроцентОт > 0)
                            И (Процент < ПроцентОт) Тогда
                            
                            Продолжить;
                            
                        КонецЕсли;                    
                        
                        Если (ПроцентДо < 100)
                            И (Процент > ПроцентДо) Тогда
                            
                            Продолжить;
                            
                        КонецЕсли;
                        
                    КонецЕсли;
                    //--- Отбор по процентам (Конец)                    
                        
                    ТаблицаДляСортировки.НоваяСтрока();
                    
                    ТаблицаДляСортировки.НПП                 = НПП;
                    ТаблицаДляСортировки.Код                 = Материал.Код;
                    ТаблицаДляСортировки.Артикул             = Материал.Арт;
                    ТаблицаДляСортировки.Материал             = Материал;
                    ТаблицаДляСортировки.Ед_Изм             = Материал.ЕдиницаИзмерения;
                    //ТаблицаДляСортировки.ОстатокНач         = Ит.СНД(3) - Ит.СНК(3);
                    //ТаблицаДляСортировки.ПриходКол         = Ит.ДО(3);
                    //ТаблицаДляСортировки.РасходКол         = Ит.КО(3);
                    ТаблицаДляСортировки.ОстатокНач         = ОстатокНач;
                    ТаблицаДляСортировки.ПриходКол             = ПриходКол;
                    ТаблицаДляСортировки.РасходКол             = РасходКол;
                    ТаблицаДляСортировки.ОстатокКон         = Ит.СКД(3) - Ит.СКК(3);
                    
                    ТаблицаДляСортировки.СуммаНач             = Формат(Ит.СНД(1) - Ит.СНК(1), "Ч15.2, ");
                    ТаблицаДляСортировки.СуммаКон             = Формат(Ит.СКД(1) - Ит.СКК(1), "Ч15.2, ");
                    ТаблицаДляСортировки.СуммаДвижПриход     = Формат(Ит.ДО(1), "Ч15.2, ");
                    ТаблицаДляСортировки.СуммаДвижРасхода     = Формат(Ит.КО(1), "Ч15.2, ");
                    ТаблицаДляСортировки.Использовано         = Формат(Процент,  "Ч15.0, ");
                    
                КонецЕсли;
                //--- Запись строки в таблицу значений (Конец)                
                
                Если (Движ = 1) ИЛИ (Ист = 1) Тогда
                    
                    Ит.ВыбратьПериоды();
                    
                    Пока Ит.ПолучитьПериод() = 1 Цикл
                        
                        Если Движ = 1 Тогда
                            
                            Док        = Строка(Ит.Операция.Документ) + "; ";
                            Срок    = СрокИзДат(Ит.Операция.Документ.ДатаДок);
                            
                        Иначе
                            
                            Док    = "";
                        КонецЕсли;
                        
                        Если Ист = 1 Тогда
                            
                            Если Ит.ДО(3) > 0 Тогда
                                
                                Источник    = Строка(Ит.Операция.Кредит.МестаХранения);
                            Иначе
                                
                                Источник    = Строка(Ит.Операция.Дебет.МестаХранения);
                            КонецЕсли;
                            
                        Иначе
                            
                            Источник    = "";
                            
                        КонецЕсли;
                        
                        Сформировать_Колонки("Док");
                        
                    КонецЦикла;    //    ит.получитьПериод()= 1 Цикл
                    
                КонецЕсли;    // (движ = 1) или (Ист = 1) Тогда
                
            КонецЦикла;    // Ит.ПолучитьСубконто(ВидыСубконто.Материалы)= 1 Цикл            
            
            Если (ВыводитьМестаХранения = 1)
                И (ВыводитьСотрудников = 1) Тогда
                
                ВывестиГруппу(ТаблицаДляСортировки, Сч);                
                
            КонецЕсли;        
            
        КонецЦикла;    // Ит.ПолучитьСубконто(ВидыСубконто.Сотрудники)= 1 Цикл
        
        Если ВыводитьСотрудников = 0 Тогда
            
            ВывестиГруппу(ТаблицаДляСортировки, Сч);                
            
        КонецЕсли;
        
    КонецЦикла;    // Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения)= 1 Цикл
    
    Если (ВыводитьМестаХранения = 0)
        И (ВыводитьСотрудников = 0) Тогда
        
        ВывестиГруппу(ТаблицаДляСортировки, Сч);                
        
    КонецЕсли;    
        
    Расход    = ОборотСумма;
    Приход    = ПриходСумма;
    
    в        = Конец;
    г        = Начало;
    д        = КолНачало;
    е        = КолКонец;
    а        = РасходКол;
    б        = ПриходКол;
    
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    
    ПостОбработкаТаблицы(Таб, 6, 15, 4,,1,1);
    
    Таб.Показать("Сформировать2", "");
1 Роспатнюк Сергей Сер
 
30.05.19
14:45
(0) Да уж а еще не пятницо а бух забыл склад выбрать вот и долго формирует. Закрыто.