Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Получение значений справочника через две, три, четыре точки (число прочтений - 10918 )
Eprst
God Member
*****
Отсутствует



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


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #31 - 16. Июня 2010 :: 09:23
Печать  
MaxPiter писал(а) 16. Июня 2010 :: 09:16:
Результат: Вместо 18% теперь 10%


и процентов 7 этой разницы приходится теперь выполнение запроса
    ТекстЗапроса = "set nocount on
    |SELECT
    |      Партии.ID [Ссылка $Справочник.Партии],
    |      $Партии.ПриходныйДокумент [ПриходныйДокумент $Документ]
    |FROM
    |      $Справочник.Партии AS Партии  (NOLOCK)
    |WHERE
    |      (Партии.ID IN (
    |                              SELECT Val FROM #текПартия (NOLOCK)
    |                        )
    |      )";

Улыбка
то есть по сумме времени примерно тоже самое.
или нет?

и плюс вот это еще RS.УложитьСписокОбъектов(СписокПартий, "#текПартия");
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #32 - 16. Июня 2010 :: 09:25
Печать  
Не совсем, бОльшее время тратится на выгрузку в список + уложитьОбъекты + построчный поиск в ТЗ..
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #33 - 16. Июня 2010 :: 09:51
Печать  
по времени проводится чуток быстрее, но это заметно только таймеру, конечный пользователь вряд ли заметит...

ТЗТемп.Выгрузить(СписокПартий);                                   65      0.903086      3.56

RS.УложитьСписокОбъектов(СписокПартий, "#текПартия");             65      1.112422      4.39
ТЗЗапрос = RS.ВыполнитьИнструкцию(ТекстЗапроса);                  65      0.676648      2.67

знДок = ТЗЗапрос.НайтиЗначение(ТаблИтогов.Партия,сСтр,кКол);      17585      0.327535      1.29
ТаблИтогов.ДокПартии = ТЗЗапрос.ПолучитьЗначение(сСтр,"Ссылка");  17565      0.388575      1.53


Получить ТаблИтогов всю сразу... это попробую
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #34 - 16. Июня 2010 :: 10:36
Печать  
MaxPiter писал(а) 16. Июня 2010 :: 08:52:
Сейчас иду по второму пути, который orefkov предложил, немного быстрее получается.

Мне кажется, что он имел ввиду не то, что сделал ты сейчас, а то, что я тебе посоветовал ещё в 9-м посте.
Т.е. должно получиться примерно так:
Код
Выбрать все
ТекстЗапроса = "
     |SELECT
     |	$Партии.ПриходныйДокумент [ПриходныйДокумент $Документ]
     |FROM
     |	$Справочник.Партии AS Партии  (NOLOCK)
     |WHERE
     |	(Партии.ID = ?)";
Запрос.Подготовить(ТекстЗапроса);
Запрос.ДобПараметр(1, 14, 9, 0);
Пока ... Цикл
   Запрос.УстПараметр(1, ТаблИтогов.Партия);
   ПриходныйДокумент = Запрос.ВыполнитьСкалярный();
КонецЦикла
 

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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #35 - 16. Июня 2010 :: 11:06
Печать  
Так получается, что запросов к БД 17585 раз, хоть и быстрые они, но в итоге медленнее чем как в 29 сообщении.
В общем для данной строки быстрее разве что таблицу полную сразу получить 1 раз и по ней искать.

Всем большое спасибо за ответы, причешу чего получилось и попробую подступиться к ВыпонитьРасчетНа
  
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #36 - 16. Июня 2010 :: 12:03
Печать  
# 29 немного улучшил твой код
Код
Выбрать все
Процедура глЗаполнитьПриходныйДокументПартии(ТаблИтогов) Экспорт
     СписокПартий = СоздатьОбъект("СписокЗначений");
     ТЗТемп = СоздатьОбъект("ТаблицаЗначений");
     ТаблИтогов.Выгрузить(ТЗТемп,,,"Партия");
     ТЗТемп.Свернуть("Партия","");
     ТЗТемп.Выгрузить(СписокПартий);

     RS = СоздатьОбъект("ODBCRecordset");


     ТекстЗапроса = "
     |SELECT
     |	Партии.ID [Ссылка $Справочник.Партии],
     |	$Партии.ПриходныйДокумент [ПриходныйДокумент $Документ]
     |FROM
     |	$Справочник.Партии AS Партии  (NOLOCK)
     |WHERE
     |	(Партии.ID IN (
     |					SELECT Val FROM #текПартия
     |				)
     |	)";

     RS.УложитьСписокОбъектов(СписокПартий, "#текПартия");
     ТЗЗапрос = RS.ВыполнитьИнструкцию(ТекстЗапроса);
// Если ТаблИтогов отсроттирована по партиям тогда можно еще улучшить этот текст
     ТаблИтогов.ВыбратьСтроки();
     Пока ТаблИтогов.ПолучитьСтроку()=1 Цикл
	     сСтр="";
	     знДок = ТЗЗапрос.НайтиЗначение(ТаблИтогов.Партия,сСтр,"ПриходныйДокумент");
	     Если знДок=1 Тогда
		     ТаблИтогов.ДокПартии = ТЗЗапрос.ПолучитьЗначение(сСтр,"Ссылка");
	     КонецЕсли;
     КонецЦикла;
КонецПроцедуры
 



но лучше делать как в пункте 1 из #23
для этого всего лишь надо ВыгрузитьИтоги (с фильтром  и с рассчитать на дату ) переписать на t-sql
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #37 - 16. Июня 2010 :: 12:23
Печать  
Господа, если не сложно и не запарил Улыбка

пример можно? как вот из этого сделать прямой запрос,

     ВремРегистры                  = СоздатьОбъект("Регистры");
     ВремЗаявки                      = ВремРегистры.Заявки;

     ВремЗаявки.УстановитьЗначениеФильтра("Фирма",ФирмаДляОстатковТМЦ, 2);
     ВремЗаявки.УстановитьЗначениеФильтра("ДоговорПокупателя", Договор,1);

     ТаблицаНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
         ВремЗаявки.      УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);

     ВремЗаявки.      ВременныйРасчет();

     ВремРегистры.Актуальность(1);
     ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());


остальные (8) участвующие во временном расчете, я как нить по образу и подобию постараюсь сделать Улыбка
а уж потом собирать в один запрос, если это будет возможно.

похоже на правду?

Изменено:
Процедура Сформировать()
     спНоменклатура = СоздатьОбъект("СписокЗначений");
     тзТабл = создатьОбъект("ТаблицаЗначений");
     
     рс = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
           |SELECT ЗаявкиОстатки.Фирма [Фирма $Справочник.Фирмы]
           |      , ЗаявкиОстатки.ДоговорПокупателя [ДоговорПокупателя $Справочник.Договоры]
           |      , ЗаявкиОстатки.ЗаявкаПокупателя [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя]
           |      , Sum(ЗаявкиОстатки.КоличествоРасходОстаток) СуммаКоличествоРасходОстаток
           |      , Sum(ЗаявкиОстатки.СтоимостьРасходОстаток) СуммаСтоимостьРасходОстаток
           |FROM $РегистрОстатки.Заявки(,,
           |            (Фирма IN (SELECT Val FROM #текФирма))
           |            AND (ДоговорПокупателя = :текДоговор)
           |            AND (Номенклатура IN (SELECT Val FROM #спНоменклатура)),
           |            (Фирма, ДоговорПокупателя, ЗаявкаПокупателя),) AS ЗаявкиОстатки
           |GROUP BY ЗаявкиОстатки.Фирма
           |      , ЗаявкиОстатки.ДоговорПокупателя
           |      , ЗаявкиОстатки.ЗаявкаПокупателя
           |      WITH ROLLUP
           |";
           
     ТекДок.ВыгрузитьТабличнуюЧасть(тзТабл);
     тзТабл.Свернуть("Номенклатура","");
     тзТабл.Выгрузить(спНоменклатура);
     ФирмаДляОстатковТМЦ = глФирмаДляОстатковТМЦ(ТекДок.Фирма);
     рс.УложитьСписокОбъектов(ФирмаДляОстатковТМЦ, "#текФирма");
     рс.УстановитьТекстовыйПараметр("текДоговор", ТекДок.Договор);
     рс.УложитьСписокОбъектов(спНоменклатура, "#спНоменклатура");
     рс.отладка(1);
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     тз.Выбрать

« Последняя редакция: 16. Июня 2010 :: 13:25 - MaxPiter »  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Получение значений справочника через две, три, четыре точки
Ответ #38 - 17. Июня 2010 :: 06:00
Печать  
JohnyDeath писал(а) 16. Июня 2010 :: 10:36:
Мне кажется, что он имел ввиду не то, что сделал ты сейчас, а то, что я тебе посоветовал ещё в 9-м посте.

Приятно пообщаться с понимающим человеком Улыбка
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Получение значений справочника через две, три, четыре точки
Ответ #39 - 17. Июня 2010 :: 06:13
Печать  
MaxPiter писал(а) 16. Июня 2010 :: 12:23:
Господа, если не сложно и не запарил Улыбка

пример можно? как вот из этого сделать прямой запрос,



Наверное так:
Код
Выбрать все
Процедура Сформировать()
     рс = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
	     |SELECT ЗаявкиОстатки.Фирма [Фирма $Справочник.Фирмы]
	     |	, ЗаявкиОстатки.ДоговорПокупателя [ДоговорПокупателя $Справочник.Договоры]
	     |	, ЗаявкиОстатки.ЗаявкаПокупателя [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя]
	     |	, ЗаявкиОстатки.КоличествоРасходОстаток СуммаКоличествоРасходОстаток
	     |	, ЗаявкиОстатки.СтоимостьРасходОстаток СуммаСтоимостьРасходОстаток
	     |FROM $РегистрОстатки.Заявки(:ТекДок~~~~,,
	     |		(Фирма IN (SELECT Val FROM #текФирма))
	     |		AND (ДоговорПокупателя = :текДоговор)
	     |		AND (Номенклатура IN
		   |				(SELECT $ДокВид.Номенклатура FROM $ДокументСтроки.ИмяВидаДока ДокВид (nolock) where ДокВид.iddoc=:ТекДок)),
	     |		(Фирма, ДоговорПокупателя, ЗаявкаПокупателя),
		   |			(КоличествоРасход,СтоимостьРасход)) AS ЗаявкиОстатки
	     |";

     ФирмаДляОстатковТМЦ = глФирмаДляОстатковТМЦ(ТекДок.Фирма);
     рс.УложитьСписокОбъектов(ФирмаДляОстатковТМЦ, "#текФирма");
     рс.УстановитьТекстовыйПараметр("текДоговор", ТекДок.Договор);
     рс.УстановитьТекстовыйПараметр("ТекДок", ТекДок.ТекущийДокумент());
     рс.отладка(1);
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
 

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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #40 - 17. Июня 2010 :: 06:22
Печать  
ругается:

Meta name parser error: недопустимое значение параметра "" (3 : объект не найден "$ДокументСтроки.ИмяВидаДока")

честно говоря не понимаю почему  Печаль
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Получение значений справочника через две, три, четыре точки
Ответ #41 - 17. Июня 2010 :: 06:36
Печать  
MaxPiter писал(а) 17. Июня 2010 :: 06:22:
ругается:

Meta name parser error: недопустимое значение параметра "" (3 : объект не найден "$ДокументСтроки.ИмяВидаДока")

честно говоря не понимаю почему  Печаль

Ну я же не знаю, как называется документ, для которого ты это пишешь. Подставь вместо ИмяВидаДока твое имя вида документа.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #42 - 17. Июня 2010 :: 06:38
Печать  
понял, т.е. конструкция

AND (Номенклатура IN (SELECT Val FROM #спНоменклатура)),
и
AND (Номенклатура IN
     |                        (SELECT $ДокВид.Номенклатура FROM $ДокументСтроки.ИмяВидаДока ДокВид (nolock) where ДокВид.iddoc=:ТекДок)),


в общем то тоже самое (в общем смысле) и задает список номенклатуры?
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Получение значений справочника через две, три, четыре точки
Ответ #43 - 17. Июня 2010 :: 06:55
Печать  
MaxPiter писал(а) 17. Июня 2010 :: 06:38:
понял, т.е. конструкция

AND (Номенклатура IN (SELECT Val FROM #спНоменклатура)),
и
AND (Номенклатура IN
     |                        (SELECT $ДокВид.Номенклатура FROM $ДокументСтроки.ИмяВидаДока ДокВид (nolock) where ДокВид.iddoc=:ТекДок)),


в общем то тоже самое (в общем смысле) и задает список номенклатуры?

Совершенно верно, только позволяет не тянуть данные сперва на клиента, а потом кидать их обратно на сервер.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #44 - 17. Июня 2010 :: 06:58
Печать  
Замечательно Улыбка
Спасибо большое за ответы!!!
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать