Имя: Пароль:
1C
1С v8
Запрос к табличной части с предварительным отбором документов
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
условие на склад использовал дабы лишний раз не использовать "В ИЕРАРХИИ", а только тогда когда надо сделать выборку по всем складам.
по остальному принял к сведению )
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.