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