Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Получение значений справочника через две, три, четыре точки (число прочтений - 10910 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать