Помогите оптимизировать запрос для получения остатков и цен номенклатуры #685546


#0 by Boudybuilder
Всем доброго вечера! Работаю на рабочим столом менеджера по продажам. Есть поле "ДеревоНоменклатуры" ТипЗначения:СправочникСписок.Номенклатура , только группы. Оно служит для навигации. При активации строки выполняется запрос , и все элементы попадают в табличную часть , откуда я уже подбираю в заказ. Все бы хорошо , но запрос долго выполняется,  особенно первое выполнение запроса. Пока не закешируется. Вопрос в том , как бы тут его оптимизировать. Или как подскажете сделать по другому. Вот запрос: ВЫБРАТЬ РАЗРЕШЕННЫЕ     ИЗ         РегистрНакопления.ТоварыНаСкладах.Остатки(         РегистрНакопления.ТоварыВРознице.Остатки(         РегистрНакопления.ТоварыВНТТ.Остатки(
#1 by Boudybuilder
Да , и упорядовачивание почему то игнорируется...
#2 by Armando
Во первых, соединение со срезом последних узкое место.
#3 by Armando
Номенклатура.Родитель = &Родитель ИЛИ Номенклатура.Родитель.Родитель = &Родитель тоже не очень
#4 by Boudybuilder
Срез последних в ВТ загонять и так соединять?
#5 by Armando
Срезы по курсам и ценам можно выполнить один раз при открытии формы, поместить во временную таблицу. И каждый раз брать уже оттуда
#6 by Boudybuilder
А тут тогда как быть? Надо же по родителю отбирать...
#7 by Boudybuilder
О! ) Думаю хорошо будет.
#8 by Armando
у тебя выполняется 3 раза. Можно отдельным пакетом выбрать номенклатуру, поместить в ВТ и в параметрах виртуальной таблицы прописывать условие по номенклатуре из этой ВТ
#9 by Armando
воткни флаг автоупорядочивание
#10 by Boudybuilder
Я думал что лучше сразу отбор делать в ВиртуальнойТаблице чем получать данные по всем трем запросам , и их уже отбирать.
#11 by Boudybuilder
Ну вот... Вынес условие , и запрос дольше выполняется
#12 by romansun
имхо трижды Родители вот эти через стопятьсот точек в параметрах виртуальной таблицы сводят скуль с ума отбери нужную тебе номенклатуру один раз в ВТ... как в посоветовали, да. Должно помочь, ибо в остальном каких-то прям явно видимых косяков вроде нет. Ну, курсы еще, да
#13 by romansun
)))) вынеси всё номенклатуру в ВТ и запускай запросы по одному, два остальных заремарь. Отследи какой запрос больше всего затыкается.
#14 by Armando
не, что-то типа такого должно получиться: где .... ; выбрать * из РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура в (выбрать Ссылка из ВТ_Номенклатура))
#15 by romansun
+ если есть где в условиях джоинов многотиповые поля - их надо типизировать принудительно к нужному типу обязательно "ХарактеристикаНоменклатуры" не такое? Я просто хз, что там, да как..
#16 by Armando
думаю в данном случае нет смысла, т.к. нет получения полей через точку.
#17 by Boudybuilder
Это как ? Можно пример?
#18 by Armando
см
#19 by ViSo76
За таки запросы можно сразу расстреливать на месте без суда и следствия :)
#20 by Boudybuilder
Это значительно помогло. Немного изменилась суть результата , но это не так важно...
#21 by Boudybuilder
Это еще что , я новичком запросы в циклах делал )))
#22 by Boudybuilder
Стреляй! Не промахнешься... )))
#23 by Armando
за флуд в тематической ветке тоже
#24 by ViSo76
Хорошо вопрос на засыпку кто скажет как будет выполнен данный кусок запроса? РегистрНакопления.ТоварыНаСкладах.Остатки(                 ,
#25 by Boudybuilder
Серьезные люди присоединились ;)
#26 by Armando
через 2 левых и что?
#27 by ViSo76
А будет вот что, в начале будут получены все ближайшие остатки + движения до последнего изменения, т.к. открытый период то и захватит к примеру приход через неделю, далее идёт не два соединения а 3 соединения с фильтрацией. Это не оптимально, было бы лучше получить остатки не для всех позиций, а только для необходимой номенклатуры, вот так ( пишу запрос в блакноте так что если будут ошибки поправьте ): ВЫБРАТЬ ИЗ         ИЗ         РегистрНакопления.ТоварыНаСкладах.Остатки( , Номенклатура В ( ВЫБРАТЬ Ссылка ИЗ тзСписокНоменклатурыДляФильтрации ) )     ИЗ         РегистрНакопления.ТоварыВРознице.Остатки( , Номенклатура В ( ВЫБРАТЬ Ссылка ИЗ тзСписокНоменклатурыДляФильтрации ) )          ИЗ         РегистрНакопления.ТоварыВНТТ.Остатки( , Номенклатура В ( ВЫБРАТЬ Ссылка ИЗ тзСписокНоменклатурыДляФильтрации ) ) Далее естественно срез последних так же идёт для всех номенклатур что тоже не является оптимальным... Вопрос на засыпку что нужно сделать далее?
#28 by Boudybuilder
Проверил свой запрос в УКЗ  на скорость и твой... Разницы никакой!!!!
#29 by Armando
>> А будет вот что, в начале будут получены все ближайшие остатки + движения до последнего изменения, т.к. открытый период то и захватит к примеру приход через неделю, далее идёт не два соединения а 3 соединения с фильтрацией Не так. Просто будут получены остатки на какую-то большую дату, типа 3999 год. И 2 соединения с Номенклатурой.
#30 by viktor_vv
А вот это "и все элементы попадают в табличную часть" табличная часть - это что ? Табличное поле с источником данных таблица значений? Лучше так сделать. Оставляешь дерево групп для навигации. Вешаешь на форму табличное поле с источником СправочникСписок. При активизации строки дерева накладываешь отбор на список по Ссылка с условием ВГруппе. А остатки и цены выгребаешь в ПриВыводеСтроки списка (простое условие по конкретной номенклатуре) или ПриПолученииДанных (немного сложнее условие по массиву ссылок, но проще чем твои через несколько точек).
#31 by viktor_vv
+ У тебя в группе может быть десяток тысяч позиций номенклатуры, нафига тебе тащить остатки и цены по ним всем при активации группы, да еще и с таким тяжелым условием в параметрах, если на экран влезет максимум 50-100, вот по ним и тащи.
#32 by Boudybuilder
РегистрНакопления.ТоварыНаСкладах.Остатки( ИЗ     РегистрНакопления.ТоварыВРознице.Остатки( ИЗ     РегистрНакопления.ТоварыВНТТ.Остатки(     РегистрСведений.ЦеныНоменклатуры.СрезПоследних( Работает в 100 раз быстрее , + 1С не зависает при его выполнении
#33 by Armando
Будет еще быстрее, если сделаешь Зачем здесь еще один срез, тем более без соединения: "ИЗ     ВТ_ОстаткиИЦены КАК ВТ_ОстаткиИЦены         ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК Курсы ВТ_ОстаткиИЦены.Цена * Курсы.Курс / Курсы.Кратность / КурсВалютыВзаиморасчетов.Курс * КурсВалютыВзаиморасчетов.Кратность КАК Цена,
#34 by Sammo
Я бы таки попробовал номенклатуру убрать из параметра виртуальной таблицы и сделать внутреннее с ВТ_ВГруппе Это скорее всего не первое измерение, размер выборки может быть большой.
#35 by Sammo
Цены тоже не через В а через соединение.
#36 by ViSo76
А ты проверил вместе с соединением срез последних? Конечно никакой разницы ты не почувствуешь, т.к. я только часть кода привёл. Получение цены разумеется нужно делать так: ВЫБРАТЬ     Цена ИЗ     РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦены И ХарактеристикаНоменклатуры В ( ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура ИЗ тзОстатки ) И ХарактеристикаНоменклатуры В ( ВЫБРАТЬ ХарактеристикаНоменклатуры ИЗ тзОстатки ) ) А то самое тормознутое оставил и радуется что не помогло... И мой запрос будет работать быстрее по тому что изначально номенклатуры может быть меньше и после получения остатков номенклатуры может ещё стать меньше и количество цен соответственно будет вычислено меньше... PS: Остальную часть запроса я предлагал написать вам...
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С