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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Получение значений справочника через две, три, четыре точки
15. Июня 2010 :: 13:54
Печать  
Добрый день.
Подскажите пожалуйста, как реализовать такую штуку?

Имею в цикле
ТаблИтогов.Док = ТаблИтогов.Партия.ПриходныйДокумент;
Итого эта строчка отъедат !!! 18% от всего времени выполнения модуля.
ТаблИтогов.Док - добавляется уже после выполнения расчетов и сверток, да и выцепить раньше никак не получается.

Есть ли возможность ускорить эту строку через прямое обращение к БД или еще каким способом?
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #1 - 15. Июня 2010 :: 14:18
Печать  
Как вариант, получить приходный документ в самом запросе.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

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

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

Может есть пара строк типа (утрирую)
ODBC.ПолучитьЗначениеПоля(знПолучить, Партия, "ПриходныйДокумет");
и в знПолучить вернется объект ПриходныйДокумент
  
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #3 - 15. Июня 2010 :: 14:31
Печать  
MaxPiter писал(а) 15. Июня 2010 :: 13:54:
Добрый день.
Подскажите пожалуйста, как реализовать такую штуку?

Имею в цикле
ТаблИтогов.Док = ТаблИтогов.Партия.ПриходныйДокумент;
Итого эта строчка отъедат !!! 18% от всего времени выполнения модуля.
ТаблИтогов.Док - добавляется уже после выполнения расчетов и сверток, да и выцепить раньше никак не получается.

Есть ли возможность ускорить эту строку через прямое обращение к БД или еще каким способом?

Вы хотя бы задачу опишите.Выложите более менее осмысленный
завершенный текст модуля ( Сказать что либо по одной строчке
это фантастика).
Даже из subj непонятно sql или dbf версия 1с,
используются или нет прямые запросы и.т.д.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #4 - 15. Июня 2010 :: 15:46
Печать  
Z1 писал(а) 15. Июня 2010 :: 14:31:
Вы хотя бы задачу опишите.Выложите более менее осмысленный
завершенный текст модуля ( Сказать что либо по одной строчке
это фантастика).
Даже из subj непонятно sql или dbf версия 1с,
используются или нет прямые запросы и.т.д.


Помоему я написал же, что цикл, в цикле есть имеющаяся строка, в ней происходит обращение к полю Приходный документ через вторую точку, что существенно замедляет ее исполнение.

Пока ТаблИтогов Получить()=1 Цикл
  ТаблИтогов.Док = ТаблИтогов.Партия.ПриходныйДокумент;
КонецЦикла;


т.е.  ТаблИтогов.Партия.ПриходныйДокумент получается очень медленно. в от личии от ТаблИтогов.Партия

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

1С 7.7 SQL прямые запросы используются.
  
Наверх
www  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #5 - 15. Июня 2010 :: 16:17
Печать  
а если так
Пока ТаблИтогов Получить()=1 Цикл
  Партия = ТаблИтогов.Партия;
  ТаблИтогов.Док = Партия .ПриходныйДокумент;
КонецЦикла;

если мне склероз не изменяет, не рекомендуется в 1С использовать обращение через несколько точек. По-идее, если Партия - это объект(элемент справочника), то 1С незачем лезть в БД еще раз для получения значения реквизита этого объекта.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #6 - 15. Июня 2010 :: 16:23
Печать  
alexdd писал(а) 15. Июня 2010 :: 16:17:
а если так
Пока ТаблИтогов Получить()=1 Цикл
 Партия = ТаблИтогов.Партия;
 ТаблИтогов.Док = Партия .ПриходныйДокумент;
КонецЦикла;

если мне склероз не изменяет, не рекомендуется в 1С использовать обращение через несколько точек. По-идее, если Партия - это объект(элемент справочника), то 1С незачем лезть в БД еще раз для получения значения реквизита этого объекта.


делал так,
тогда   ТаблИтогов.Док = Партия .ПриходныйДокумент; выполняется по времени также, + немного отъедает Партия = ТаблИтогов.Партия;
  
Наверх
www  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #7 - 15. Июня 2010 :: 16:28
Печать  
понятно, значит за самим объектом ПриходныйДокумент 1С все-таки лезет в базу, тогда единственный вариант оптимизации получать ПриходныйДокумент в запросе. Если переделать на прямой запрос в цикле, все-равно будет выполняться запрос для каждой итерации. Это тоже самое, что и сейчас происходит
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #8 - 15. Июня 2010 :: 16:35
Печать  
Спасибо, и все же.
Есть ли в 1CPP возможность получить нужное значение переданного поля, без построения запроса?
Типа НужноеЗначение = ОДБЦ.ПолучитьЗначение(Партия, "ПриходныйДокумент");
мне бы выиграть процентов 5-10, для начала, там по ходу буду править остальное.
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #9 - 15. Июня 2010 :: 16:48
Печать  
Если ты настаиваешь на своем варианте, то попробуй перед циклом подготовить запрос, который возвращает одно нужное значение, а в теле цикла делать ВыполнитьСкалярный. Но я сомневаюсь, что это будет быстрее текущего варианта.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #10 - 15. Июня 2010 :: 16:49
Печать  
есть, параметризированные запросы. Как ими пользоваться тут на форуме много инфы.
Но выигрыш по скорости врядли будет, т.к. тебе нужен объект, т.е. нужна типизация документа. А для типизации(получения агргетного объекта) 1с++ выполняет ту же хранимку, что и сама 1С exec sp_docByIddoc(не помню как она называется) или как-то так.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #11 - 15. Июня 2010 :: 16:52
Печать  
Или на крайняк получить все связки Партия-ПриходныйДокумент в ТЗ/ИТЗ и далее получать отсюда. Но я, как и все, остановился бы на переделке изначального запроса/получении данных
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #12 - 15. Июня 2010 :: 16:57
Печать  
JohnyDeath писал(а) 15. Июня 2010 :: 16:48:
Если ты настаиваешь на своем варианте, то попробуй перед циклом подготовить запрос, который возвращает одно нужное значение, а в теле цикла делать ВыполнитьСкалярный. Но я сомневаюсь, что это будет быстрее текущего варианта.


значений много и они для каждой партии свои
  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #13 - 15. Июня 2010 :: 17:01
Печать  
JohnyDeath писал(а) 15. Июня 2010 :: 16:52:
Или на крайняк получить все связки Партия-ПриходныйДокумент в ТЗ/ИТЗ и далее получать отсюда. Но я, как и все, остановился бы на переделке изначального запроса/получении данных


не знаю будет ли это помощью, но это, как я понимаю, стандартное проведение документа в комплексной.

Процедура ртий="",ТаблСписПартийКом="",ВремВыбПартии = "") Экспорт

там как бы даже запроса то нет.
Сначало ВыполнитьРасчетНА с фильтрами
потом ВремПартии.ВыгрузитьИтоги(ТаблИтогов,1,1);
ТаблИтогов.НоваяКолонка("ДокПартии", "Документ");
и дальше в цикле.

По сути, если 18% отъедает строка с заполненим в ТабИтогов, то все остальное время отъедает непосредственно ВыполнитьРасчетНА, а его переделать на прямые запросы, ну прям никак не смогу, надо еще учиться и учиться.
  
Наверх
www  
IP записан
 
Anatol
Senior Member
****
Отсутствует


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

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получение значений справочника через две, три, четыре точки
Ответ #14 - 15. Июня 2010 :: 18:32
Печать  
это и в ТиС есть...

так, теоретически:

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #15 - 15. Июня 2010 :: 19:02
Печать  
Anatol писал(а) 15. Июня 2010 :: 18:32:
это и
так, теоретически:

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


Зачем там 2 таблицы и левое соединение в ИТЗ ?
Проще всё сделать в 1 запросе..
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


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

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получение значений справочника через две, три, четыре точки
Ответ #16 - 15. Июня 2010 :: 19:27
Печать  
тогда уж проще всю процедуру глСписаниеПартийТМЦ переписать
имхо
  
Наверх
wwwICQ  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #17 - 15. Июня 2010 :: 19:41
Печать  
проще то оно как раз не проще Печаль
туда же все доки ходят на проведение.
И запроса как такового там нет, там РасчитатьРегистрыНА, и фильтры...

Вот если все это переписать, то конечно будет очень хорошо.

Как вариант, возможно ли такое?

1) Элемент ТаблИтоги.Партия уже известен и мы можем получить его ID - это верно?
2) Через запрос обращаемся к этому ID и получаем значение реквизита [ПриходныйДокумент] - это реально?
3) Преобразуем значение из (2) в элемент. - вроде у 1CPP есть такой метод?
4) может быть скидываем элемент в таблицу значений, чтобы потом если опять встретим эту партию не ходить в БД

сильно не пиннайте, но это может работать?  Ужас
  
Наверх
www  
IP записан
 
Anatol
Senior Member
****
Отсутствует


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

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получение значений справочника через две, три, четыре точки
Ответ #18 - 15. Июня 2010 :: 19:46
Печать  
Eprst писал(а) 15. Июня 2010 :: 19:02:
Зачем там 2 таблицы и левое соединение в ИТЗ ?
Проще всё сделать в 1 запросе..


тогда уж проще всю процедуру глСписаниеПартийТМЦ переписать
имхо

а вообще зависит от конкретного случая, базы, документа, метода списания

лично у меня вся процедура глСписаниеПартий занимает 5-10%
  
Наверх
wwwICQ  
IP записан
 
Anatol
Senior Member
****
Отсутствует


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

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получение значений справочника через две, три, четыре точки
Ответ #19 - 15. Июня 2010 :: 19:51
Печать  
MaxPiter писал(а) 15. Июня 2010 :: 19:41:
Как вариант, возможно ли такое?
сильно не пиннайте, но это может работать?  Ужас



конешно, смотря какого эффекта нужно добиться.  Подмигивание
  
Наверх
wwwICQ  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

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

сокращение времени выполнения строки с 18% до хотя бы ... 9%
Насколько я понимаю, 1С перед тем как получить ПриходныйДокумент, сначало делает
select * from sc... where [Партия=текПартия],
потом Получает реквизит ПриходныйДокумент и еще раз
select * from doc... where [Док=текДокИзПартии]
(запрос схематичный)
вот из-за * и теряем время, потому как кроме ID то ниче не надо. Или я гоню?
  
Наверх
www  
IP записан
 
Anatol
Senior Member
****
Отсутствует


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

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Получение значений справочника через две, три, четыре точки
Ответ #21 - 15. Июня 2010 :: 20:05
Печать  
MaxPiter писал(а) 15. Июня 2010 :: 20:00:
Anatol писал(а) 15. Июня 2010 :: 19:51:
конешно, смотря какого эффекта нужно добиться.  Подмигивание

сокращение времени выполнения строки с 18% до хотя бы ... 9%
Насколько я понимаю, 1С перед тем как получить ПриходныйДокумент, сначало делает
select * from sc... where [Партия=текПартия],
потом Получает реквизит ПриходныйДокумент и еще раз
select * from doc... where [Док=текДокИзПартии]
(запрос схематичный)
вот из-за * и теряем время, потому как кроме ID то ниче не надо. Или я гоню?


ты бы не зацикливался на этих трех строках...
бери выше
  
Наверх
wwwICQ  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #22 - 15. Июня 2010 :: 20:07
Печать  
выше тока звезды.
Там остается только ВыполнитьРасчетНа, а его я побороть не в состоянии пока...
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Получение значений справочника через две, три, четыре точки
Ответ #23 - 15. Июня 2010 :: 20:18
Печать  
Имхо.
Варианта два:
Первый, самый оптимальный - переделать весь алгоритм, избавившись от цикла и получая партия сразу с доком прихода сразу в запросе.
Второй - попроще - подготовить параметризированный запрос, выполняя его в цикле. Даже в этом случае будет реальное ускорение.
Ибо - значение в таблИтогов.Партия - первоначально - просто ссылка, те хранит только ид справочника.
Но - когда обращаешься к его реквизиту (в данном случае ПриходныйДокумент) - на уровне движка происходит вызов CValue::LinkContext, те ссылочное значение преобразуется в полноценный объект. В этот момент и происходит создание CBLContext, а затем запрос к БД на вытаскивание всех значений реквизитов, те тянуться все реквизиты, кроме периодических.
Делая параметризированный запрос, можно избежать всего этого процесса, те имея ссылку на партию, получить ссылку на документ.
В 8ке, насколько я знаю, это принципиальное разделение: между значением-ссылкой и объектом.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #24 - 16. Июня 2010 :: 08:48
Печать  
И "рассчитать регистры на" и все фильтры и получение приходного документа перепиши на 1 запрос.. и всё.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #25 - 16. Июня 2010 :: 08:52
Печать  
Eprst писал(а) 16. Июня 2010 :: 08:48:
И "рассчитать регистры на" и все фильтры и получение приходного документа перепиши на 1 запрос.. и всё.

дык это было бы просто идеальное решение Улыбка
но я же говорю, пока не в состоянии побороть все это скопом.

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получение значений справочника через две, три, четыре точки
Ответ #26 - 16. Июня 2010 :: 08:54
Печать  
Ну дык даже в FAQ есть пример получения того что тебе нужно в примерах.. подгоняй под свой запрос и всё.

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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Получение значений справочника через две, три, четыре точки
Ответ #27 - 16. Июня 2010 :: 08:56
Печать  
Eprst писал(а) 16. Июня 2010 :: 08:54:
Ну дык даже в FAQ есть пример получения того что тебе нужно в примерах.. подгоняй под свой запрос и всё.


можно ссылку?
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



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


I Love 1C++

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

В общем сделал так:

добавил

глЗаполнитьПриходныйДокументПартии(ТаблИтогов);

в ней

Процедура глЗаполнитьПриходныйДокументПартии(ТаблИтогов) Экспорт
     СписокПартий = СоздатьОбъект("СписокЗначений");
     ТЗТемп = СоздатьОбъект("ТаблицаЗначений");
     ТаблИтогов.Выгрузить(ТЗТемп,,,"Партия");
     ТЗТемп.Свернуть("Партия","");
     ТЗТемп.Выгрузить(СписокПартий);
     RS = СоздатьОбъект("ODBCRecordset");
     RS.УстБД1С();

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

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

     Пока ТаблИтогов.ПолучитьСтроку()=1 Цикл
           сСтр="";
           кКол="";
           знДок = ТЗЗапрос.НайтиЗначение(ТаблИтогов.Партия,сСтр,кКол);

           Если знДок=1 Тогда
                 ТаблИтогов.ДокПартии = ТЗЗапрос.ПолучитьЗначение(сСтр,"Ссылка");
           КонецЕсли;
     КонецЦикла;
КонецПроцедуры

Результат: Вместо 18% теперь 10% мелочь конечно, но работает, если прикинуть на 500 документов в день, то выглядит уже хорошо Улыбка

Еще быстрее можно?  Подмигивание

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

upd: 500 документов - только реализаций
  
Наверх
www  
IP записан
 
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] 
ОтправитьПечать