Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Можно ли ускорить процесс выборки (число прочтений - 13824 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Можно ли ускорить процесс выборки
04. Сентября 2011 :: 10:09
Печать  
Перевели базу на SQL, работать работает, но есть проблема в подборе очень сильно тормозит. Проанализировав по замерам производительности обнаружил две процедуры которые портят все дело:
глВернутьЦену()
глПолчитьОстатокНоменклатуры()

переработав данные процедуры на прямые запросы, я выяснил что процдура получения остатко на прямых запросах работает в 8 раз медленнее (и то на втором  далее тесте. на первом тормоза аж в 16 раз)

Вот какие запросы я наваял
Код
Выбрать все
//Сформируем переменные строки для текстов запроса
	СтрокаСкладУсловие = "";
	СтрокаСкладИзмерение = "";
	СтрокаФирмаУсловие = "";
	СтрокаДоговорУсловие = "";
	СтрокаДоговорИзмерение = "";
	СтрокаЗаявкаУсловие = "";
	СтрокаЗаявкаИзмерение = "";
	Если ПустоеЗначение(Склад) = 0 Тогда
		СтрокаСкладУсловие 		= " AND Склад = :ВыбСклад";
		СтрокаСкладИзмерение 	= ",Склад";
	КонецЕсли;
	Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
		СтрокаФирмаУсловие = "Фирма = :ВыбФирма";
	ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
		СтрокаФирмаУсловие = "Фирма IN (Select VAL FROM #СписокФирм)";
	КонецЕсли;
	Если ПустоеЗначение(Договор) = 0 Тогда
		СтрокаДоговорУсловие   = " AND ДоговорПокупателя = :ВыбДоговор";
		СтрокаДоговорИзмерение = ",ДоговорПокупателя";
	КонецЕсли;
	Если ПустоеЗначение(Заявка) = 0 Тогда
		СтрокаЗаявкаУсловие 		= " AND ЗаявкаПокупателя = :ВыбЗаявка";
		СтрокаЗаявкаИзмерение 	= ",ЗаявкаПокупателя";
	КонецЕсли;
//Сформируем тексты запросов
	------------------
	ТекстЗапросаОстаткиНаСкладе = "
	|SELECT
	|	SUM(РегОстатки.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение +"),Количество) as РегОстатки
	|";
	------------------
	ТекстЗапросаОстаткиНаФирме = "
	|SELECT
	|	SUM(РегОстатки.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл,
	|	(Фирма, Номенклатура), Количество) as РегОстатки
	|";
	------------------
	ТекстЗапросаРезервыНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение +"),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл,
	|	(Фирма,Номенклатура),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоДоговоруНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаСкладУсловие + СтрокаДоговорУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение + СтрокаДоговорИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоЗаявкеНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаСкладУсловие + СтрокаЗаявкаУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение + СтрокаЗаявкаИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоДоговоруНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаДоговорУсловие + ",
	|	(Фирма,Номенклатура" + СтрокаДоговорИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоЗаявкеНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаЗаявкаУсловие +",
	|	(Фирма,Номенклатура" + СтрокаЗаявкаИзмерение + "),Количество) as РегРезервы
	|";
	------------------
 



Вопрос как ускорить все это хозяйство!

при 46 повторениях процедура выполняется 1,5 секунды
хотелось бы где то почитать вообще про методы оптимизации подобных вещей.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #1 - 04. Сентября 2011 :: 11:24
Печать  
В списке измерений оставь только номенклатуру, убери sum, установи отбор движений и итогов по номенклатуре и включи rpcmode.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #2 - 04. Сентября 2011 :: 15:23
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 11:24:
В списке измерений оставь только номенклатуру, убери sum, установи отбор движений и итогов по номенклатуре и включи rpcmode.


Все сделал штатная процедура работает в 2 раза быстрей
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #3 - 04. Сентября 2011 :: 16:08
Печать  
Значит, она отличается не только способом получения итогов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #4 - 04. Сентября 2011 :: 16:20
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 16:08:
Значит, она отличается не только способом получения итогов.


Это все что есть в стандартной процедуре ... естественно что в нее передаются уже рассчитанные регистры. Возможно что то подобное на прямых запросах, что бы не рассчитывать их каждый раз?

ОстатокНаСкладе = 
                       ОстатокПоФирме  = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество");
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #5 - 04. Сентября 2011 :: 16:35
Печать  
Можно выгрузить расчитанные итоги во временную таблицу или таблицу значений - по обстановке.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #6 - 05. Сентября 2011 :: 02:46
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #7 - 05. Сентября 2011 :: 05:45
Печать  
mozer писал(а) 05. Сентября 2011 :: 02:46:
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.


SELECT A, B, C INTO #tmp_remains FROM $РегистрОстатки(и т.д.)
  
Наверх
ICQ  
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #8 - 05. Сентября 2011 :: 05:51
Печать  
Salimbek писал(а) 05. Сентября 2011 :: 05:45:
mozer писал(а) 05. Сентября 2011 :: 02:46:
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.


SELECT A, B, C INTO #tmp_remains FROM $РегистрОстатки(и т.д.)

Спасибо буду копать!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #9 - 06. Сентября 2011 :: 04:35
Печать  
можно ли это хозяйство объединить в один запрос:
Код
Выбрать все
	НаборЗаписей = СоздатьОбъект("ODBCRecordset");
	НаборЗаписей.РежимRPC(1);
	//Сформируем переменные строки для текстов запроса
	СтрокаСкладУсловиеОстаток = "";
	СтрокаСкладУсловиеРезерв = "";
	СтрокаФирмаУсловиеОстаток = "";
	СтрокаФирмаУсловиеРезерв = "";
	Если ПустоеЗначение(Склад) = 0 Тогда
		СтрокаСкладУсловиеОстаток = " AND $РегОстатки.Склад = :ВыбСклад";
		СтрокаСкладУсловиеРезерв = " AND $РегРезервы.Склад = :ВыбСклад";
	КонецЕсли;
	Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
		СтрокаФирмаУсловиеОстаток = " AND $РегОстатки.Фирма = :ВыбФирма";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма = :ВыбФирма";
	ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
		СтрокаФирмаУсловиеОстаток = "AND $РегОстатки.Фирма IN (Select VAL FROM #СписокФирм)";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма IN (Select VAL FROM #СписокФирм)";
	КонецЕсли;
	//Сформируем тексты запросов
	------------------
	ТекстЗапросаОстаткиНаСкладе = "
	|SELECT
	|	SUM($РегОстатки.Количество) as Количество
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|";
	------------------
	ТекстЗапросаОстаткиНаФирме = "
	|SELECT
	|	SUM($РегОстатки.Количество) as Количество
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|";
	------------------
	ТекстЗапросаРезервыНаСкладе = "
	|SELECT
	|	SUM($РегРезервы.Количество) as Количество
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеРезерв + "
	|";
	------------------
	ТекстЗапросаРезервыНаФирме = "
	|SELECT
	|	SUM($РегРезервы.Количество) as Количество
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл
	|"; 

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #10 - 06. Сентября 2011 :: 05:14
Печать  
Код
Выбрать все
select
	sum(ОстНаСкладе) ОстНаСкладе,
	sum(ОстНаФирме) ОстНаФирме,
	sum(РезервНаСкладе) РезервНаСкладе,
	sum(РезервНаФирме) РезервНаФирме
From
(
SELECT
	$РегОстатки.Количество ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
WHERE
...

Union All

SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	$РегРезервы.Количество РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.РезервыТМЦ as РегРезервы
WHERE
...

Union all
...
) 



Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #11 - 06. Сентября 2011 :: 05:45
Печать  
Satans Claws писал(а) 06. Сентября 2011 :: 05:14:
Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.

Спасибо попробую, о такой реализации что то я не догадался, попробовал с под запросами такая фигня получилась.

Реиндексацию делал + статистику обновлял. не помогает!

При вызове процедуры получения остатков (48 вызовов) время затраченое на выполнение 0,3 секунды + получение цены 0.09 итого 0,4 это много пользователи жалуются на тормоза в подпоре номенклатуры. Вот и выискиваю разные способы. попробывать использовать один запрос в место 4.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #12 - 06. Сентября 2011 :: 05:57
Печать  
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #13 - 06. Сентября 2011 :: 05:59
Печать  
mozer писал(а) 06. Сентября 2011 :: 05:45:
(48 вызовов)

Фигасе..  Ужас Получай 48 итогов одним запросом в таблицу значений.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #14 - 06. Сентября 2011 :: 06:14
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 05:59:
Фигасе..  Ужас Получай 48 итогов одним запросом в таблицу значений.


не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #15 - 06. Сентября 2011 :: 06:21
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:14:
berezdetsky писал(а) 06. Сентября 2011 :: 05:59:
Фигасе..  Ужас Получай 48 итогов одним запросом в таблицу значений.


не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Так и есть!
Цитата:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?

почему предлагать! Только, я в этом только разбираться начал еще не все в курил. если можно поподробней или ссылку дать.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #16 - 06. Сентября 2011 :: 06:37
Печать  
Eprst писал(а) 06. Сентября 2011 :: 05:57:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.


Я здесь задавал этот вопрос
http://www.1cpp.ru/forum/YaBB.pl?num=1314950844

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #17 - 06. Сентября 2011 :: 06:43
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #18 - 06. Сентября 2011 :: 06:47
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка

КАК ? ОБЪЯСНИ !

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #19 - 06. Сентября 2011 :: 06:48
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Ну я же смог.  Улыбка

А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).

Не штатно, есть вроде у ромикса перехват, где он подсовывает свой запрос к скулю.


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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #20 - 06. Сентября 2011 :: 06:49
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:48:
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Ну я же смог.  Улыбка

А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).



Хотелось бы увидеть примерчик. И насколько быстрей работает
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #21 - 06. Сентября 2011 :: 07:34
Печать  
Eprst писал(а) 06. Сентября 2011 :: 05:57:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.

Я так понял, что в поставщике данных реализован только интерфейс.
Реализация на C++ делается пользователем или я что то не допонял?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #22 - 06. Сентября 2011 :: 07:56
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка


Вариант 1)
Выводя текущую строку проверяем вхождение текущего элемента справочника в подготовленный список.
Если он в список не входит - выбираем запросом список элементов как текущий элемент + "экран" вверх + "экран" вниз (где "экран" - это количество элементов влезающих в форму; или просто взять с запасом). По этому списку сразу собираем и остатки.

Вариант 2) - но не уверен, что этот путь к чему-нить приведет:
При выводе строки ставим флаг, добавляем элемент в СЗ + активизируем обработку ожидания/внешнее событие. После вывода всех строк вызванное событием/обработчиком ожидания процедура по подготовленному списку собирает остатки + вызывает перевывод строк (скорее всего, Форма.Обновить(0)). При повторном выводе строк выводим остатки из подготовленных запросом данных.


tl;dr:
1) ведем себя как Табличное поле с поставщиком-запросом - подготавливаем данные на 2 экрана.
2) в первой отрисовке строк собираем список элементов, по нему собираем остатки, активизируем вторую отрисовку строк, где уже выводим остатки из собранных данных.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #23 - 06. Сентября 2011 :: 08:01
Печать  
mozer писал(а) 06. Сентября 2011 :: 07:34:
Я так понял, что в поставщике данных реализован только интерфейс.
Реализация на C++ делается пользователем или я что то не допонял?


Ну почему же - есть несколько готовых поставщиков данных
http://www.1cpp.ru/docum/icpp/html/TableField.html#id108
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #24 - 06. Сентября 2011 :: 08:04
Печать  
mozer писал(а) 06. Сентября 2011 :: 06:49:
Хотелось бы увидеть примерчик. И насколько быстрей работает


Тут просто вывод в СЗ то, что на экранчике в данный момент отображено в форме списка справочника.
  

_______003.rar ( 579 KB | Загрузки )
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #25 - 06. Сентября 2011 :: 08:51
Печать  
Спасибо всем пошел "Курить". буду пробовать.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #26 - 06. Сентября 2011 :: 09:02
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:48:
А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).

Ну.. Это было давно и неправда.  Улыбка
Там при входе в группу кешировались остатки по всей группе. Сейчас бы делал через API курсоров, получая за раз по N записей (есть там такая полудокументированная фишка). Извратом с текстовой колонкой, ага.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #27 - 08. Сентября 2011 :: 07:47
Печать  
Satans Claws писал(а) 06. Сентября 2011 :: 05:14:
Код
Выбрать все
select
	sum(ОстНаСкладе) ОстНаСкладе,
	sum(ОстНаФирме) ОстНаФирме,
	sum(РезервНаСкладе) РезервНаСкладе,
	sum(РезервНаФирме) РезервНаФирме
From
(
SELECT
	$РегОстатки.Количество ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
WHERE
...

Union All

SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	$РегРезервы.Количество РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.РезервыТМЦ as РегРезервы
WHERE
...

Union all
...
) 



Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.


вот переделал вот в это не работает

Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	SUM(ОстНаСкладе) ОстНаСкладе,
	|	SUM(ОстНаФирме) ОстНаФирме,
	|	SUM(РезервНаСкладе) РезервНаСкладе,
	|	SUM(РезервНаФирме) РезервНаФирме,
	|	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	|	(ОстНаФирме - РезервНаФирме) ОстатокФирма
	|FROM
	|(SELECT
	|	$РегОстатки.Количество ОстНаСкладе,
	|	0 ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	$РегОстатки.Количество ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	0 ОстНаФирме,
	|	$РегРезервы.Количество РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаФирмаУсловиеРезерв + "
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	0 ОстНаФирме,
	|	$РегРезервы.Количество РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл)
	|";
 



Ошибка синтаксиса, но не могу понять где.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #28 - 08. Сентября 2011 :: 07:53
Печать  
РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстато

вот тут and пропущен..
Ну и далее везде по тексту.
Если конечно, в СтрокаФирмаУсловиеОстато его тоже нет.
А так, алиясы везде выкини:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	SUM(ОстНаСкладе) ОстНаСкладе,
	|	SUM(ОстНаФирме) ОстНаФирме,
	|	SUM(РезервНаСкладе) РезервНаСкладе,
	|	SUM(РезервНаФирме) РезервНаФирме,
	|	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	|	(ОстНаФирме - РезервНаФирме) ОстатокФирма
	|FROM
	|(SELECT
	|	$РегОстатки.Количество ОстНаСкладе,
	|	0 ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|UNION ALL
	|SELECT
	|	0,
	|	$РегОстатки.Количество,
	|	0,
	|	0
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|UNION ALL
	|SELECT
	|	0,
	|	0,
	|	$РегРезервы.Количество,
	|	0
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаФирмаУсловиеРезерв + "
	|UNION ALL
	|SELECT
	|	0,
	|	0,
	|	$РегРезервы.Количество,
	|	0
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл)
	|";
 

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #29 - 08. Сентября 2011 :: 07:56
Печать  
Eprst писал(а) 08. Сентября 2011 :: 07:53:
РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстато

вот тут and пропущен..
Ну и далее везде по тексту.

не пропушел говорит ошибка около )
или на английском
State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ')'

по поводу AND Это забыл показать
Код
Выбрать все
НаборЗаписей = СоздатьОбъект("ODBCRecordset");
	НаборЗаписей.РежимRPC(1);
	//Сформируем переменные строки для текстов запроса
	СтрокаСкладУсловиеОстаток = "";
	СтрокаСкладУсловиеРезерв = "";
	СтрокаФирмаУсловиеОстаток = "";
	СтрокаФирмаУсловиеРезерв = "";
	Если ПустоеЗначение(Склад) = 0 Тогда
		СтрокаСкладУсловиеОстаток = " AND $РегОстатки.Склад = :ВыбСклад";
		СтрокаСкладУсловиеРезерв = " AND $РегРезервы.Склад = :ВыбСклад";
	КонецЕсли;
	Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
		СтрокаФирмаУсловиеОстаток = " AND $РегОстатки.Фирма = :ВыбФирма";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма = :ВыбФирма";
	ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
		СтрокаФирмаУсловиеОстаток = "AND $РегОстатки.Фирма IN (Select VAL FROM #СписокФирм)";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма IN (Select VAL FROM #СписокФирм)";
	КонецЕсли;
 

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



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #30 - 08. Сентября 2011 :: 07:57
Печать  
на первый взгляд может быть здесь
Код
Выбрать все
...:ВыбДата~~" + СтрокаФи... 

(может нет пробела при подстановке условия). А вообще, не видя что в СтрокаФирмаУсловиеОстаток сложно сказать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #31 - 08. Сентября 2011 :: 07:58
Печать  
"AND

тут пробела нет в строке условий
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #32 - 08. Сентября 2011 :: 08:00
Печать  
Eprst писал(а) 08. Сентября 2011 :: 07:58:
"AND

тут пробела нет в строке условий

поправил ошибка осталась
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #33 - 08. Сентября 2011 :: 08:01
Печать  
|      (ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
     |      (ОстНаФирме - РезервНаФирме) ОстатокФирма

А это что за фигня ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #34 - 08. Сентября 2011 :: 08:06
Печать  
И это, выложи лучше, что показывает Запрос.Отладка(1)
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #35 - 08. Сентября 2011 :: 08:09
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:01:
|      (ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
     |      (ОстНаФирме - РезервНаФирме) ОстатокФирма

А это что за фигня ?


вообще подсмотрел в документации на скуль 2005 вычисляемые поля
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #36 - 08. Сентября 2011 :: 08:11
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:06:
И это, выложи лучше, что показывает Запрос.Отладка(1)


Код
Выбрать все
{call sp_executesql(N'
SELECT
	SUM(ОстНаСкладе) ОстНаСкладе,
	SUM(ОстНаФирме) ОстНаФирме,
	SUM(РезервНаСкладе) РезервНаСкладе,
	SUM(РезервНаФирме) РезервНаФирме,
	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	(ОстНаФирме - РезервНаФирме) ОстатокФирма
FROM
(SELECT
	РегОстатки.sp411 ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0  AND РегОстатки.sp418 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	РегОстатки.sp411 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0  AND РегРезервы.sp4476 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0)
', N'@ВыбДата2 datetime,@ВыбФирма0 char(9),@ВыбНоменкл0 char(9),@ВыбСклад0 char(9)'
,{d '2011-09-01'},'     2   ','   BEL   ','     1   ')}
 


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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #37 - 08. Сентября 2011 :: 08:21
Печать  
Суммы забыл добавить двум последним полям, в которых разность
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #38 - 08. Сентября 2011 :: 08:24
Печать  
Сделай алияс на подзапрос, воткни в селект листе всё в сумму,
выкини 2 юниона, заместо них, тупо в case  условие на склад.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #39 - 08. Сентября 2011 :: 08:26
Печать  
Dmitry The Wing писал(а) 08. Сентября 2011 :: 08:21:
Суммы забыл добавить двум последним полям, в которых разность

Вроде как не нужны там SUM ...
попробовал нет не работает
и вычисляемые поля  тоже отключал таже беда
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #40 - 08. Сентября 2011 :: 08:32
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:24:
Сделай алияс на подзапрос, воткни в селект листе всё в сумму,
выкини 2 юниона, заместо них, тупо в case  условие на склад.

воткнул алиас на подзапрос и вот что вышло, точно дело в нем было
Код
Выбрать все
{Глобальный модуль(144)}: State 42000, native 8120, message [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Выборка.ОстНаСкладе' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
{call sp_executesql(N'
SELECT
	SUM(Выборка.ОстНаСкладе) ОстНаСкладе,
	SUM(Выборка.ОстНаФирме) ОстНаФирме,
	SUM(Выборка.РезервНаСкладе) РезервНаСкладе,
	SUM(Выборка.РезервНаФирме) РезервНаФирме,
	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	(ОстНаФирме - РезервНаФирме) ОстатокФирма
FROM
(SELECT
	РегОстатки.sp411 ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0  AND РегОстатки.sp418 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	РегОстатки.sp411 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0  AND РегРезервы.sp4476 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0) as Выборка
', N'@ВыбДата2 datetime,@ВыбФирма0 char(9),@ВыбНоменкл0 char(9),@ВыбСклад0 char(9)'
,{d '2011-09-01'},'     2   ','   BEL   ','     1   ')}
СтруктураОстатков = НаборЗаписей.ВыполнитьСкалярный(ТекстЗапроса);
{Глобальный модуль(144)}: State 42000, native 8120, message [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Выборка.ОстНаСкладе' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
 


Я так понимаю ему группировку подавай
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #41 - 08. Сентября 2011 :: 08:35
Печать  
Сумму сделай на разность в селекте!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #42 - 08. Сентября 2011 :: 08:41
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:35:
Сумму сделай на разность в селекте!

Ага догадался все робит щас тест скорости сделаю )))
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #43 - 08. Сентября 2011 :: 08:47
Печать  
и выкини 2 лишних юниона.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #44 - 08. Сентября 2011 :: 08:48
Печать  
Satans Claws писал(а) 06. Сентября 2011 :: 05:14:
Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.

Бестрей !!
Если раньше около 0.295 - 0.312 то сейчас 0.15 - 0.16

Только по прошествии времени получение цены работает все медленнее чем дальше от начала месяца тем хуже или это от чего то другого зависит
Код
Выбрать все
Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены = 0, ЦенаЦены = 0, ЕдЦены = 0, ВалЦены = 0, НаценкаЦены = 0, НайденнаяЦена = 0) Экспорт
	Перем ЦеныНоменклатуры;
	Перем Рассчетная;
	Перем НужныйТипЦен;
	Перем ЕстьУдаленные;


	Рез = 1;
	НайденнаяЦена = ПолучитьПустоеЗначение("Справочник.Цены");

	Если ПустоеЗначение(ДатаЦены) = 1 Тогда
		ДатаЦены = РабочаяДата();
	КонецЕсли;

	// Найдет или нужную цену в справочнике
	// если она рассчитывается, то найдем базовую цену
	Рассчетная		= ТипЦены.Рассчитывается;
	НужныйТипЦен	= ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);

	НаборЗаписей = СоздатьОбъект("ODBCRecordset");
	НаборЗаписей.РежимRPC(1);
	ТекстЗапросаЦены = "
	|SELECT
	|  СпрН.Descr Наименование,
	|  СпрЦ.ID [Ссылка $Справочник.Цены],
	|  $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена,
	|  $ПоследнееЗначение.Цены.Единица(СпрЦ.ID, :ВыбДата) [Единица $Справочник.Единицы],
	|  $СпрЦ.Валюта [Валюта $Справочник.Валюты],
	|  $СпрЦ.Процент Процент,
	|  СпрЦ.IsMark Пометка
	|FROM
	|  $Справочник.Номенклатура СпрН
	|LEFT JOIN
	|  $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
	|				   $СпрЦ.ТипЦен = :ТипЦен
	|WHERE
	|  СпрН.ID = :ВыбНом
	|";


	НаборЗаписей.УстановитьТекстовыйПараметр("ВыбДата",ДатаЦены);
	НаборЗаписей.УстановитьТекстовыйПараметр("ТипЦен",НужныйТипЦен);
	НаборЗаписей.УстановитьТекстовыйПараметр("ВыбНом",Номенклатура);
	Структура = НаборЗаписей.ВыполнитьСкалярный(ТекстЗапросаЦены);

	Если Структура.Пометка = 1 Тогда
		Рез = - 1;
	КонецЕсли;

	НайденнаяЦена = Структура.Ссылка.ТекущийЭлемент();
	Если ПустоеЗначение(НайденнаяЦена) = 1 Тогда

		// Нет такой цены
		Возврат 0;
	КонецЕсли;

	// Заполним все ценовые характериситики

	// если не задана единица цены на эту дату, то потом придется обрабатывать случай нулевого коэффициента у  пустой единицы
	ЕдЦены		= Структура.Единица;

	Если ПустоеЗначение(Рассчетная) = 1 Тогда

		//Если цена не рассчитывается
		ЦенаЦены	= Структура.Цена;

		// элемент справочника существует Валюту и Наценку возьмем из него
		ВалЦены		= Структура.Валюта;
		НаценкаЦены	= Структура.Процент;
	Иначе

		//Если цена рассчитывается
		БазоваяЦена 	= Структура.Цена;
		БазоваяВалюта	= Структура.Валюта;

		// Цены у базового типа могут отличаться
		ЦенаЦены    = глПересчет(БазоваяЦена, БазоваяВалюта, ДатаЦены, ТипЦены.Валюта, ДатаЦены);
		ЦенаЦены    = глОкруглить(ЦенаЦены * (100 + ТипЦены.Процент) / 100, ТипЦены.ПорядокОкругления);

		// элемент справочника Цены не существует (расчетный). Валюту и Наценку возьмем из типа цены
		ВалЦены		= ТипЦены.Валюта;
		НаценкаЦены	= ТипЦены.Процент;
	КонецЕсли;

	Возврат Рез;
КонецФункции // глВернутьЦену()
 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #45 - 08. Сентября 2011 :: 08:51
Печать  
Вкини из текста запроса обращение к справочнику Номенклатура (ты из него только наименование достаешь, которое нафик там не нужно), оставь только запрос к справочнику Цены.

     
Код
Выбрать все
|SELECT
	|  СпрЦ.ID [Ссылка $Справочник.Цены],
	|  $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена,
	|  $ПоследнееЗначение.Цены.Единица(СпрЦ.ID, :ВыбДата) [Единица $Справочник.Единицы],
	|  $СпрЦ.Валюта [Валюта $Справочник.Валюты],
	|  $СпрЦ.Процент Процент,
	|  СпрЦ.IsMark Пометка
	|FROM
	|  $Справочник.Цены СпрЦ
	|WHERE
	|  СпрЦ.ParentExt  = :ВыбНом AND
	|				   $СпрЦ.ТипЦен = :ТипЦен 



Да и.. половину полей из этого запроса можно выкинуть (как и типизацию) - они тебе вообще нужны ?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #46 - 08. Сентября 2011 :: 08:57
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:51:
Вкини из текста запроса обращение к справочнику Номенклатура (ты из него только наименование достаешь, которое нафик там не нужно), оставь только запрос к справочнику Цены.

     
Код
Выбрать все
|SELECT
	|  СпрЦ.ID [Ссылка $Справочник.Цены],
	|  $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена,
	|  $ПоследнееЗначение.Цены.Единица(СпрЦ.ID, :ВыбДата) [Единица $Справочник.Единицы],
	|  $СпрЦ.Валюта [Валюта $Справочник.Валюты],
	|  $СпрЦ.Процент Процент,
	|  СпрЦ.IsMark Пометка
	|FROM
	|  $Справочник.Цены СпрЦ
	|WHERE
	|  СпрЦ.ParentExt  = :ВыбНом AND
	|				   $СпрЦ.ТипЦен = :ТипЦен 



Да и.. половину полей из этого запроса можно выкинуть (как и типизацию) - они тебе вообще нужны ?

не могу выкинуть поля они используются дальше по тексту функции
На счет номенклатуры действительно зачем я ее сюда включил ))

Ускорение конечно не значительное, зато код лаконичнее ))
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #47 - 08. Сентября 2011 :: 09:12
Печать  
Ускорение продолжается.
Хочу эту часть кода переделать под прямой запрос.
Код
Выбрать все
Запрос = СоздатьОбъект("Запрос");
	сТекстЗапроса = "
	|Период с ДатаВыгрузкиДанных по ДатаВыгрузкиДанных;
	|Фирма = Регистр.ОстаткиТМЦ.Фирма;
	|Склад = Регистр.ОстаткиТМЦ.Склад;
	|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
	|Количество = Регистр.ОстаткиТМЦ.Количество;
	|Группировка Номенклатура;
	|Функция КонечныйОстаток = КонОст(Количество);
	|Условие(Фирма = спрФирма);
	|Условие(Склад = спрСклад);
	|";
	пРезультат = Запрос.Выполнить(сТекстЗапроса);
	Если пРезультат = 0 Тогда
		Сообщить("Запрос по остаткам не был выполнен! Выгрузка данных не возможна!");
		ОтчетОПроведении = ОтчетОПроведении + РазделительСтрок + "Выгрузка товаров ... Ошибка!";
		Возврат;
	Иначе
		тФайл = СоздатьОбъект("Текст");
		тФайл.ДобавитьСтроку("##@@&&");//Строка инициализации файла
		тФайл.ДобавитьСтроку("#");//Флаг того обработан ли файл
		тФайл.ДобавитьСтроку("$$$DELETEALLWARES");//Удалим все товары
		тФайл.ДобавитьСтроку("$$$REPLACEQUANTITY");//Начинаем добавлять товары и групппы товаров
		КоличествоУровней = Метаданные.Справочник("Номенклатура").КоличествоУровней;
		Для Индекс = 1 По КоличествоУровней Цикл
			Запрос.ВНачалоВыборки();
			Пока Запрос.Группировка("Номенклатура") = 1 Цикл
				Если Запрос.Номенклатура.Уровень() = Индекс Тогда
					тФайл.ДобавитьСтроку(СтрокаНоменклатуры(Запрос));
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		Запрос.Выгрузить(тзНоменклатура);//Выгрузим номенклатуру в таблицу значений
	КонецЕсли;
 



В связи с этим вопрос ...
при каких условиях я могу получить данные в индексированную таблицу и есть ли метод получать данные в разрезе группировок ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #48 - 08. Сентября 2011 :: 09:16
Печать  
ВыполнитьИнстукцию спокойно выгружает запрос в индексированную тз, смотри параметры метода.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #49 - 08. Сентября 2011 :: 09:28
Печать  
Eprst писал(а) 08. Сентября 2011 :: 09:16:
ВыполнитьИнстукцию спокойно выгружает запрос в индексированную тз, смотри параметры метода.

Извиняюсь за тупой вопрос, но по индексированной таблице каким образом можно сделать обход по группировкам ?
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #50 - 08. Сентября 2011 :: 09:39
Печать  
Если это выгрузка на кассу в формате АТОЛ, то делается немного по-другому.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #51 - 08. Сентября 2011 :: 09:47
Печать  
mozer писал(а) 08. Сентября 2011 :: 09:28:
Eprst писал(а) 08. Сентября 2011 :: 09:16:
ВыполнитьИнстукцию спокойно выгружает запрос в индексированную тз, смотри параметры метода.

Извиняюсь за тупой вопрос, но по индексированной таблице каким образом можно сделать обход по группировкам ?


сгруппировать разве что.

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #52 - 08. Сентября 2011 :: 09:57
Печать  
vinogradoff писал(а) 08. Сентября 2011 :: 09:39:
Если это выгрузка на кассу в формате АТОЛ, то делается немного по-другому.


Как ?
Только учти у меня уже все настроено давно томозит только этот момент
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #53 - 08. Сентября 2011 :: 10:00
Печать  
Eprst писал(а) 08. Сентября 2011 :: 09:47:
mozer писал(а) 08. Сентября 2011 :: 09:28:
Eprst писал(а) 08. Сентября 2011 :: 09:16:
ВыполнитьИнстукцию спокойно выгружает запрос в индексированную тз, смотри параметры метода.

Извиняюсь за тупой вопрос, но по индексированной таблице каким образом можно сделать обход по группировкам ?


сгруппировать разве что.


Сгруппировать это понятно, как обойти группировки например как в стандартном запросе 1С?
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #54 - 08. Сентября 2011 :: 10:06
Печать  
параметры 16,17 если Frontol и 16,17,18 если РМК
Выбираешь товары с остатками + их группы + коды родительских групп в один список и заполняешь соответствующие параметры
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #55 - 08. Сентября 2011 :: 10:29
Печать  
vinogradoff писал(а) 08. Сентября 2011 :: 10:06:
параметры 16,17 если Frontol и 16,17,18 если РМК
Выбираешь товары с остатками + их группы + коды родительских групп в один список и заполняешь соответствующие параметры

так так и хочу сделать только на прямом запросе и индексированной таблице с группировкой по уровню.
дальше тормоза идут в преобразовании занчения
Код
Выбрать все
сНоменклатура = СокрЛП(Строка(Число(СтрокаЗапроса.Номенклатура.Код))) + ";" +  //1 Код
 



поэтому преобразование хочу вынести на сервер через cast

Вопрос только ка обойти индексированную таблицу по группировкам ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #56 - 08. Сентября 2011 :: 10:32
Печать  
сгруппируй и обходи рекурсивно
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #57 - 08. Сентября 2011 :: 10:34
Печать  
С какой целью делать группировки по уровню? Остатки на группы РМК/Frontol не поддерживают. Если им выдать список товаров с группами и кодами их родителей (пустое значение если элемент верхнего уровня), то РМК/Frontol сами построят иерархию справочника.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #58 - 08. Сентября 2011 :: 10:38
Печать  
vinogradoff писал(а) 08. Сентября 2011 :: 10:34:
С какой целью делать группировки по уровню? Остатки на группы РМК/Frontol не поддерживают. Если им выдать список товаров с группами и кодами их родителей (пустое значение если элемент верхнего уровня), то РМК/Frontol сами построят иерархию справочника.

Для того что бы выстроить иерархию ту которая по остаткам.
если например нет товара из этой группы то и выгружать его незачем, а порядок уровня соблюдать нужно потому как если при загрузке будет ошибку выдавать если нет такой группы в справочнике фронтол. (Например если полностью замену делаешь) так как в файле ты указываешь код родителя и этот родитель уже должен существовать
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #59 - 08. Сентября 2011 :: 10:39
Печать  
Eprst писал(а) 08. Сентября 2011 :: 10:32:
сгруппируй и обходи рекурсивно

хоть убей не вижу метода обхода или как то по хитрому там делается ? (не материть с индексированной таблицей не работал!)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #60 - 08. Сентября 2011 :: 10:41
Печать  
http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#group

потом обходишь в рекурсивной функции свой тз, подсовывая ТЗПОтомки в качестве аргумента функции для прыганья унутрь группировки.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #61 - 08. Сентября 2011 :: 10:43
Печать  
Код
Выбрать все
...
ИтТз = Запрос.Выполнить("ИндексированнаяТаблица",ТекстЗапроса);

ВывестиСтрокиИтТз(ИтТз);
...


Процедура ВывестиСтрокиИтТз(ИсхТз)
 ИсхТз.ВыбратьСтроки();
 Пока ИсхТз.ПолучитьСтроку()=1 Цикл
   //Вывод первой группировки
   Если ПустоеЗначение(ИсхТз.тзПотомки)=0 Тогда
	  ВывестиСтрокиИтТз(ИсхТз.тзПотомки);
   КонецЕсли;
КонецПроцедуры 

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #62 - 08. Сентября 2011 :: 10:46
Печать  
Eprst писал(а) 08. Сентября 2011 :: 10:41:
http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#group

потом обходишь в рекурсивной функции свой тз, подсовывая ТЗПОтомки в качестве аргумента функции для прыганья унутрь группировки.


leshik писал(а) 08. Сентября 2011 :: 10:43:
Код
Выбрать все
...
ИтТз = Запрос.Выполнить("ИндексированнаяТаблица",ТекстЗапроса);

ВывестиСтрокиИтТз(ИтТз);
...


Процедура ВывестиСтрокиИтТз(ИсхТз)
 ИсхТз.ВыбратьСтроки();
 Пока ИсхТз.ПолучитьСтроку()=1 Цикл
   //Вывод первой группировки
   Если ПустоеЗначение(ИсхТз.тзПотомки)=0 Тогда
	  ВывестиСтрокиИтТз(ИсхТз.тзПотомки);
   КонецЕсли;
КонецПроцедуры 



Понял спасибо пошел "Курить"
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #63 - 08. Сентября 2011 :: 10:55
Печать  
mozer писал(а) 08. Сентября 2011 :: 10:38:
vinogradoff писал(а) 08. Сентября 2011 :: 10:34:
С какой целью делать группировки по уровню? Остатки на группы РМК/Frontol не поддерживают. Если им выдать список товаров с группами и кодами их родителей (пустое значение если элемент верхнего уровня), то РМК/Frontol сами построят иерархию справочника.

Для того что бы выстроить иерархию ту которая по остаткам.
если например нет товара из этой группы то и выгружать его незачем, а порядок уровня соблюдать нужно потому как если при загрузке будет ошибку выдавать если нет такой группы в справочнике фронтол. (Например если полностью замену делаешь) так как в файле ты указываешь код родителя и этот родитель уже должен существовать


1. Сортировка при формировании файла: сначала группы, отсортированные по уровню (от верхнего вниз), затем товары (гарантировано, что родитель будет создан).
2. Выбирать товары с ненулевым остатком и присоединять к ним их группы (получите только нужные группы).
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #64 - 08. Сентября 2011 :: 11:00
Печать  
vinogradoff писал(а) 08. Сентября 2011 :: 10:55:
mozer писал(а) 08. Сентября 2011 :: 10:38:
vinogradoff писал(а) 08. Сентября 2011 :: 10:34:
С какой целью делать группировки по уровню? Остатки на группы РМК/Frontol не поддерживают. Если им выдать список товаров с группами и кодами их родителей (пустое значение если элемент верхнего уровня), то РМК/Frontol сами построят иерархию справочника.

Для того что бы выстроить иерархию ту которая по остаткам.
если например нет товара из этой группы то и выгружать его незачем, а порядок уровня соблюдать нужно потому как если при загрузке будет ошибку выдавать если нет такой группы в справочнике фронтол. (Например если полностью замену делаешь) так как в файле ты указываешь код родителя и этот родитель уже должен существовать


1. Сортировка при формировании файла: сначала группы, отсортированные по уровню (от верхнего вниз), затем товары (гарантировано, что родитель будет создан).
2. Выбирать товары с ненулевым остатком и присоединять к ним их группы (получите только нужные группы).


Эта идея уже реализована! только работает она хорошо под файловый вариант. Но реализована тупым перебором. Вот и переделываю сейчас под SQL вариант с запросом. получу все необходимое в запросе и в индексированную таблицу. Дальше группировка и вывод (Спасибо с выводом подсказали теперь проблемы нет)
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #65 - 08. Сентября 2011 :: 12:07
Печать  
Вот на какую проблему при написании запроса наткнулся ...
выбираю остатки из регистра остатков, соответственно он мне выдаст всю номенклатуру по которой есть остаток. Соединив его с таблицей справочника номенклатуры получу родителя этой номенклатуры.
Но как в запросе получить все верхние группы номенклатуры ??
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #66 - 08. Сентября 2011 :: 12:18
Печать  
смотри параметры метода группировать
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #67 - 08. Сентября 2011 :: 12:53
Печать  
Eprst писал(а) 08. Сентября 2011 :: 12:18:
смотри параметры метода группировать

не в таблице а в запросе ...
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #68 - 08. Сентября 2011 :: 12:59
Печать  
левые соединения к parentid столько раз сколько уровней в справочнике
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #69 - 08. Сентября 2011 :: 16:01
Печать  
vinogradoff писал(а) 08. Сентября 2011 :: 12:59:
левые соединения к parentid столько раз сколько уровней в справочнике

А более универсальный способ существует ?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #70 - 08. Сентября 2011 :: 17:25
Печать  
  
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #71 - 09. Сентября 2011 :: 02:40
Печать  
leshik писал(а) 08. Сентября 2011 :: 17:25:

Ага спасибо нашел похожий пример в MSDN уже начал писать даже )
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #72 - 09. Сентября 2011 :: 05:12
Печать  
Проще заранее создать табличку в скуле со всеми родителями и повесить триггер на справочник, который будет обновлять эту табличку.
Затем достаточно просто соединения с этой табличкой для получения всех родителей.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #73 - 09. Сентября 2011 :: 06:34
Печать  
Чем можно отбросить лишние пробелы в запросе
Код
Выбрать все
CAST(CAST(СпрНом.Code as INT) as CHAR) Код
 


возвращает например:
"20064                         "
Хотелось бы пробелы убрать, что бы не пользоватся стандартной функцией СокрЛП()
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #74 - 09. Сентября 2011 :: 07:55
Печать  
rtrim
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #75 - 09. Сентября 2011 :: 09:28
Печать  
Вот что за запрос получился, но он выбирает все равно только элементы ... Где я накосячил ?

Код
Выбрать все
	|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.Code,
	|	СпрНоменкл.Descr,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	СпрНоменкл.SP85,
	|	СпрНоменкл.SP94,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.Code,
	|	СпрН.Descr,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	СпрН.SP85,
	|	СпрН.SP94,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
	|)
	|
	|SELECT
	//|	СпрНом.ID,
	|	RTRIM(CAST(CAST(СпрНом.Code as INT) as CHAR)) Код,
	|	RTRIM(СпрНом.Descr) Наименование,
	//|	СпрНом.ParentID ИдГруппы,
	|	RTRIM(CAST(CAST(СпрНомГр.Code as INT) as CHAR)) КодРодителя,
	|	СпрНом.IsFolder Группа,
	|	RTRIM(СпрНом.SP85) Артикул,
	//|	СпрНом.SP94 Единица,
	|	RTRIM(СпрЕд.SP80) Штрихкод,
	|	$ПоследнееЗначение.Цены.Цена(СпрЦены.ID, :ВыбДата) Цена,
	|	Level Уровень,
	|	РегОстатки.КоличествоОстаток Остаток
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВыбФирма AND Склад = :ВыбСклад,Номенклатура,Количество) as РегОстатки
	|LEFT JOIN
	|	Номенклатура_Иерархия СпрНом ON СпрНом.ID = РегОстатки.Номенклатура
	|LEFT JOIN
	|	$Справочник.Единицы СпрЕд ON СпрЕд.ID = СпрНом.SP94
	|LEFT JOIN
	|	$Справочник.Цены СпрЦены ON СпрЦены.ParentExt = СпрНом.ID
	|LEFT JOIN
	|	$Справочник.Номенклатура СпрНомГр ON СпрНомГр.ID = СпрНом.ID
	|
	|";
 



Понял! из рекурсивной таблицы выбираю только те что есть на остатке, а как бы так извернутся что бы он выбирал те что на остатке и все верхние?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #76 - 09. Сентября 2011 :: 12:06
Печать  
Пока нашел только такое решение, но оно имеет недостатки
1. Работает конечно быстрей, но не намного раза 4 быстрей всего
2. Запрос обрабатывает всю номенклатуру до единой

Кто знает лучший вариант пишете. Буду рад любому предложению!

Код
Выбрать все
	|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.Code,
	|	СпрНоменкл.Descr,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	СпрНоменкл.SP85,
	|	СпрНоменкл.SP94,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.Code,
	|	СпрН.Descr,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	СпрН.SP85,
	|	СпрН.SP94,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
	|)
	|
	|SELECT * FROM Номенклатура_Иерархия НомИерарх
	|LEFT JOIN
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВыбФирма AND Склад = :ВыбСклад,Номенклатура,Количество) РегОстатки ON НомИерарх.ID = РегОстатки.Номенклатура AND НомИерарх.IsFolder = 2
	|";
 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #77 - 09. Сентября 2011 :: 13:28
Печать  
Заведи Товары в отдельной таблице
на этой таблице кластерный индекс  primary key из двух этих полей (Товар , Предок)

Товар , Предок :
Товар_1 -- Товар_1
Товар_1 -- Отец
Товар_1 -- Дед
.....
Товар_1 -- Предок_10

и так для всех товаров элементов.
услуги можно не включать.

И inner join к  этой таблице.

Конечно встает вопрос об актуальности  этой таблицы но товары достаточно редко тусуются по группам да и новые элементы создаются не часто.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #78 - 12. Сентября 2011 :: 02:34
Печать  
Z1 писал(а) 09. Сентября 2011 :: 13:28:
Конечно встает вопрос об актуальности  этой таблицы но товары достаточно редко тусуются по группам да и новые элементы создаются не часто.

Новые товары могут быть созданы 3 раза в неделю.
Я для этих целей отчет прайс переписывал, что бы пользователь видел когда номенклатура создана была. Меняются уже существующие очень редко.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #79 - 12. Сентября 2011 :: 06:10
Печать  
leshik писал(а) 08. Сентября 2011 :: 10:43:
Код
Выбрать все
...
ИтТз = Запрос.Выполнить("ИндексированнаяТаблица",ТекстЗапроса);

ВывестиСтрокиИтТз(ИтТз);
...


Процедура ВывестиСтрокиИтТз(ИсхТз)
 ИсхТз.ВыбратьСтроки();
 Пока ИсхТз.ПолучитьСтроку()=1 Цикл
   //Вывод первой группировки
   Если ПустоеЗначение(ИсхТз.тзПотомки)=0 Тогда
	  ВывестиСтрокиИтТз(ИсхТз.тзПотомки);
   КонецЕсли;
КонецПроцедуры 



Что то группировку не получается сделать ...
Делаю группировку, а тзПотомки не создается, значить группировка не создается или еще что то ?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #80 - 13. Сентября 2011 :: 02:54
Печать  
И так чем все закончилось!
Запрос по рекурсии оказался хорош только для получения иерархии папок. В этом случае он работает быстро. Также при помощи рекурсивного запроса получил остатки хотя и без него можно обойтись (но пишу как есть переделывать не переделывал), в этом случае выборка также быстро происходит.
Дальше поступил следующим образом, выбрал иерархию папок, выбрал остатки все это в двух одинаковых по структуре таблицах.
Сортируем таблицу папок (иерархия папок) по уровню с убыванием (для того чтобы нижние уровни папок добавлялись первыми и в таблицу остатков с кодами своих родителей) добавление идет по условию кода родителя если код папки найден в столбце "КодРодителя" и не найден в столбце "Код", тогда добавим папку в таблицу остатков. В Результате получаем таблицу остатков с иерархией папок по остаткам, сортируем ее по уровню и признаку группы. Обрабатываем. Скорость в 9-10 раз быстрей если не пользоваться обычным запросом и стандартными функциями преобразования. Собственно все преобразования типов делаем в запросе  Подмигивание

Код
Выбрать все
сТекстПрямогоЗапросаОстатки = "
	|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.Code,
	|	СпрНоменкл.Descr,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	СпрНоменкл.SP85,
	|	СпрНоменкл.SP94,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.Code,
	|	СпрН.Descr,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	СпрН.SP85,
	|	СпрН.SP94,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
	|)
	|
	|SELECT
	|	СпрНом.ID [Номенклатура $Справочник.Номенклатура],
	|	RTRIM(CAST(CAST(СпрНом.Code as INT) as CHAR)) Код,
	|	RTRIM(СпрНом.Descr) Наименование,
	|	СпрНом.ParentID ИдГруппы,
	|	RTRIM(CAST(CAST(СпрНомГр.Code as INT) as CHAR)) КодРодителя,
	|	СпрНом.IsFolder Группа,
	|	RTRIM(СпрНом.SP85) Артикул,
	|	RTRIM(СпрЕд.SP80) Штрихкод,
	|	Level Уровень,
	|	РегОстатки.КоличествоОстаток Остаток
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВыбФирма AND Склад = :ВыбСклад,Номенклатура,Количество) as РегОстатки
	|LEFT JOIN
	|	Номенклатура_Иерархия СпрНом ON СпрНом.ID = РегОстатки.Номенклатура
	|LEFT JOIN
	|	$Справочник.Единицы СпрЕд ON СпрЕд.ID = СпрНом.SP94
	|LEFT JOIN
	|	$Справочник.Номенклатура СпрНомГр ON СпрНомГр.ID = СпрНом.ParentID
	|
	|";

Запрос выше можно и переделать, но не досуг пока.  :)


	сТекстПрямогоЗапросаИерархия = "
	|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.Code,
	|	СпрНоменкл.Descr,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	СпрНоменкл.SP85,
	|	СпрНоменкл.SP94,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.Code,
	|	СпрН.Descr,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	СпрН.SP85,
	|	СпрН.SP94,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID AND СпрН.IsFolder = 1
	|)
	|
	|SELECT
	|	НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
	|	RTRIM(CAST(CAST(НомИерарх.Code as INT) as CHAR)) Код,
	|	RTRIM(НомИерарх.Descr) Наименование,
	|	НомИерарх.ParentID ИдГруппы,
	|	RTRIM(CAST(CAST(СпрНомГр.Code as INT) as CHAR)) КодРодителя,
	|	НомИерарх.IsFolder Группа,
	|	RTRIM(НомИерарх.SP85) Артикул,
	|	НомИерарх.SP94 Единица,
	|	RTRIM(СпрЕд.SP80) Штрихкод,
	|	Level Уровень,
	|	0 Остаток
	|FROM
	|Номенклатура_Иерархия НомИерарх
	|LEFT JOIN
	|	$Справочник.Единицы СпрЕд ON СпрЕд.ID = НомИерарх.SP94
	|LEFT JOIN
	|	$Справочник.Номенклатура СпрНомГр ON СпрНомГр.ID = НомИерарх.ParentID
	|";
 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать