Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 16:53

Объединить 2 запроса в один

Автор efimovvasya, 01 авг 2012, 10:52

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

efimovvasya

Первым запросом отбираю строки из регистра накопления по нужной мне комплектовке, а вторым запросом для каждой строки в другом регистре ищу остаток на складе. Т.е. параметрами второго запроса являются данные первого (Номенклатура и ХарактеристикаНоменклатуры). Вывожу это в отчет.
Разумеется, все это работает очень медленно. Подскажите, пожалуйста, как эти 2 запроса объединить в один?

Запрос = Новый запрос("ВЫБРАТЬ
| еф_ОстаткиПоКомплектовкамОстаткиИОбороты.Номенклатура КАК Номенклатура,
| еф_ОстаткиПоКомплектовкамОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| еф_ОстаткиПоКомплектовкамОстаткиИОбороты.КоличествоПриход,
| еф_ОстаткиПоКомплектовкамОстаткиИОбороты.КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.еф_ОстаткиПоКомплектовкам.ОстаткиИОбороты КАК еф_ОстаткиПоКомплектовкамОстаткиИОбороты
|ГДЕ
| еф_ОстаткиПоКомплектовкамОстаткиИОбороты.Комплектовка = &Комплектовка");
Запрос.УстановитьПараметр("Комплектовка", Комплектовка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий Цикл
ОблСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
ОблСтрока.Параметры.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры;
ОблСтрока.Параметры.Приход = Выборка.КоличествоПриход;
ОблСтрока.Параметры.Остаток = Выборка.КоличествоКонечныйОстаток;

ЗапросСГП = Новый запрос("ВЫБРАТЬ
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК НаСГП
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Склад = &Склад
| И ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура
| И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры");
Запрос.УстановитьПараметр("Склад", СкладСГП);
Запрос.УстановитьПараметр("Номенклатура", Выборка.Номенклатура);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", Выборка.ХарактеристикаНоменклатуры);
ВыборкаСГП = ЗапросСГП.Выполнить().Выбрать();
Пока ВыборкаСГП.Следующий() Цикл
ОблСтрока.Параметры.НаСГП = ВыборкаСГП.НаСГП;
КонецЦикла;
КонецЦикла;

has

1. Использовать параметры виртуальных таблиц, а не условие ГДЕ
2. Первый запрос поместить во временную таблицу, потом соединить со вторым запросом

ЗапросСГП = Новый запрос("ВЫБРАТЬ
|    ТоварыНаСкладахОстатки.КоличествоОстаток КАК НаСГП
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(&ТутДатаОСтатков, Склад = &Склад И Номенклатура = &Номенклатура И ХарактеристикаНоменклатуры  = &ХарактеристикаНоменклатуры ) КАК ТоварыНаСкладахОстатки");

Почти также и с первым запросом.

Klyacksa

Ой-ой!!! Это у нас что там? ЗАПРОС В ЦИКЛЕ???
Уберите, уберите немедленно и никому больше не показывайте!!!

По делу:
1. Действительно, как сказал has, первый запрос помещаем во временную таблицу (закладка "Дополнительно")
2. Далее на закладке "Пакет запросов" добавляем новый запрос: берем временную таблицу (из п.1), к ней левым соединением второй ваш запрос. И если хотите отбирать во втором запросе только записи, относящиеся к первому, для ускорения работы рекомендую в виртуальные параметры таблицы добавить еще такое условие:


"ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(&ТутДействительноДатаОстатков,
|    Склад=&Склад И (Номенклатура, ХарактеристикаНоменклатуры) В
|    (ВЫБРАТЬ
|     ИмяВременнойТаблицы.Номенклатура,
|     ИмяВременнойТаблицы.ХарактеристикаНоменклатуры,
|     ИЗ
|     ИмяВременнойТаблицы КАК ИмяВременнойТаблицы)) КАК ТоварыНаСкладахОстатки"


Кстати, а почему в первом запросе нет отбора по складу? Там нет детализации по складу?
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

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

Рейтинг@Mail.ru

Поиск