Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
03 июл 2022, 21:40

Помогите оптимизировать запрос

Автор Dima Dddd, 16 ноя 2017, 13:53

0 Пользователей и 1 гость просматривают эту тему.

Dima Dddd


ВЫБРАТЬ
табЧасть1.Ссылка как Ссылка,
табЧасть1.Товар как товар,
Поместить ВТ
ИЗ
Документ.Таблица1.ТабЧасть как табЧасть1
ГДЕ табЧасть1.Товар <> &ПустойОбъект

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
табЧасть2.Ссылка,
табЧасть2.Товар,
ИЗ
Документ.Таблица2.ТабЧасть как табЧасть2
ГДЕ табЧасть2.Товар<> &ПустойОбъект
;
////////////////////////////
ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
{ГДЕ
(Релиз.Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
(Релиз.Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}


Помогите оптимизровать данный код(написан примера ради), 1) не пойму как в первой и второй таблицах ограничить выборку, а то у меня выходит что я выбираю вообще все данные а в самом конце накладываю фильтр по дате. 2) Документ.Таблица3.ГлавныйДокумент имеет составной тип данных (множество ссылок на разные документы) мне нужны только ДокументСсылка.Приходная и ДокументСсылка.Расходная, как это можно реализовать с помощью функции ВЫРАЗИТЬ()?

Sy4a

Цитата: Dima Dddd от 16 ноя 2017, 13:53

ВЫБРАТЬ
табЧасть1.Ссылка как Ссылка,
табЧасть1.Товар как товар,
Поместить ВТ
ИЗ
Документ.Таблица1.ТабЧасть как табЧасть1
ГДЕ табЧасть1.Товар <> &ПустойОбъект

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
табЧасть2.Ссылка,
табЧасть2.Товар,
ИЗ
Документ.Таблица2.ТабЧасть как табЧасть2
ГДЕ табЧасть2.Товар<> &ПустойОбъект
;
////////////////////////////
ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
{ГДЕ
(Релиз.Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
(Релиз.Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}


Помогите оптимизровать данный код(написан примера ради), 1) не пойму как в первой и второй таблицах ограничить выборку, а то у меня выходит что я выбираю вообще все данные а в самом конце накладываю фильтр по дате. 2) Документ.Таблица3.ГлавныйДокумент имеет составной тип данных (множество ссылок на разные документы) мне нужны только ДокументСсылка.Приходная и ДокументСсылка.Расходная, как это можно реализовать с помощью функции ВЫРАЗИТЬ()?
1. добавь в "где" нужные условия через "и"" или "или"
2. где ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Приходная") или  ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Расходная") . Только самое главное не пиши как это я сейчас сделал через или а сделай объединить всё как у тебя в первом пакете запроса, т.е. Просто где в одном запросе по 1 типу потом 2 такойже запрос по 2 типу, Использовать или в одном запросе по одному полю приведет к тому что запрос будет долго работать.
Совсем не понял этот кусок:
{ГДЕ
(Релиз.Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
(Релиз.Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

Что за таблица "Релиз" , не вижу у тебя таковой в запросе.

Dima Dddd

Sy4a, Что-то вроде этого?

ВЫБРАТЬ
табЧасть1.Ссылка как Ссылка,
табЧасть1.Товар как товар,
Поместить ВТ
ИЗ
Документ.Таблица1.ТабЧасть как табЧасть1
ГДЕ табЧасть1.Товар <> &ПустойОбъект

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
табЧасть2.Ссылка,
табЧасть2.Товар,
ИЗ
Документ.Таблица2.ТабЧасть как табЧасть2
ГДЕ табЧасть2.Товар<> &ПустойОбъект
;
////////////////////////////
ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
ВЫРАЗИТЬ(Документ.Таблица3.ГлавныйДокумент как Документ.Расходная) =  ВТ.Ссылка
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
ВЫРАЗИТЬ(Документ.Таблица3.ГлавныйДокумент как Документ.Приходная) =  ВТ.Ссылка
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

Sy4a

А зачем тебе выразить? лично я хз как она работает :) я имел ввиду:
ВЫБРАТЬ
табЧасть1.Ссылка как Ссылка,
табЧасть1.Товар как товар,
Поместить ВТ
ИЗ
Документ.Таблица1.ТабЧасть как табЧасть1
ГДЕ табЧасть1.Товар <> &ПустойОбъект

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
табЧасть2.Ссылка,
табЧасть2.Товар,
ИЗ
Документ.Таблица2.ТабЧасть как табЧасть2
ГДЕ табЧасть2.Товар<> &ПустойОбъект
;
////////////////////////////
ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
Где ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Приходная")
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
Где ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Расходная")
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}


Добавлено: 16 ноя 2017, 16:55


ВЫБРАТЬ
табЧасть1.Ссылка как Ссылка,
табЧасть1.Товар как товар,
Поместить ВТ
ИЗ
Документ.Таблица1.ТабЧасть как табЧасть1
ГДЕ табЧасть1.Товар <> &ПустойОбъект
{ГДЕ
    (Таблица1 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) и
    (Таблица1 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
табЧасть2.Ссылка,
табЧасть2.Товар,
ИЗ
Документ.Таблица2.ТабЧасть как табЧасть2
ГДЕ табЧасть2.Товар<> &ПустойОбъект
{ГДЕ
    (Таблица2 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) и
    (Таблица2 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}
;
////////////////////////////
ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
Где ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Приходная")
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) и
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ВТ.Ссылка,
ВТ.Товар
Из ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Таблица3 как Таблица3
ПО
Документ.Таблица3.ГлавныйДокумент =  ВТ.Ссылка
Где ТИПЗНАЧЕНИЯ(Таблица3.ссылка)=ТИП("ДокументСсылка.Расходная")
{ГДЕ
    (Таблица3 .Дата >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) и
    (Таблица3 .Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ))}

Вот так имел ввиду или что то типо того.

Dima Dddd

Sy4a, Про ВЫРАЗИТЬ просто вычитал где-то что используют эту функцию для составных типов

LexaK

попробуйте такой запрос проанализировать, гораздо меньше вашего, делает все тоже самое что и ваш запрос
если есть возможность потестите его

ВЫБРАТЬ
Таблица3.Ссылка,
Таблица3.Дата,
Таблица3.ГлавныйДокумент,
ЕстьNull(табЧасть1.Ссылка,табЧасть2.Ссылка) как СсылкаТЧ,
ЕстьNull(табЧасть1.Товар,табЧасть2.Товар) как Товар
Из
Документ.Таблица3 как Таблица3
левое соединение Документ.Таблица1.ТабЧасть как табЧасть1
по Таблица3.ГлавныйДокумент = табЧасть1.Ссылка
левое соединение Документ.Таблица2.ТабЧасть как табЧасть2
по Таблица3.ГлавныйДокумент = табЧасть2.Ссылка
ГДЕ
   Таблица3.Дата  между НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) и КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ) //общий отбор по дате
и  ЕстьNull(табЧасть1.Товар.Код,табЧасть2.Товар.Код) есть Не Null //для отбора непустых товаров

если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск