Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Вопрос по ТП (число прочтений - 16093 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Вопрос по ТП
16. Сентября 2009 :: 12:39
Печать  
База MSSQL.
Отображаю в ТП журнал документов. Если период "год", то запрос отрабатывает быстро, как в обычном журнале, если 2-3 года, то при пролистовании заметны тормоза.
Как я понимаю сначала выполняется "полный" запрос (выбираются доки за 2-3 года), а потом от него отрезается некий период, который мы видим в ТП.

Вопрос - может есть какие-нить хитрости, чтоб избежать подобные тормоза?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #1 - 16. Сентября 2009 :: 12:52
Печать  
chessman писал(а) 16. Сентября 2009 :: 12:39:
Вопрос - может есть какие-нить хитрости, чтоб избежать подобные тормоза?

есть - нужно попадать в индекс
покажи КП (ключ порядка) и условия в тексте запроса если есть
  

1&&2&&3
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #2 - 16. Сентября 2009 :: 13:01
Печать  
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT    
		|	tmp.date_time_iddoc	as Д_Т_ИдДок,
		|	tmp.iddoc 		as Док,
		|	tmp.Док_вид		as Док_вид,
		|	tmp.ДатаДок 		as ДатаДок,
		|	tmp.НомерДок	 	as НомерДок,
		|	tmp.НомерСделки	as НомерСделки,
		|	Акции.descr		as Акции,
		|	dbo._format(tmp.Приход)	as Приход,
		|	dbo._format(tmp.Расход)	as Расход,
		|	tmp.Приход			as Приход1,
		|	tmp.Расход			as Расход1,
		|	Биржи.code			as Биржа
		|FROM
		|	(SELECT
		|		Журн.date_time_iddoc,
		|		Журн.iddoc,
		|		Журн.iddocdef					  Док_вид,
		|		cast (Left(Журн.date_time_iddoc, 8) as datetime) ДатаДок,
		|		Журн.docno										 НомерДок,
		|		$ПриходАкций.НомерСделки 	НомерСделки,
		|		$ПриходАкций.Акции			Акции,
		|		$ПриходАкций.Сумма			Приход,
		|		0 					Расход,
		|		$ПриходАкций.Биржа			Биржа
		|	FROM
		|		$Документ.ПриходАкций ПриходАкций (NOLOCK)
		|	INNER JOIN
		|		_1SJourn Журн (NOLOCK INDEX=JOURNAL)
		|	On
		|		IDJOURNAL = " + This().МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
		|		Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата and
		|		iddocdef  = $ВидДокумента.ПриходАкций and
		|		Журн.iddoc = ПриходАкций.iddoc
		|	UNION ALL
		|	SELECT
		|		Журн.date_time_iddoc,
		|		Журн.iddoc,
		|		Журн.iddocdef	 			 Док_вид,
		|		cast (Left(Журн.date_time_iddoc, 8) as datetime) ДатаДок,
		|		Журн.docno										 НомерДок,
		|		$РасходАкций.НомерСделки,
		|		$РасходАкций.Акции		,
		|		0,
		|		$РасходАкций.Сумма,
		|		$РасходАкций.Биржа
		|	FROM
		|		$Документ.РасходАкций РасходАкций (NOLOCK)
		|	INNER JOIN
		|		_1SJourn Журн (NOLOCK INDEX=JOURNAL)
		|	On
		|		IDJOURNAL = " + This().МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
		|		Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата and
		|		iddocdef  = $ВидДокумента.РасходАкций and
		|		Журн.iddoc = РасходАкций.iddoc
		|	) tmp
		|LEFT JOIN
		|	$Справочник.Акции Акции
		|On
		|	tmp.Акции = Акции.id
		|LEFT JOIN
		|	$Справочник.Биржи Биржи
		|On
		|	tmp.Биржа = Биржи.id
		|WHERE  
		|	(1 = 1)
		|";
 




А КП устанавливаю, в зависимости от колонки сортировки

Код
Выбрать все
Источник.УстКлючПорядка(ТекКолонкаСортировки + " " + НаправлениеСортировки + ", Д_Т_ИдДок ASC"); 

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #3 - 16. Сентября 2009 :: 13:09
Печать  
Цитата:
А КП устанавливаю, в зависимости от колонки сортировки
такой подход к сортировке и такой запрос всегда будет тормозить.

Чудес не бывает.
Либо довольствуешся отборами и сортировками которые можно построить на существующих у _1sjourn индексах либо, на больших периодах, получаешь тормоза и бешенную нагрузку на сервер.
  

1&&2&&3
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #4 - 16. Сентября 2009 :: 13:11
Печать  
trad писал(а) 16. Сентября 2009 :: 13:09:
Цитата:
А КП устанавливаю, в зависимости от колонки сортировки
такой подход к сортировке и такой запрос всегда будет тормозить.

Чудес не бывает.
Либо довольствуешся отборами и сортировками которые можно построить на существующих у _1sjourn индексах либо, на больших периодах, получаешь тормоза и бешенную нагрузку на сервер.


Спасибо. Понял.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #5 - 16. Сентября 2009 :: 13:23
Печать  
Подумай, так ли уж нужно сортировать по любой колонке.
Может быть достаточно:

по позиции документа - индекс есть
по виду и позиции - индекс есть

по акции и позиции
по бирже и позиции
по номеруСделки и позиции - по этим трем можно сделать графы отбора и запрос перестраивать на _1scrdoc
правда акции и биржи будут упорядочены, но не по алфавиту
  

1&&2&&3
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #6 - 16. Сентября 2009 :: 13:29
Печать  
trad писал(а) 16. Сентября 2009 :: 13:23:
Подумай, так ли уж нужно сортировать по любой колонке.
Может быть достаточно:

по позиции документа - индекс есть
по виду и позиции - индекс есть

по акции и позиции
по бирже и позиции
по номеруСделки и позиции - по этим трем можно сделать графы отбора и запрос перестраивать на _1scrdoc


Для меня этот вопрос в большей степени "академический" - хотел просто понять, правильно ли все делаю.
Тормоза в данном случае не критичны, т.к. в секции "where" можно добавить отборы по любой колонке из ТП.
Но в любом случае спасибо за инфу.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #7 - 16. Сентября 2009 :: 13:52
Печать  
(0) в Журнале(1с) есть еще другие виды документов ?


Вместо
1SJourn Журн (NOLOCK INDEX=JOURNAL)
я бы написал
1SJourn Журн (NOLOCK) пусть Sql сам определит по какому
индексу ему выбирать записи.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #8 - 16. Сентября 2009 :: 14:00
Печать  
Ну хозяин барин, я так пробовал, тормозил даже, если выбран период  "год", а с явным индексом стало без тормозов.

Опять же "тормоза" там не глобальные, просто заметен скроллинг.
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Вопрос по ТП
Ответ #9 - 16. Сентября 2009 :: 14:03
Печать  
trad писал(а) 16. Сентября 2009 :: 13:09:
Цитата:
А КП устанавливаю, в зависимости от колонки сортировки
такой подход к сортировке и такой запрос всегда будет тормозить.

Чудес не бывает.
Либо довольствуешся отборами и сортировками которые можно построить на существующих у _1sjourn индексах либо, на больших периодах, получаешь тормоза и бешенную нагрузку на сервер.


а добавить необходимые индексы?
http://www.softpoint.ru/article_id15.htm
  
Наверх
wwwICQ  
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #10 - 16. Сентября 2009 :: 14:06
Печать  
Да, вот я тоже об этом же подумал  Подмигивание
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #11 - 16. Сентября 2009 :: 14:08
Печать  
chessman писал(а) 16. Сентября 2009 :: 14:00:
Ну хозяин барин, я так пробовал, тормозил даже, если выбран период  "год", а с явным индексом стало без тормозов.

Опять же "тормоза" там не глобальные, просто заметен скроллинг.

может надо проверить статистику. Теоретически он (sql) сам должен
додуматься до оптимального индекса ( либо sql не успевает найти этот индекс и делает как-то по другому). Также наверное у тебя наверное малый процент этих документов к общему числу документов.

Входят ли еще какие либо документы в этот журнал Акций ?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #12 - 16. Сентября 2009 :: 14:10
Печать  
Z1 писал(а) 16. Сентября 2009 :: 14:08:
chessman писал(а) 16. Сентября 2009 :: 14:00:
Ну хозяин барин, я так пробовал, тормозил даже, если выбран период  "год", а с явным индексом стало без тормозов.

Опять же "тормоза" там не глобальные, просто заметен скроллинг.

может надо проверить статистику. Теоретически он (sql) сам должен
додуматься до оптимального индекса ( либо sql не успевает найти этот индекс и делает как-то по другому). Также наверное у тебя наверное малый процент этих документов к общему числу документов.

Входят ли еще какие либо документы в этот журнал Акций ?


нет, только 2 вида доков
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #13 - 16. Сентября 2009 :: 14:11
Печать  
Anatol писал(а) 16. Сентября 2009 :: 14:03:
trad писал(а) 16. Сентября 2009 :: 13:09:
Цитата:
А КП устанавливаю, в зависимости от колонки сортировки
такой подход к сортировке и такой запрос всегда будет тормозить.

Чудес не бывает.
Либо довольствуешся отборами и сортировками которые можно построить на существующих у _1sjourn индексах либо, на больших периодах, получаешь тормоза и бешенную нагрузку на сервер.


а добавить необходимые индексы?
http://www.softpoint.ru/article_id15.htm

Добавить еще индексы это компромисс если их индексов много то это тоже плохо для insert,update,delete.
Т.е. добавлять свои индексы надо только для архиважных отборов,сортировок.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #14 - 16. Сентября 2009 :: 14:15
Печать  
Доков 2х видов 18509
Всего доков 78874
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #15 - 16. Сентября 2009 :: 14:26
Печать  
chessman писал(а) 16. Сентября 2009 :: 14:15:
Доков 2х видов 18509
Всего доков 78874

это за год ?

это очень мало странно что без явного хинта индекса все так плохо.
Скорее всего что-то со статистикой не так либо очень огромная фрагментация таблицы и слабая дисковая система.

Только что проверил без явного указания индекса журнала
select идет сканирование по кластерному индексу журнала т.е. перебирает все документы.
Когда указан журнал select c (NOLOCK INDEX=JOURNAL) то сразу scan seek по индексу JOURN
и поиск намного быстрее.так что был не прав я почему то предполагал что sql сможет сам найти индекс ан нет.

Подумал почему бы вместо union all
не попробовать запрос написать через case вроде красивее получается.
« Последняя редакция: 17. Сентября 2009 :: 06:08 - Z1 »  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #16 - 16. Сентября 2009 :: 14:32
Печать  
За  2,5 года, на счет case посмотрю Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #17 - 17. Сентября 2009 :: 08:19
Печать  
C case все оказалось гораздо хуже
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #18 - 17. Сентября 2009 :: 08:20
Печать  
Вариант 1 ( аналогичный твоему )
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,$ПКО.Валюта [Валюта $Справочник.Валюты]
|	 ,$ПКО.Фирма  [Фирма $Справочник.Фирмы]
|	 ,$ПКО.Сумма123  as СуммаПКО
|	 ,0 as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 336
|UNION ALL
|SELECT
|		 Журн.date_time_iddoc
|		,Журн.iddoc
|		,Журн.iddocdef
|		,Журн.docno
|	 ,$РКО.Валюта
|	 ,$РКО.Фирма
|	 ,0
|	 ,$РКО.Сумма123
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 322
|";

 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #19 - 17. Сентября 2009 :: 08:21
Печать  
Вариант 2
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Валюта    else $РКО.Валюта    end)  [Валюта $Справочник.Валюты]
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Фирма     else $РКО.Фирма     end)  [Фирма $Справочник.Фирмы]
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Сумма123  else 0		  end) as СуммаПКО
|	 ,(case when Журн.iddocdef = 336 then 0		  else $РКО.Сумма123  end) as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|LEFT JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|LEFT JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|";
 

  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #20 - 17. Сентября 2009 :: 08:29
Печать  
2-й сильнее тормозит?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #21 - 17. Сентября 2009 :: 08:36
Печать  
chessman писал(а) 17. Сентября 2009 :: 08:29:
2-й сильнее тормозит?

по фактическому времени делал в qa
Вариант 1    всегда мгновенно 0 сек
Вариант 2    1-2 секунды
Интервал выборки год. Сумарно выбрано документов 34 100 обоими запросами одинаково.

По планам выполнения вариант 2 выглядит очень плохо по сравнению с вариантом 1.

Кстати для твоего запроса зачем в твоем запросе left со справочниками
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #22 - 17. Сентября 2009 :: 08:42
Печать  
left со справочниками для "правильной" сортировки в ТП, иначе он по id будет сортировать, а не по descr

Цитата:
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]


буду знать Круглые глаза
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #23 - 17. Сентября 2009 :: 08:48
Печать  
chessman писал(а) 17. Сентября 2009 :: 08:42:
left со справочниками для "правильной" сортировки в ТП, иначе он по id будет сортировать, а не по descr

Цитата:
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]


буду знать Круглые глаза

ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.

Кстати Вариант 1 и Вариант 2 все может по времени выполнения  измениться если нужно будет добавить сортировку
в варианте 2 уже есть упорядоченность по времени
а в варианте 1 ее еще надо отсортировать.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #24 - 17. Сентября 2009 :: 09:20
Печать  
Цитата:
ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.


Ну тогда мне нужно "весь" цикл установки запроса пройти, а так я просто меняю КП (ключ порядка)
Я делал замеры с join-ми и без них - это особо не сказывалось на результатах, так что я решил join-ить справочники
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #25 - 17. Сентября 2009 :: 09:48
Печать  
chessman писал(а) 17. Сентября 2009 :: 09:20:
Цитата:
ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.


Ну тогда мне нужно "весь" цикл установки запроса пройти, а так я просто меняю КП (ключ порядка)
Я делал замеры с join-ми и без них - это особо не сказывалось на результатах, так что я решил join-ить справочники

ну это потому что справочники малые.
ну и как бы если можно не нагружать sql то надо к этому стремиться.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #26 - 17. Сентября 2009 :: 09:49
Печать  
Вариант 21
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,$ПКО.Валюта [Валюта $Справочник.Валюты]
|	 ,$ПКО.Фирма  [Фирма $Справочник.Фирмы]
|	 ,$ПКО.Сумма123  as СуммаПКО
|	 ,0 as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 336
|UNION ALL
|SELECT
|		 Журн.date_time_iddoc
|		,Журн.iddoc
|		,Журн.iddocdef
|		,Журн.docno
|	 ,$РКО.Валюта
|	 ,$РКО.Фирма
|	 ,0
|	 ,$РКО.Сумма123
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 322
|ORDER BY  Журн.date_time_iddoc
|";
 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #27 - 17. Сентября 2009 :: 09:50
Печать  
Вариант21 Отличается от  Варианта 2 только наличием сортировки по времени
и вот уже вариант 21 и вариант 1 выполняются за одинаковое время.
Может вечером попробую эти варианты
за больший период. Можно также будет попробовать на более
слабом сервере чтобы увидеть разницу в скорости выполнения.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #28 - 17. Сентября 2009 :: 14:49
Печать  
на выборке из 217000 отобранных документов
Вариант 1     8 сек
Вариант 2     4 сек
Вариант 21   6 сек
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Вопрос по ТП
Ответ #29 - 17. Сентября 2009 :: 17:16
Печать  
У меня организовано аналогично второму варианту, только не через case, а через coalesce. Вроде работает нормально.  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #30 - 13. Октября 2009 :: 12:51
Печать  
Провожу дальнейшие исследования на тему ускорения работы ТП.
Обнаружилась у меня одна базка, с бОООльшим количеством доков. Если открыть журнал на ТП, например за год, скроллинг тормозит секунды 3. Это сводит на нет всю идею реализации.

Вот, какую идею хочу обсудить:
1. Делаем временную таблицу, ##temp_1sjourn.
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|into
	|	##temp_1sjourn
	|FROM
	|	_1sjourn
	|WHERE
	|	1 = 0
	|";
 


2. Загоняем в нее "ближайшие" для текущего документа доки .

Код
Выбрать все
ТекстЗапроса = "
	|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc >= :Док
	|ORDER BY
	|	date_time_iddoc
	|";
 



Код
Выбрать все
ТекстЗапроса = "
	|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc < :Док
	|ORDER BY
	|	date_time_iddoc DESC
	|";
 



3. В запросе для ТП ссылаемся на временную таблицу

Код
Выбрать все
|	FROM
|		##temp_1sjourn Журн (NOLOCK)-- _1SJourn Журн (NOLOCK INDEX=JOURNAL)
|	INNER JOIN
|		$Документ.ПриходАкций ПриходАкций
|	On
|		--IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
|		--Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата and
|		Журн.iddocdef = $ВидДокумента.ПриходАкций and
|		Журн.iddoc = ПриходАкций.iddoc
 



4. В обработке события ПриАктивизацииСтроки, обновляем временную таблицу.
5. В обработке события ПриНажатииКнопкиКлавиатуры обрабатываем "Номе" и "End".

У меня на боевой базе, даже при установке периода в 3 года , все летает.
Вопрос: Утопична ли такая реализация?

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #31 - 13. Октября 2009 :: 13:21
Печать  
Так вроде ж поставщик для ТП примерно так и делает, как ты написал
Код
Выбрать все
|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc < :Док
	|ORDER BY
	|	date_time_iddoc DESC
	|"; 


за счет чего ускорение-то не пойму...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #32 - 13. Октября 2009 :: 13:38
Печать  
Насколько я понял, поставщик сначала делает полный запрос, а потом от него отрезает видимую часть.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #33 - 13. Октября 2009 :: 14:44
Печать  
Цитата:
4. В обработке события ПриАктивизацииСтроки, обновляем временную таблицу.
5. В обработке события ПриНажатииКнопкиКлавиатуры обрабатываем "Номе" и "End".

У меня на боевой базе, даже при установке периода в 3 года , все летает.
Вопрос: Утопична ли такая реализация?

Я только не понял а если другой пользователь изменит документ
(или вообще создаст новый  документ ) то как это попадет во
временную таблицу ?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #34 - 13. Октября 2009 :: 16:46
Печать  
chessman писал(а) 13. Октября 2009 :: 13:38:
Насколько я понял, поставщик сначала делает полный запрос, а потом от него отрезает видимую часть.

Скуля нет, поэтому проверить не могу, но очень сомневаюсь, что он работает именно так. Нафиг тогда он вообще нужен? Это равносильно выполнению запроса и отображению результата этого запроса ТЗ в ТП.
Может ты просто в индекс не попадаешь или ключ порядка выбран неверно?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #35 - 13. Октября 2009 :: 17:46
Печать  
JohnyDeath писал(а) 13. Октября 2009 :: 16:46:
Может ты просто в индекс не попадаешь или ключ порядка выбран неверно?

См. #2
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #36 - 14. Октября 2009 :: 08:12
Печать  
Да уж, с таким запросом конечно не просто. Правда непонятно, как на таком запросе проявится эффект с временной таблицей, вроде ничего существенного не изменится.
З.Ы. По поводу п.2 - мне кажется индекс DOCTYPE здесь будет более оптимальным, так как в журнале "Акции" находятся и документы "ПриходАкция" и "РасходАкция", да и еще какие-нибудь могут быть. При использовании же указанного мной индекса конечная выборка будет существенно меньше. Так же, при этом, условие на принадлежность к журналу "Акции" становится ненужным.
  
Наверх
ICQ  
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #37 - 14. Октября 2009 :: 08:20
Печать  
Вот, что приезжает в источник данных

Вариант 1. "Обычный" запрос для ТП:

Код
Выбрать все
select top 20
	tmp.date_time_iddoc as Д_Т_ИдДок,
	tmp.iddoc as Док,
	tmp.Док_вид as Док_вид,
	tmp.ДатаДок as ДатаДок,
	tmp.НомерДок as НомерДок,
	tmp.НомерСделки as НомерСделки,
	Акции.Code as АкцииКод,
	Акции.descr as Акции,
	dbo._format(tmp.Приход) as Приход,
	dbo._format(tmp.Расход) as Расход,
	Биржи.code as Биржа
from (SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef			Док_вид,
		Журн.date_time_iddoc	ДатаДок,
		Журн.docno				НомерДок,
		ПриходАкций.sp52573 	НомерСделки,
		ПриходАкций.sp54733		Акции,
		ПриходАкций.sp54736		Приход,
		0 						Расход,
		ПриходАкций.sp51143		Биржа
	FROM
		_1SJourn Журн (NOLOCK INDEX=ACDATETIME)
	INNER JOIN
		dh51158 ПриходАкций
	On
		IDJOURNAL = 51238 and
		Журн.date_time_iddoc BETWEEN '20090101     0     0   ' AND '20091231ZZZZZZZZZZZZZZZ' and
		Журн.iddoc = ПриходАкций.iddoc

	UNION ALL

	SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef,
		Журн.date_time_iddoc,
		Журн.docno,
		РасходАкций.sp52581,
		РасходАкций.sp54738		,
		0,
		РасходАкций.sp54741,
		РасходАкций.sp51163
	FROM
		dh51179 РасходАкций (NOLOCK)
	INNER JOIN
		_1SJourn Журн (NOLOCK INDEX=ACDATETIME) 	On
		IDJOURNAL = 51238 and
		Журн.date_time_iddoc BETWEEN '20090101     0     0   ' AND '20091231ZZZZZZZZZZZZZZZ' and
		Журн.iddoc = РасходАкций.iddoc

	) tmp
LEFT JOIN
	sc47536 Акции
On
	tmp.Акции = Акции.id
LEFT JOIN
	sc47525 Биржи
On
	tmp.Биржа = Биржи.id
where
	(1 = 1)
order by
	tmp.date_time_iddoc
 




Источник.УстКлючПорядка("Д_Т_ИдДок ASC");
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #38 - 14. Октября 2009 :: 08:22
Печать  
Вариант 2. "Изврат для ТП"

Код
Выбрать все
select top 22
	tmp.date_time_iddoc as Д_Т_ИдДок,
	tmp.iddoc as Док,
	tmp.Док_вид as Док_вид,
	tmp.ДатаДок as ДатаДок,
	tmp.НомерДок as НомерДок,
	tmp.НомерСделки as НомерСделки,
	Акции.Code as АкцииКод,
	Акции.descr as Акции,
	dbo._format(tmp.Приход) as Приход,
	dbo._format(tmp.Расход) as Расход,
	Биржи.code as Биржа
from (SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef			Док_вид,
		Журн.date_time_iddoc	ДатаДок,
		Журн.docno				НомерДок,
		ПриходАкций.sp52573 	НомерСделки,
		ПриходАкций.sp54733		Акции,
		ПриходАкций.sp54736		Приход,
		0 						Расход,
		ПриходАкций.sp51143		Биржа
	FROM
		##temp_1sjourn Журн (NOLOCK)
	INNER JOIN
		dh51158 ПриходАкций
	On
		Журн.iddocdef = 51158 and
		Журн.iddoc = ПриходАкций.iddoc

	UNION ALL

	SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef,
		Журн.date_time_iddoc,
		Журн.docno,
		РасходАкций.sp52581,
		РасходАкций.sp54738,
		0,
		РасходАкций.sp54741,
		РасходАкций.sp51163
	FROM
		dh51179 РасходАкций (NOLOCK)
	INNER JOIN
		##temp_1sjourn Журн (NOLOCK)
	On
		Журн.iddocdef = 51179 and
		Журн.iddoc = РасходАкций.iddoc
	) tmp
LEFT JOIN
	sc47536 Акции
On
	tmp.Акции = Акции.id
LEFT JOIN
	sc47525 Биржи
On
	tmp.Биржа = Биржи.id
order
	by tmp.date_time_iddoc 



Источник.УстКлючПорядка("Д_Т_ИдДок ASC");
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #39 - 14. Октября 2009 :: 08:24
Печать  
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #40 - 14. Октября 2009 :: 08:40
Печать  
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #41 - 14. Октября 2009 :: 08:40
Печать  
chessman писал(а) 14. Октября 2009 :: 08:24:
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?

речь о #37
так вроде обсуждали
надо использовать индекс (NOLOCK INDEX=JOURNAL)
Вы же явно указываете  (NOLOCK INDEX=ACDATETIME)
поэтому sql вынужден пробегать
весь журнал документов.
в #38  Вы не указываете индекс для
##temp_1sjourn и sql сам находит индекс наилучшим способом
исходя из своей статистики.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #42 - 14. Октября 2009 :: 08:49
Печать  
Z1 писал(а) 14. Октября 2009 :: 08:40:
chessman писал(а) 14. Октября 2009 :: 08:24:
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?

речь о #37
так вроде обсуждали
надо использовать индекс (NOLOCK INDEX=JOURNAL)
Вы же явно указываете  (NOLOCK INDEX=ACDATETIME)
поэтому sql вынужден пробегать
весь журнал документов.
в #38  Вы не указываете индекс для
##temp_1sjourn и sql сам находит индекс наилучшим способом
исходя из своей статистики.


Пробовал и тот и этот, результат не менялся.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #43 - 14. Октября 2009 :: 08:52
Печать  
JohnyDeath писал(а) 14. Октября 2009 :: 08:40:
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.


Так речь вроде шла про то, что у меня КП был "неправильный", в зависимости от колонки сортировки. Ну, вот я взял самый простой - по дате.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #44 - 14. Октября 2009 :: 09:02
Печать  
chessman писал(а) 14. Октября 2009 :: 08:52:
JohnyDeath писал(а) 14. Октября 2009 :: 08:40:
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.


Так речь вроде шла про то, что у меня КП был "неправильный", в зависимости от колонки сортировки. Ну, вот я взял самый простой - по дате.

я в Тп и Кп плохо разбираюсь больше в самом sql.
ответ написан чисто по тому что написано в  #37
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #45 - 14. Октября 2009 :: 09:15
Печать  
Я задам тогда вопрос по  другому, у кого-нибудь журнал на ТП тормозит на больших интервалах?

Или это я тормоз?  Очень довольный
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #46 - 14. Октября 2009 :: 10:31
Печать  
У тебя просто запрос совсем на для ТП.
Я так понимаю, что тебе нужны только документы РасходАкций и ПриходАкций. И если тебе не подходит всё, что советовали до этого, то можно попробовать примерно так:
Код
Выбрать все
SELECT
...

,ISNULL(РасходАкций.IDDOC, $ПриходАкций.Сумма) Приход
,ISNULL(ПриходАкций.IDDOC, $РасходАкций.Сумма) Расход

FROM _1SJourn Журн

LEFT JOIN $Документ.РасходАкций РасходАкций ON РасходАкций.IDDOC = Журн.IDDOC
LEFT JOIN $Документ.ПриходАкций ПриходАкций ON ПриходАкций.IDDOC = Журн.IDDOC

WHERE
 Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата
 AND (Журн.Iddocdef = $ВидДокумента.РасходАкций OR Журн.Iddocdef = $ВидДокумента.ПриходАкций) 

  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #47 - 14. Октября 2009 :: 12:24
Печать  
Так едет живее, без тормозов.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #48 - 14. Октября 2009 :: 14:09
Печать  
chessman писал(а) 14. Октября 2009 :: 12:24:
Так едет живее, без тормозов.

Добавить туда (#46) еще условие на конкретный журнал документов
а по какому индексу пусть sql сам выберет.
Ьыстрее потому что по журналу документов идем один раз
и нет в конце запроса сортировки.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #49 - 14. Октября 2009 :: 14:18
Печать  
Z1 писал(а) 14. Октября 2009 :: 14:09:
chessman писал(а) 14. Октября 2009 :: 12:24:
Так едет живее, без тормозов.

Добавить туда (#46) еще условие на конкретный журнал документов
а по какому индексу пусть sql сам выберет.
Ьыстрее потому что по журналу документов идем один раз
и нет в конце запроса сортировки.


Ну я так и сделал.

Из всего вышесказанного, получается, что ни каждый запрос хорош для ТП.

Буду еще глядеть-сравнивать-мучить, "корявую технологию" предложенную выше.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #50 - 14. Октября 2009 :: 14:24
Печать  
ТП (точнее поставщик для ТП) просто делает "обрезание" выборки, и, ес-но, если у тебя в запросе есть подзапросы, то их он никак обрезать не сможет и будут выбираться все данные подзапроса, а у тебя там два прохода по общему журналу.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #51 - 14. Октября 2009 :: 14:27
Печать  
Все понял, спасибо.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #52 - 06. Сентября 2010 :: 13:42
Печать  
Возникло желание разобраться с ТП, и тем, имеет ли смысл его использовать. И первый вопрос, который возник, достаточно ли для этого компоненты 1СРР или надо еще подгружать formex и пр.?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #53 - 06. Сентября 2010 :: 16:52
Печать  
Neo писал(а) 06. Сентября 2010 :: 13:42:
Возникло желание разобраться с ТП, и тем, имеет ли смысл его использовать. И первый вопрос, который возник, достаточно ли для этого компоненты 1СРР или надо еще подгружать formex и пр.?

для использования ТП formex не обязателен
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #54 - 08. Сентября 2010 :: 13:34
Печать  
Цитата:
для использования ТП formex не обязателен


- хм, а примерчики есть где-нибудь, как это реализуется только с помощью возможностей 1срр? Вот нашел пример (без использования классов), но там уже затыкается на:

      оФорма = СоздатьОбъект("РасширениеФормы");
     оТП = оФорма.ПолучитьАтрибут("кнТаблица_").СоздатьЭлементУправления("ТабличноеПоле");

т.к. видимо, объект расширениеФормы только в формекс есть. Хотелось бы для начала попробовать сделать без классов (или хотя бы при минимальном использовании классов) и без формекс, а там дальше уже посмотрим. Это в принципе возможно или нет?
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #55 - 08. Сентября 2010 :: 13:38
Печать  
Какой необходим минимальный функционал (компоненты, классы) для того, чтобы реализовать простейший пример работы с табличным полем?
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #56 - 08. Сентября 2010 :: 13:52
Печать  
Neo писал(а) 08. Сентября 2010 :: 13:38:
Какой необходим минимальный функционал (компоненты, классы) для того, чтобы реализовать простейший пример работы с табличным полем?

По ТП масса примеров на форуме. FormEx для ТП действительно не обязателен.
Пример кода создания ТП
Простейшая обработка-пример
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #57 - 08. Сентября 2010 :: 13:57
Печать  
А инициализацию табличного поля в какой процедуре нужно проводить? В примерах везде используется ПослеОткрытия, но будет ли она отрабатывать без формекс?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Вопрос по ТП
Ответ #58 - 08. Сентября 2010 :: 14:14
Печать  
Neo писал(а) 08. Сентября 2010 :: 13:57:
А инициализацию табличного поля в какой процедуре нужно проводить? В примерах везде используется ПослеОткрытия, но будет ли она отрабатывать без формекс?

Нет не будет. Ни ПослеОткрытия ни ПослеСозданияФормы
  
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #59 - 08. Сентября 2010 :: 14:18
Печать  
Ну и как тогда быть?  Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #60 - 08. Сентября 2010 :: 14:44
Печать  
Neo писал(а) 08. Сентября 2010 :: 14:18:
Ну и как тогда быть?  Улыбка

например сделай через ОбработкаОжидания
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #61 - 08. Сентября 2010 :: 15:04
Печать  
читайте про ФормаПриСоздании
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #62 - 08. Сентября 2010 :: 15:22
Печать  
Все можно сделать, используя только 1С++ (правда привязок ты не поимеешь). Читать здесь
Примерно так должно получиться:
Код
Выбрать все
Процедура ПриОткрытии()
  _Форма = СоздатьОбъект("Форма");
  _Форма.УстановитьФорму(Форма);
КонецПроцедуры

Процедура ФормаПриСоздании(_Ф)
  ОбъектТП = _Ф.СоздатьЭлементУправления("ТабличноеПоле", ИдентификаторЭлементаДиалога)
КонецПроцедуры 


  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #63 - 09. Сентября 2010 :: 13:52
Печать  
Всем спасибо, получилось))

Прикрутил в рабочей базе простенький пример, вот только почему-то стандартная форма списка работает чуть побыстрее, тем на ТП. Пробовал на справочнике контрагенты, примерно 40000 элементов.

Код такой:

=========================================

 ОбъектТП = _Ф.СоздатьЭлементУправления("ТабличноеПоле", "кнТаблица_");
 
 Колонка = ОбъектТП.Колонки.Добавить("Код");
 Колонка.Заголовок = "Код";
 Колонка.Данные = "Код";
 
 Колонка = ОбъектТП.Колонки.Добавить("Наименование");
 Колонка.Заголовок = "Наименование";
 Колонка.Данные = "Наименование";
 
     оПоставщикДанных=СоздатьОбъект("ПоставщикДанныхODBC.MSSQL");
     оПоставщикДанных.БазаДанных=СоздатьОбъект("ODBCDataBase");
оПоставщикДанных.БазаДанных.Присоеденить1С();
Если оПоставщикДанных.БазаДанных.ЕстьСоединение()=0 Тогда
Предупреждение("Нет ODBC соединения!");
Возврат;
КонецЕсли;

     ТекстЗапроса = "
     |SELECT
     |спр.code as Код,
     |спр.descr as [Наименование]
     |FROM $Справочник.Контрагенты as спр (nolock)
     |";

     оПоставщикДанных.УстТекстЗапроса(ТекстЗапроса);
     оПоставщикДанных.УстКлючПорядка("Наименование");
     
     ОбъектТП.ПоставщикДанных=оПоставщикДанных;
     ОбъектТП.ОбновитьСтроки();
     
     // быстрый поиск
     ОбъектТП.ПоставщикДанных.Поля.Получить("Наименование").ТипБыстрогоПоиска = 1;
     
     ОбъектТП.АвтоШирина();
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #64 - 09. Сентября 2010 :: 14:04
Печать  
закоментарь строки
т.е вот так ( а то у тебя создается лишний конект )

     //оПоставщикДанных.БазаДанных.Присоеденить1С();
     //Если оПоставщикДанных.БазаДанных.ЕстьСоединение()=0 Тогда
     //      Предупреждение("Нет ODBC соединения!");
     //      Возврат;
     //КонецЕсли;

  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #65 - 09. Сентября 2010 :: 14:10
Печать  
Так же...

На ТП перед быстрым поиском идет задержка на пару секунд. А в стандартой форме все моментально ищется
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #66 - 09. Сентября 2010 :: 14:13
Печать  
Причем задержка есть даже на справочнике в 5 элементов  Улыбка Не принципильно конечно, т.к. задержка маленькая (1-2 с), но стандартная форма отрабатывает моментально. Может, эта такая особенность работы ТП?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #67 - 09. Сентября 2010 :: 14:57
Печать  
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #68 - 10. Сентября 2010 :: 10:29
Печать  
А если специально не обновлять данные, то при работе с ТП не происходит обращений к базе, а данные берутся из какого-то временного объекта?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #69 - 10. Сентября 2010 :: 10:45
Печать  
Может сначала документацию почитаешь, а? Подмигивание
Конкретно по этому вопросу: http://www.1cpp.ru/docum/icpp/html/TableField.html#refreshtimeout
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #70 - 10. Сентября 2010 :: 10:59
Печать  
Ну, там же не указано, что стоит по умолчанию. О том, что есть возможность обновлять, я в курсе. Просто было интересно, каким образом берутся данные при настройках по умолчанию... а потом уже пробовать играть настройками
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #71 - 10. Сентября 2010 :: 14:04
Печать  
Игры с таймаутом действительно помогли. Чем меньше ТаймаутБыстрогоПоиска, тем быстрее ищет  Улыбка
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #72 - 10. Сентября 2010 :: 14:08
Печать  
А почему в доке не указаны значения по умолчанию? Например, ТаймаутБыстрогоПоиска видимо был по умолчанию порядка 1000 или даже больше...

И чем руководствоваться при установке параметров? Например, если поставить минимальный таймаут =1, то при этом будет большая нагрузка на ресурсы компа или нет?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #73 - 10. Сентября 2010 :: 16:42
Печать  
Neo писал(а) 10. Сентября 2010 :: 14:08:
А почему в доке не указаны значения по умолчанию? Например, ТаймаутБыстрогоПоиска видимо был по умолчанию порядка 1000 или даже больше...

Опять-таки выдержки из документации:
Цитата:
ТаймаутБыстрогоПоиска / QuickSearchTimeout

Доступ: чтение и запись.

Что мешает посмотреть значение этого атрибута до установки?
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #74 - 13. Сентября 2010 :: 08:16
Печать  
Цитата:
Что мешает посмотреть значение этого атрибута до установки?


Да ничто собственно не мешает. Просто не очень удобно. Представляешь, если бы по каждому методу в каком-нибудь языке программирования приходилось бы вначале самому выяснять методом научного тыка, какое там значение по умолчанию. И при изучении так намного понятней, если заранее знаешь, каково поведение объекта по умолчанию.  
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #75 - 13. Сентября 2010 :: 13:48
Печать  
А по какому принципу происходит получение данных в ТП (через поставщика данных)?

Имею в виду вот что. Допустим, в запросе по справочнику я решил присоединить еще остатки по позициям. При открытии формы с ТП происходит получение сразу остатки по всем элементам справочника или только по тем, которые в данный момент отображаются? Если первое, то не будет ли это в итоге более накладным, чем вывод остатков в колонку через функцию в стандартной форме списка?

Может, где-то уже это обсуждалось или в доке есть? (пока еще все не успел прочитать  Улыбка)
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #76 - 14. Сентября 2010 :: 04:31
Печать  
Neo писал(а) 13. Сентября 2010 :: 13:48:
А по какому принципу происходит получение данных в ТП (через поставщика данных)?

Имею в виду вот что. Допустим, в запросе по справочнику я решил присоединить еще остатки по позициям. При открытии формы с ТП происходит получение сразу остатки по всем элементам справочника или только по тем, которые в данный момент отображаются? Если первое, то не будет ли это в итоге более накладным, чем вывод остатков в колонку через функцию в стандартной форме списка?

Может, где-то уже это обсуждалось или в доке есть? (пока еще все не успел прочитать  Улыбка)

Работает так:
Берется твой запрос, по нему находится ИД-шник объекта, по ИД-шнику объекта (УстановитьИД) находим значение Ключа порядка, на котором находимся в данный момент. Потом выбираем первые ХХХ записей до и ХХХ записей после (используя ключ порядка). Собственно в этом и ответ на твой вопрос - насколько оптимальный запрос для Поставщика ТП ты напишешь - так и будет работать.
  
Наверх
ICQ  
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #77 - 15. Сентября 2010 :: 13:01
Печать  
А почему, когда ставишь таймаут обновления, 1-ка вылетает через этот таймаут? Точнее, если движения по ТП не происходили, то на первом таймауте в ТП остается только верхняя строчка, а на втором 1С вылетает с ошибкой "Подключение занято до получения результатов другого shtmt". Если была прокрутка, то сразу вылетает при первом же таймауте...
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #78 - 15. Сентября 2010 :: 13:03
Печать  
скорее всего возможно ключ порядка не обеспечивает уникальность
  

1&&2&&3
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Вопрос по ТП
Ответ #79 - 15. Сентября 2010 :: 13:10
Печать  
Точно, так и есть))
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать