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

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

Автор skillful, 24 янв 2024, 08:28

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

skillful

Всем здравствуйте. Необходимо сгруппировать два объединяемых запроса по коду и товару в самом запросе, чтобы уменьшить количество строк ибо результат запроса выполняется довольно таки долго т .к. это КОМ соединение. Важно уменьшить время выполнения результата. Например:

Код     товар    Остаток   Себест.    Продано
0001    Чайник   2         500        0
0001    Чайник   0         0          1
0001    Чайник   0         0          1

На выходе

Код     товар    Остаток   Себест.    Продано
0001    Чайник   2         500        2

Запрос = Соединение.NewObject("Запрос");

Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровОстатки.Товар.Код КАК ТоварКод,
| ОстаткиТоваровОстатки.Товар.Наименование КАК ТоварНаименование,
| ОстаткиТоваровОстатки.ОстатокОстаток КАК Остаток,
| ВЫРАЗИТЬ(СебестоимостьПрихода.Себестоимость / СебестоимостьПрихода.Количество КАК ЧИСЛО(10, 2)) КАК Себестоимость,
|   0 КАК Продано
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК ОстаткиТоваровОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость КАК СебестоимостьПрихода
| ПО ОстаткиТоваровОстатки.Товар = СебестоимостьПрихода.Товар
| И (СебестоимостьПрихода.Период В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| МАКСИМУМ(ЦенаСебестоимости.Период)
| ИЗ
| РегистрНакопления.Себестоимость КАК ЦенаСебестоимости
| ГДЕ
| ЦенаСебестоимости.Товар = ОстаткиТоваровОстатки.Товар
| И ЦенаСебестоимости.Регистратор ССЫЛКА Документ.ПриходнаяНакладная))
|ГДЕ
| ОстаткиТоваровОстатки.ВладелецРезерва = НЕОПРЕДЕЛЕНО
| И ОстаткиТоваровОстатки.Товар.Код В (&ТоварКод)
|   И ОстаткиТоваровОстатки.Склад = &Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ПродажиОбороты.Товар.Код КАК ТоварКод,
| ПродажиОбороты.Товар.Наименование КАК ТоварНаименование,
| 0 КАК Остаток,
| 0 КАК Себестоимость,
|   СУММА(ПродажиОбороты.КоличествоОборот) КАК Продано
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
|ГДЕ
| ПродажиОбороты.Продажа.Дата МЕЖДУ &Д1 И &Д2
| И ПродажиОбороты.Товар.ВидТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)
| И ПродажиОбороты.Товар.Код В (&ТоварКод)
|
|СГРУППИРОВАТЬ ПО
| ПродажиОбороты.Товар.Код,
| ПродажиОбороты.Товар.Наименование";


Запрос.УстановитьПараметр("ТоварКод", МассивКодовКОМ_);
Запрос.УстановитьПараметр("Склад", Соединение.Справочники.МестаХранения.НайтиПоНаименованию(СтрокаБД.ОсновнойСклад));
Запрос22.УстановитьПараметр("Д1", НачалоДня(НачалоПродаж));
Запрос22.УстановитьПараметр("Д2", ТекущаяДата());

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ВсяТЗ.Добавить(), Выборка);

КонецЦикла;

Сам запрос рабочий (без ошибок)

Afinogen

вместо  вложенных запросов используйте виртуальные таблицы,  условие к регистру остстаки товаров не в  "ГДЕ"  а в параметр виртуальной таблицы загоняйте



antoneus

При объединении запросов данные и не группируются. Помещайте все во временную таблицу, потому делайте выборку из нее и группируйте.

skillful

Цитата: Afinogen от 24 янв 2024, 09:13вместо  вложенных запросов используйте виртуальные таблицы,  условие к регистру остстаки товаров не в  "ГДЕ"  а в параметр виртуальной таблицы загоняйте

Чтобы "ГДЕ" вообще не было? Это относится только к виртуальным таблицам или ко всем?
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &Д1,
            &Д2,
            ,
            Товар.Код В (&ТоварКод)
                И Товар.ВидТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)) КАК ПродажиОбороты

Afinogen


skillful


Теги:

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

Рейтинг@Mail.ru

Поиск