![]() |
|
Запрос к табличной части с предварительным отбором документов | ☑ | ||
---|---|---|---|---|
0
fserg84
22.12.15
✎
05:29
|
Доброе время суток. Казалось бы простая задача – нужно выбрать различные из табличной части документа реализаций. Но если действовать в лоб, заходя со стороны ТЧ, то получаем, что запрос за месяц выполняется секунд 40 (в базе около 28 тысяч реализаций в среднем по 15 строк в каждой)
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Рецептура.Ссылка КАК Ссылка, | РеализацияТоваровУслугТовары.Рецептура.Номенклатура.Ссылка КАК НоменклатураРецептуры |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА | И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец | И ВЫБОР | КОГДА &Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) | ТОГДА РеализацияТоваровУслугТовары.Ссылка.Склад В ИЕРАРХИИ (&Склад) | ИНАЧЕ РеализацияТоваровУслугТовары.Ссылка.Склад = &Склад | КОНЕЦ | И НЕ РеализацияТоваровУслугТовары.Рецептура = ЗНАЧЕНИЕ(Документ.ОбщепитРецептура.ПустаяСсылка)"; Подумалось, что неплохо бы сперва отобрать реализации по условию, а потом уже выбирать только из их ТЧ. Но вот с реализацией этой идеи случилась запарка :) Сделал так (время сократилось до 2-3 секунд): Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка КАК Реализация, | РеализацияТоваровУслуг.Товары.(Рецептура.Ссылка) КАК Рецептура |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Дата МЕЖДУ &Начало И &Конец | И РеализацияТоваровУслуг.Проведен = ИСТИНА | И ВЫБОР | КОГДА &Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) | ТОГДА РеализацияТоваровУслуг.Склад В ИЕРАРХИИ (&Склад) | ИНАЧЕ РеализацияТоваровУслуг.Склад = &Склад | КОНЕЦ"; Запрос.Параметры.Вставить("Начало", Начало); Запрос.Параметры.Вставить("Конец", Конец); Запрос.Параметры.Вставить("Склад", Склад); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); Рецептуры = Новый ТаблицаЗначений; Рецептуры.Колонки.Добавить("Ссылка"); Рецептуры.Колонки.Добавить("НоменклатураРецептуры"); Для каждого ТЧ Из РезультатЗапроса Цикл Для каждого стр Из ТЧ.Рецептура Цикл Если ЗначениеЗаполнено(стр.РецептураСсылка) Тогда СтрокаТаб = Рецептуры.Добавить(); СтрокаТаб.Ссылка = стр.РецептураСсылка; СтрокаТаб.НоменклатураРецептуры = стр.РецептураСсылка.Номенклатура; КонецЕсли КонецЦикла; КонецЦикла; Рецептуры.Свернуть("Ссылка"); Но не покидает мысль, что это можно как-то сделать более красиво, используя только запросы... |
|||
1
Лодырь
22.12.15
✎
05:39
|
Мдя.. Слова вложенный запрос, пакетный запрос вам чтото говорят?
|
|||
2
fserg84
22.12.15
✎
05:45
|
(1) вложенный запрос с соединением также выполняется долго, пробовал через временные таблицы. запрос либо возвращает список тч, либо ругается что нельзя использовать вложенные таблицы.. поэтому и прошу пример :)
|
|||
3
Лодырь
22.12.15
✎
05:52
|
У тебя нужно добавлять еще кучу связей, судя по коду.
Похоже, что есть некая сущность рецептура с табличной частью содержащей номенклатуру. И ссылка на рецептуру есть в табличной части реализации. Верно? |
|||
4
fserg84
22.12.15
✎
05:59
|
(3) Рецептура это документ, она находится в ТЧ реализаций. номенклатура тут - это номенклатура из шапки документа рецептуры, она одна в каждой рецептуре. можно и без нее, главное получить ссылки самих рецептур :)
|
|||
5
Лодырь
22.12.15
✎
07:02
|
(4)
Ну используй что-нибудь в стиле: ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка ПОМЕСТИТЬ ТабРеализаций ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Дата МЕЖДУ &начало И &конец И РеализацияТоваровУслуг.Проведен И ВЫБОР КОГДА &Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА РеализацияТоваровУслуг.Склад В ИЕРАРХИИ (&Склад) ИНАЧЕ РеализацияТоваровУслуг.Склад = &Склад КОНЕЦ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РеализацияТоваровУслугТовары.Рецептура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка В (ВЫБРАТЬ Т.Ссылка ИЗ ТабРеализаций КАК Т) |
|||
6
fserg84
22.12.15
✎
07:10
|
(5) Воот
РеализацияТоваровУслугТовары.Ссылка В (ВЫБРАТЬ Т.Ссылка ИЗ ТабРеализаций КАК Т) Вот в этом и была моя проблема. Большое спасибо! :) |
|||
7
patapum
22.12.15
✎
07:22
|
(0) за "РТУТовары.Рецептура.Ссылка" здесь обычно предлагают прострелить коленку. достаточно РТУТовары.Рецептура и РТУТовары.Рецептура.Номенклатура
|
|||
8
Лодырь
22.12.15
✎
07:47
|
(7) Там еще есть
РеализацияТоваровУслуг.Проведен = ИСТИНА и РеализацияТоваровУслугТовары.Ссылка.Склад В ИЕРАРХИИ (&Склад) что характерно последнее при &Склад равным пустой ссылке |
|||
9
fserg84
22.12.15
✎
07:55
|
условие на склад использовал дабы лишний раз не использовать "В ИЕРАРХИИ", а только тогда когда надо сделать выборку по всем складам.
по остальному принял к сведению ) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |