Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Оптимизация Проведения банковской выписки. (число прочтений - 1415 )
elemenrad
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
Оптимизация Проведения банковской выписки.
15. Ноября 2011 :: 20:14
Печать  
Итак есть фирма, долги клиентов закрываются в основном с указанием накладной при помощи документа "Банковская выписка"
Посмотрел код, нашел что основные тормоза связаны с тем что таблица тбДолги имеет непомерно большой размер (все накладные по каждому клиенту от начала работы в базе за 3 года)
Сама таблица формируется с помощью процедуры

Процедура РассчитатьВзаиморасчеты()
     спКонтрагенты = СоздатьОбъект("СписокЗначений");
     
     ВыбратьСтроки();
     Пока ПолучитьСтроку() = 1 Цикл
           Если глСчетаПоставщиковПокупателей.Принадлежит(Число(Счет.Код)) = 0 Тогда
                 // нам нужны только счета 36 и 63
               Продолжить;
           КонецЕсли;
           Если спКонтрагенты.Принадлежит(Субконто1) = 0 Тогда
               спКонтрагенты.ДобавитьЗначение(Субконто1);
           КонецЕсли;
     КонецЦикла;

     ВремРегистры=СоздатьОбъект("Регистры");
     
     РегПоставщики=ВремРегистры.ВзаиморасчетыПоставщиков;
     РегПоставщики.УстановитьЗначениеФильтра("Фирма",спФирмы,2);
     РегПоставщики.УстановитьЗначениеФильтра("Контрагент",спКонтрагенты,2);
     РегПоставщики.УстановитьЗначениеФильтра("Валюта",Валюта,1);
     
     РегПокупатели=ВремРегистры.ВзаиморасчетыПокупателей;
     РегПокупатели.УстановитьЗначениеФильтра("Фирма",спФирмы,2);      
     РегПокупатели.УстановитьЗначениеФильтра("Контрагент",спКонтрагенты,2);
     РегПокупатели.УстановитьЗначениеФильтра("Валюта",Валюта,1);
     
     Если ИтогиАктуальны() = 0 Тогда
           РегПоставщики.ВременныйРасчет();
           РегПокупатели.ВременныйРасчет();
           ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
     КонецЕсли;
КонецПроцедуры //РассчитатьВзаиморасчеты

и затем подготовленные регистри выгружаются

     РегПоставщики.УстановитьЗначениеФильтра("Фирма",текФирма,1);
                 РегПоставщики.УстановитьЗначениеФильтра("Контрагент",спКонтрагенты,2);
                 РегПоставщики.УстановитьЗначениеФильтра("Валюта",Валюта,1);
                 РегПоставщики.ВыгрузитьИтоги(тбДолгиПоставщиков,1,1);
                 
                 РегПокупатели.УстановитьЗначениеФильтра("Фирма",текФирма,1);
                 РегПокупатели.УстановитьЗначениеФильтра("Контрагент",спКонтрагенты,2);
                 РегПокупатели.УстановитьЗначениеФильтра("Валюта",Валюта,1);
                 РегПокупатели.ВыгрузитьИтоги(тбДолгиПокупателей,1,1);


уважаемое комьюнити помогите пожалуста с оптимизацией! Думаю использовать  прямые запросы, однако голова нифига не может сварить адекватного. благодарю за любые идеи заранее! Улыбка
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Оптимизация Проведения банковской выписки.
Ответ #1 - 16. Ноября 2011 :: 02:29
Печать  
elemenrad писал(а) 15. Ноября 2011 :: 20:14:
Посмотрел код, нашел что основные тормоза связаны с тем что таблица тбДолги имеет непомерно большой размер (все накладные по каждому клиенту от начала работы в базе за 3 года)


Если тдДолги - это тбДолгиПоставщиков + тбДолгиПокупателей, то есть подозрение, что у тебя в регистрах хаос.

Ну и да, замена ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент()); на прямой запрос даст очень хороший выигрышь.

Запрос будет выглядеть примерно так:

Код
Выбрать все
Select
...
From
$РегистрОстатки.ВзаиморасчетыПокупателей(:ПозДокумента,, Фирма = :ТекФирма And Валюта = :ТекВалюта And Контагент in (select val from " + ИмяТаблицыФильтра + " (nolock) ), (<измерения>), (<ресурсы>)) рег 


где ИмяТаблицыФильтра - это то, что ты укажешь вторым параметром в УложитьСписокОбъектов().

Подробности смотри в документации по icpp
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Оптимизация Проведения банковской выписки.
Ответ #2 - 16. Ноября 2011 :: 05:55
Печать  
Вполне согласен что если у тебе вываливаються все документы,то явно что с регистрами не все в порядке, а именно незакрываються они у вас уважаемый.
Прямые конечно помогут, но думаю что не сильно, бо память как хавало та и будет хавать, правда расчет будет конечно намного быстрее.
И все таки с закрытием итогов все же посоветовалбы разобраться.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать