Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Можно ли ускорить "АктивизироватьОбъект" в журнале (число прочтений - 4077 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Можно ли ускорить "АктивизироватьОбъект" в журнале
27. Декабря 2006 :: 13:00
Печать  
Моя обработка ищет в обычном журнале документы по выбранным фрагментам их реквизитов: фрагмента номера, фрагмента наименования контрагента, фрагмента суммы и т.д. Выводит найденные документы в таблицу значений. где после интерактивного выбора позиционирует на выбранный документ в журнале стандартным методом "АктивизироватьОбъект". Если сам поиск выполняется достаточно быстро, то после выбора документа само позиционирование в журнале заметно тормозит.
Вопрос: существует ли возможность средствами 1С++ ускорить процесс позиционирования на выбранный документ в журнале?
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #1 - 27. Декабря 2006 :: 13:10
Печать  
что-то странно это...
1) покажи код "позиционирования на документ"
2) замеры производительности
3) используется ли раскраска в журнале (FormEx)?
4) какие вычисляемые поля есть в журнале?
5) простой скроллинг тоже тормозит?

короче - там ли ты роешь?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #2 - 27. Декабря 2006 :: 13:17
Печать  
Прежде всего база dbf или SQL?
И какой объем документов?
Если в журнале несколько сотен тысяч документов, но активизировать подтормаживать будет
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #3 - 27. Декабря 2006 :: 13:30
Печать  
База на SQL
В журнале используется раскраска строк средствами 1С++
Три вычисляемых колонки с запросами по регистрам
Текст процедуры запросов, выбора и позиционирования ниже

Процедура Выполнить(ЧтоИщем)
     Перем ВыбСтрока;
     Если ПустаяСтрока(ЧтоИщем)=1 Тогда
           Предупреждение("Уточните параметр поиска!",10);
           Возврат;
     КонецЕсли;
     Если ЧтоИщем=НомерДокумента Тогда
           ТекстЗапроса="
                       |SELECT
                       |      Жур.IDDoc as [Док $Документ.Счет],
                       |      Жур.IDDocDef as Док_вид,
                       |      Жур.DocNo as НомерДок,
                       |      $Док.Контрагент as [Контр $Справочник.Контрагенты]
                       |FROM
                       |      _1SJourn as Жур
                       |INNER JOIN
                       |      $Документ.Счет as Док ON Док.IDDoc = Жур.IDDoc
                       |WHERE
                       |      Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
                       |      Жур.IDDocDef = $ВидДокумента.Счет AND
                       |      Жур.DocNo Like "+"'%"+СокрЛП(НомерДокумента)+"%'
                       |";
           _RS.УстановитьТекстовыйПараметр("НачДата",НачалоИнтервала);
           _RS.УстановитьТекстовыйПараметр("КонДата",КонецИнтервала);
     ИначеЕсли ЧтоИщем=ДатаДокумента Тогда
           _ДатаДокумента=СокрЛП(ДатаДокумента);
           Если ЧислоЦифрВПредставленииДаты=8 Тогда
                 ВыбДата=Дата(Лев(_ДатаДокумента,6)+"20"+Прав(_ДатаДокумента,2));
           Иначе
                 ВыбДата=Дата(ДатаДокумента);
           КонецЕсли;
           Если (ВыбДата>КонецИнтервала) или (ВыбДата<НачалоИнтервала) Тогда
                 Предупреждение("Выберите дату в периоде журнала!",10);
                 Активизировать("ДатаДокумента",0);
                 Возврат;
           КонецЕсли;
           ТекстЗапроса="
                       |SELECT
                       |      Жур.IDDoc as [Док $Документ.Счет],
                       |      Жур.IDDocDef as Док_вид,
                       |      Жур.DocNo as НомерДок,
                       |      $Док.Контрагент as [Контр $Справочник.Контрагенты]
                       |FROM
                       |      _1SJourn as Жур
                       |INNER JOIN
                       |      $Документ.Счет as Док ON Док.IDDoc = Жур.IDDoc
                       |WHERE
                       |      Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
                       |      Жур.IDDocDef = $ВидДокумента.Счет
                       |";
           _RS.УстановитьТекстовыйПараметр("НачДата",ВыбДата);
           _RS.УстановитьТекстовыйПараметр("КонДата",ВыбДата);
     ИначеЕсли ЧтоИщем=Контрагент Тогда
           ТекстЗапроса1="
                       |SELECT
                       |      Спр.ID as [Элемент $Справочник.Номенклатура]
                       |FROM
                       |      $Справочник.Контрагенты as Спр
                       |WHERE
                       |      Спр.Descr Like '%"+СокрЛП(Контрагент)+"%' AND isfolder<>1";
           ТекстЗапроса="
                       |SELECT
                       |      Жур.IDDoc as [Док $Документ.Счет],
                       |      Жур.IDDocDef as Док_вид,
                       |      Жур.DocNo as НомерДок,
                       |      $Док.Контрагент as [Контр $Справочник.Контрагенты]
                       |FROM
                       |      _1SJourn as Жур
                       |INNER JOIN
                       |      $Документ.Счет as Док ON Док.IDDoc = Жур.IDDoc
                       |WHERE
                       |      Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
                       |      Жур.IDDocDef = $ВидДокумента.Счет AND
                       |      $Док.Контрагент in ("+ТекстЗапроса1+")
                       |";
           _RS.УстановитьТекстовыйПараметр("НачДата",НачалоИнтервала);
           _RS.УстановитьТекстовыйПараметр("КонДата",КонецИнтервала);
     ИначеЕсли ЧтоИщем=Сумма Тогда
           ТекстЗапроса="
                       |SELECT
                       |      Жур.IDDoc as [Док $Документ.Счет],
                       |      Жур.IDDocDef as Док_вид,
                       |      Жур.DocNo as НомерДок,
                       |      $Док.Контрагент as [Контр $Справочник.Контрагенты],
                       |      SUM($Док.СуммаСНДС) as Сумма
                       |FROM
                       |      _1SJourn as Жур
                       |INNER JOIN
                       |      $Документ.Счет as Док ON Док.IDDoc = Жур.IDDoc
                       |WHERE
                       |      Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
                       |      Жур.IDDocDef = $ВидДокумента.Счет
                       |HAVING
                       |      SUM($Док.СуммаСНДС) Like "+"'%"+СокрЛП(Сумма)+"%'

                       //|      Жур.DocNo Like "+"'%"+СокрЛП(НомерДокумента)+"%'
                       |";
           _RS.УстановитьТекстовыйПараметр("НачДата",НачалоИнтервала);
           _RS.УстановитьТекстовыйПараметр("КонДата",КонецИнтервала);
     Иначе
           Предупреждение("Пока не работает!",10);
           Возврат;
     КонецЕсли;
     //_RS.Отладка();
     ТЗ=_RS.ВыполнитьИнструкцию(ТекстЗапроса);
     ТЗ_КолСтрок=ТЗ.КоличествоСтрок();
     Если ТЗ_КолСтрок=0 Тогда
           Предупреждение("Вхождений не найдено...");
           Возврат;
     КонецЕсли;
     ТЗ.ВидимостьКолонки("Док_Вид,НомерДок",0);
     ТЗ.УстановитьПараметрыКолонки(1,,,,"Документ",43,,1);
     ТЗ.УстановитьПараметрыКолонки(4,,,,"Контрагент",40,,1);
     Если ТЗ.ВыбратьСтроку(ВыбСтрока,"Выберите документ ["+ТЗ_КолСтрок+"]")=1 Тогда
           Конт.Активизировать("НомерДок",0);
           Конт.АктивизироватьОбъект(ТЗ.ПолучитьЗначение(ВыбСтрока,1));
     КонецЕсли;
     _RS.Закрыть();
     Форма.Закрыть();
КонецПроцедуры
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #4 - 27. Декабря 2006 :: 13:33
Печать  
С запросом по сумме не разобрался, пока не работает...

Просьба не топтать ногами. Из нас зеленых благодарная смена вам растет
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #5 - 27. Декабря 2006 :: 14:06
Печать  
1) запросы сейчас не рассматриваем, хотя их можно немножко почистить от мусора типа Жур.IDDocDef as Док_вид,   [Элемент $Справочник.Номенклатура] и т.д.

2) похоже что это не весь код - судя по всему ввод критериев поиска и сам поиск у тебя выполняется в некоей модальной форме, которую ты потом закрываешь Форма.Закрыть();  - так вот интересует код вызова этой формы для ввода критериев... (кстати нет ли у тебя чего-нибудь в процедуре ПриЗакрытии() в этой форме? - может тормозить там)

3) Попробуй отключи раскраску и посмотри, что изменится

4) все таки - замеры производительности и количество доков - не помешали бы
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #6 - 27. Декабря 2006 :: 14:34
Печать  
Форма не модальная, самая обыкновенная. Вызывается в журнале по горячей клавише F7 на невидимой кнопке. Все поисковые поля строковые. После выбора документа и позиционировании на него в журнале форма принудительно закрывается за ненадобность...

Наверное, тормоза из-за вычисляемых колонок, там запросы по регистрам. Просто думал, что задержка позиционирования - это очередные тормоза 1С и есть как обойти это "народными" средствами...

Сорри

Кстати, не поможете ли с последним запросом: в документе Счет в табличной части поле СуммаСНДС, с итогами. Надо по фрагменту суммы (строка) отобрать счета с похожим итогом по колонке документа СуммаСНДС и исправить этот бред:
|HAVING
|      SUM($Док.СуммаСНДС) Like "+"'%"+СокрЛП(Сумма)+"%'
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #7 - 27. Декабря 2006 :: 14:40
Печать  
1) оптимизируй запросы по регистрам, коль тормозят они (параметризированными запросами)
2) отключай вычисления этих регистров в момент позиционирования
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #8 - 27. Декабря 2006 :: 14:48
Печать  
DrACe писал(а) 27. Декабря 2006 :: 14:40:
1) оптимизируй запросы по регистрам, коль тормозят они (параметризированными запросами)
2) отключай вычисления этих регистров в момент позиционирования


С первым согласен на все 100. Только принял новую базу, а там - за голову хватаюсь  Ужас

Со вторым пока не представляю как реализовать
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #9 - 27. Декабря 2006 :: 14:55
Печать  
Кстати, не поможете ли с последним запросом: в документе Счет в табличной части поле СуммаСНДС, с итогами. Надо по фрагменту суммы (строка) отобрать счета с похожим итогом по колонке документа СуммаСНДС и исправить этот бред:
|HAVING 
|      SUM($Док.СуммаСНДС) Like "+"'%"+СокрЛП(Сумма)+"%'
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #10 - 28. Декабря 2006 :: 05:39
Печать  
1) отключать вычисление какой-нибудь функции в модуле можно обычным флагом:
Код
Выбрать все
Перем НеВычислять;

Функция ЩасЯНасчитаю(...)
Если НеВычислять = 1 Тогда
Возврат 0;
КонецЕсли;

//Тут я регистры ворочаю...
КонецФункции 



2) вообще логичнее число сравнивать с числами - вводил бы нормальный диапазон для поиска
2.1. если уж хочешь сравнивать со строкой, то сначала надо получить из числа строку, значит надо подумать о формате: разделители разрядов, разделитель дробной части...
CAST($Док.СуммаСНДС AS char(20)) Like "+"'%"+СокрЛП(Сумма)+"%'
  
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Можно ли ускорить "АктивизироватьОбъект" в жур
Ответ #11 - 03. Января 2007 :: 19:28
Печать  
DrACe писал(а) 28. Декабря 2006 :: 05:39:
2) вообще логичнее число сравнивать с числами - вводил бы нормальный диапазон для поиска
2.1. если уж хочешь сравнивать со строкой, то сначала надо получить из числа строку, значит надо подумать о формате: разделители разрядов, разделитель дробной части...
CAST($Док.СуммаСНДС AS char(20)) Like "+"'%"+СокрЛП(Сумма)+"%'


Логичнее - да, но быстрее получается ввести число как строку, и задать маску строки поиска 999... Ведь требуется всего лишь поиск по фрагменту суммы.

Кстати, как ни странно, но $Док.СуммаСНДС Like '%"+СокрЛП(Сумма)+"%' у меня работает и в таком виде.

Всем огромное спасибо за помощь, и с Новым Годом!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать