helpf.pro
Регистрация

Производительность отчета

danik_ru
28.12.2010 17:06Прочитано: 1970
Клиент-серверная версия 1С:Предприятие 8.2 (8.2.13.199) база расположена на MS SQL сервере. При формировании отчета за период 01012010-28122010 база начинает виснуть и в итоге отчет не формируется. Если формировать за небольшо период, то все прекрасно. Подскажите пожалуйста как ускорить работу отчета. Вот код отчета:
Код 1C v 8.х
 если РеестрНаУдержание тогда
Макет = Отчеты.АнализПродаж77.ПолучитьМакет("Макет");
ОбластьШапка = макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Дата = "Анализ продаж за период "+ формат(НачДата,"ДФ=dd.MM.yyyy")+" - "+ формат(КонДата,"ДФ=dd.MM.yyyy");
таблдок.Вывести(ОбластьШапка);
ОбластьДанные = макет.ПолучитьОбласть("Данные");
ОбластьПодвал = макет.ПолучитьОбласть("Подвал");
КонецЕсли;
если РеестрНачисленияШБф1 тогда
Макет1 = Отчеты.АнализПродаж77.ПолучитьМакет("Макет1");
ОбластьШапка1 = Макет1.ПолучитьОбласть("Шапка");
ОбластьШапка1.Параметры.Дата = "Анализ продаж за период "+ формат(НачДата,"ДФ=dd.MM.yyyy")+" - "+ формат(КонДата,"ДФ=dd.MM.yyyy");
таблдок1.Вывести(ОбластьШапка1);
ОбластьДанные1 = макет1.ПолучитьОбласть("Данные");
ОбластьПодвал1 = макет1.ПолучитьОбласть("Подвал");

КонецЕсли;

если РеестрНачисленияШБф2 тогда
Макет2 = Отчеты.АнализПродаж77.ПолучитьМакет("Макет2");
ОбластьШапка2 = Макет2.ПолучитьОбласть("Шапка");
ОбластьШапка2.Параметры.Дата = "Анализ продаж за период "+ формат(НачДата,"ДФ=dd.MM.yyyy")+" - "+ формат(КонДата,"ДФ=dd.MM.yyyy");
таблдок2.Вывести(ОбластьШапка2);
ОбластьДанные2 = Макет2.ПолучитьОбласть("Данные");
ОбластьПодвал2 = Макет2.ПолучитьОбласть("Подвал");

КонецЕсли;

если ОтчетПоДоговорамф1 тогда
Макет3 = Отчеты.АнализПродаж77.ПолучитьМакет("Макет3");
ОбластьШапка3 = Макет3.ПолучитьОбласть("Шапка");
ОбластьШапка3.Параметры.Дата = "Анализ продаж за период "+ формат(НачДата,"ДФ=dd.MM.yyyy")+" - "+ формат(КонДата,"ДФ=dd.MM.yyyy");
таблдок3.Вывести(ОбластьШапка3);
ОбластьДанные3 = Макет3.ПолучитьОбласть("Данные");
ОбластьПодвал3 = Макет3.ПолучитьОбласть("Подвал");
КонецЕсли;

запрос = новый запрос();
запрос.УстановитьПараметр("Анулирован",Перечисления.СтатусДоговора.Аннулирован);
запрос.УстановитьПараметр("Обмен",Перечисления.СтатусДоговора.Обмен);
запрос.УстановитьПараметр("кредспец",Спецы);
запрос.УстановитьПараметр("точки",Точки);
запрос.УстановитьПараметр("банки",Банки);
запрос.УстановитьПараметр("ДатаНач",НачалоДня(НачДата));
запрос.УстановитьПараметр("ДатаКон",КонецДня(КонДата));
запрос.УстановитьПараметр("НачДата1",НачалоДня(НачДата1));
запрос.УстановитьПараметр("КоНДата1",КонецДня(КонДата1));
запрос.УстановитьПараметр("НачДата2",НачалоДня(НачДата2));
запрос.УстановитьПараметр("КонДата2",КонецДня(КонДата2));
запрос.УстановитьПараметр("ФинСтатус",ФинСтатус);
запрос.УстановитьПараметр("Статус",Статус);
запрос.УстановитьПараметр("СтатусПустой",Перечисления.СтатусДоговора.ПустаяСсылка());

ТекФилиал = ПараметрыСеанса.ТекущийПользователь.Филиал;
запрос.УстановитьПараметр("филиал",ТекФилиал);

текстзапроса = "ВЫБРАТЬ
| Договор.Ссылка КАК Документ,
| Договор.КредСпец КАК КредСпециалист,
| Договор.Банк КАК Банк,
| Договор.ТорговаяТочка КАК ТорговаяТочка,
| Договор.Цена КАК Цена,
| Договор.Сумма КАК Сумма,
| Договор.Ответственный,
| Договор.Статус,
| Договор.Удержан,
| Договор.НаличиеДоков КАК ЛичноеСтрахование,
| Договор.НаличиеДоков1 КАК ПотеряРаботы,
| Договор.НаличиеДоков2 КАК Брокер,
| Договор.ФинСтатус,
| Договор.ДатаПоступлДенСр,
| Договор.ДатаПринятияБанка,
| 1 КАК Количество,
| Договор.Дата КАК ДатаДоговора,
| Договор.ФИО КАК ФИОЗаемщика,
| Договор.Номер КАК НомерДоговора,
| Договор.ТорговаяТочка.Код КАК КодСап,
| Договор.ТорговаяТочка.Филиал КАК ФилиалТТ,
| Договор.КолВозвратов,
| Договор.ТорговаяТочка.Субфилиал КАК Субфилиал,
| Договор.КредитныйКонтролер77 КАК КредитныйКонтролер,
| ПОДСТРОКА(Договор.Комментарий, 1, 300) КАК Комментарий
|ИЗ
| Документ.Договор КАК Договор
|ГДЕ
| Договор.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И Договор.Проведен = ИСТИНА ";



если НеВклОбменАнул тогда
текстзапроса = текстзапроса+ "И Договор.Статус <> &Анулирован ";
текстзапроса = текстзапроса+ "И Договор.Статус <> &Обмен ";
КонецЕсли;

если ТолькоУдержанные тогда
текстзапроса = текстзапроса+ "И Договор.Удержан = истина ";
КонецЕсли;

если ТолькоЛичноеСтрахование Тогда
текстзапроса = текстзапроса+"И Договор.НаличиеДоков = истина ";
КонецЕсли;

если СтрахОтПотериРаботы тогда
текстзапроса = текстзапроса+"И Договор.НаличиеДоков1 = истина ";
КонецЕсли;

если Брокер тогда
текстзапроса = текстзапроса+"И Договор.НаличиеДоков2 = истина ";
КонецЕсли;

если Спецы.Количество()>0 тогда
текстзапроса = текстзапроса+"И Договор.КредСпец В ИЕРАРХИИ (&кредспец) ";
КонецЕсли;

если Точки.Количество()>0 тогда
текстзапроса = текстзапроса+"И Договор.ТорговаяТочка В ИЕРАРХИИ (&точки) ";
КонецЕсли;

если Банки.Количество()>0 тогда
текстзапроса = текстзапроса+"И Договор.Банк В ИЕРАРХИИ (&банки) ";
КонецЕсли;

если ПоПоступДенСр тогда
текстзапроса = текстзапроса+"И Договор.ДатаПоступлДенСр >= &НачДата1 И Договор.ДатаПоступлДенСр <= &КонДата1 ";
КонецЕсли;
если ПринятиеДокВБанк тогда
текстзапроса = текстзапроса+"И Договор.ДатаПринятияБанка >= &НачДата2 И Договор.ДатаПринятияБанка <= &КонДата2 ";
КонецЕсли;

если не Статус.Пустая() тогда
если не Пустой тогда
текстзапроса = текстзапроса+ "И Договор.Статус = &Статус ";
Иначе
текстзапроса = текстзапроса+ "И (Договор.Статус = &Статус ИЛИ Договор.Статус = &СтатусПустой) ";

КонецЕсли;

КонецЕсли;

если Статус.Пустая() и Пустой тогда
текстзапроса = текстзапроса+ "И Договор.Статус = &СтатусПустой ";
КонецЕсли;

если не ФинСтатус.Пустая() тогда
текстзапроса = текстзапроса+ "И Договор.ФинСтатус = &ФинСтатус ";
КонецЕсли;

Если Не ПараметрыСеанса.ТекущийПользователь.ФункцииАдминистратора Тогда
текстзапроса = текстзапроса+"И Договор.Филиал = &филиал "
КонецЕсли;

текстзапроса = текстзапроса+ "
|ИТОГИ
| СУММА(Цена),
| СУММА(Сумма)
|ПО
| ОБЩИЕ,
| КредСпециалист,
| ТорговаяТочка,
| Банк,
| Документ";


запрос.Текст = текстзапроса;
результат = запрос.Выполнить();
выборка = результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
выборка.Следующий();
ИтогЦТ = выборка.Цена;
ИтогСК = выборка.Сумма;
выборка1 = выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

НС=0;
НС1=0;
НС2=0;
ИтКолДок=0;

пока выборка1.Следующий() цикл
КолДок=0;
выборка2 = выборка1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

пока выборка2.Следующий() цикл
КолДок1=0;
выборка3= выборка2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

пока выборка3.Следующий() цикл

выборка4= выборка3.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

пока выборка4.Следующий() цикл

НС1=НС1+1;
КолДок=КолДок+1;
КолДок1=КолДок1+1;
ИтКолДок=ИтКолДок+1;


если РеестрНаУдержание тогда
ОбластьДанные.Параметры.НС = НС;
ОбластьДанные.Параметры.Заполнить(выборка4);
ОбластьДанные.Параметры.КолДок = КолДок;


КонецЕсли;

если РеестрНачисленияШБф1 тогда
ОбластьДанные1.Параметры.Заполнить(выборка4);
ОбластьДанные1.Параметры.РасшифровкаТД = выборка4.Документ;
ОбластьДанные1.Параметры.НС1 = НС1;
ОбластьДанные1.Параметры.регион = выборка4.ТорговаяТочка.Филиал;
ОбластьДанные1.Параметры.ЛичноеСтрах = ?(выборка4.ЛичноеСтрахование=ложь,"нет","да");
ОбластьДанные1.Параметры.ОтПотериРаб = ?(выборка4.ПотеряРаботы=ложь,"нет","да");
ОбластьДанные1.Параметры.Брокер = ?(выборка4.Брокер=ложь,"нет","да");
таблдок1.вывести(ОбластьДанные1);
КонецЕсли;

если РеестрНачисленияШБф2 тогда
ОбластьДанные2.Параметры.Заполнить(выборка4);
ОбластьДанные2.Параметры.НС2 = НС2;
ОбластьДанные2.Параметры.КолДок1 =КолДок1;

КонецЕсли;

если ОтчетПоДоговорамф1 тогда
ОбластьДанные3.Параметры.Заполнить(выборка4);
ОбластьДанные3.Параметры.ТДРасшифровка = выборка4.Документ;
ОбластьДанные3.Параметры.НС1 = НС1;
ОбластьДанные3.Параметры.регион = выборка4.ТорговаяТочка.Филиал;
ОбластьДанные3.Параметры.ЛичноеСтрах = ?(выборка4.ЛичноеСтрахование=ложь,"нет","да");
ОбластьДанные3.Параметры.ОтПотериРаб = ?(выборка4.ПотеряРаботы=Ложь,"нет","да");
ОбластьДанные3.Параметры.Брокер = ?(выборка4.Брокер=Ложь,"нет","да");
таблдок3.вывести(ОбластьДанные3);
КонецЕсли;

если Удержан тогда
док = Документы.Договор.НайтиПоНомеру(выборка4.Документ.Номер,выборка4.Документ.Дата);
док = док.ПолучитьОбъект();
док.ДатаУдержания = ТекущаяДата();
док.Удержан = истина;
док.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
НС2=НС2+1;
если РеестрНачисленияШБф2 тогда
таблдок2.вывести(ОбластьДанные2);
КонецЕсли;
КонецЦикла;
НС=НС+1;
если РеестрНаУдержание тогда

таблдок.Вывести(ОбластьДанные);
КонецЕсли;
КонецЦикла;
если РеестрНаУдержание тогда
ОбластьПодвал.Параметры.ЦТ = ИтогЦТ;
ОбластьПодвал.Параметры.СК = ИтогСК;
ОбластьПодвал.Параметры.ИтКолДок = ИтКолДок;
ОбластьПодвал.Параметры.ФилРук = ПараметрыСеанса.ТекущийПользователь.Филиал.Руководитель;
таблдок.Вывести(ОбластьПодвал);
КонецЕсли;
если РеестрНачисленияШБф1 тогда
ОбластьПодвал1.Параметры.ЦТ = ИтогЦТ;
ОбластьПодвал1.Параметры.СК = ИтогСК;
ОбластьПодвал1.Параметры.ФилРук = ПараметрыСеанса.ТекущийПользователь.Филиал.Руководитель;
таблдок1.Вывести(ОбластьПодвал1);

КонецЕсли;

если РеестрНачисленияШБф2 Тогда
ОбластьПодвал2.Параметры.ЦТ = ИтогЦТ;
ОбластьПодвал2.Параметры.СК = ИтогСК;
ОбластьПодвал2.Параметры.ИтКолДок = ИтКолДок;
ОбластьПодвал2.Параметры.ФилРук = ПараметрыСеанса.ТекущийПользователь.Филиал.Руководитель;
таблдок2.Вывести(ОбластьПодвал2);

КонецЕсли;

если ОтчетПоДоговорамф1 тогда
ОбластьПодвал3.Параметры.ЦТ = ИтогЦТ;
ОбластьПодвал3.Параметры.СК = ИтогСК;
ОбластьПодвал3.Параметры.ФилРук = ПараметрыСеанса.ТекущийПользователь.Филиал.Руководитель;
таблдок3.Вывести(ОбластьПодвал3);

КонецЕсли;
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
29.12.2010 10:38Ответ № 1
(0) danik_ru, запрос то не особо сложный *09
похоже что SQL-лю не хватает мощности и памяти
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.