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

1C 8.3. Как правильно сделать левое соединение для этих 2 запросов?

Автор gulnyr, 28 фев 2023, 01:07

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

gulnyr

Запрос №1:

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

|     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК УчетНоменклатурыОстатки
|     ПО УчетНоменклатурыОстатки.Номенклатура = ДокПеремещениеТоваровВПроизводство.Номенклатура

|     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровКомпании КАК РегистрНакопленияПартииТоваров
|     ПО РегистрНакопленияПартииТоваров.Номенклатура = ДокПеремещениеТоваровВПроизводство.Номенклатура

|ГДЕ ДокПеремещениеТоваровВПроизводство.Ссылка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоДаты) И КОНЕЦПЕРИОДА(&КонецДаты) И

|РегистрНакопленияПартииТоваров.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоДаты) И КОНЕЦПЕРИОДА(&КонецДаты)

|СГРУППИРОВАТЬ ПО ДокПеремещениеТоваровВПроизводство.Номенклатура";

Запрос.УстановитьПараметр("НачалоДаты",ДатаНачала);
Запрос.УстановитьПараметр("КонецДаты",ДатаОкончания);



ТаблицаОтчета = Запрос.Выполнить().Выбрать();

Пока ТаблицаОтчета.Следующий() Цикл

Сообщить(ТаблицаОтчета.Номенклатура);

КонецЦикла;


   
Запрос №2:   

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


Запрос.УстановитьПараметр("Номенклатура",Справочники.Номенклатура.НайтиПоНаименованию("Фольга горячего тисения"));
Запрос.УстановитьПараметр("НачПериода", ДобавитьМесяц(ТекущаяДата(), -24) );
Запрос.УстановитьПараметр("КонецПериода",ТекущаяДата());

ТаблицаОтчета = Запрос.Выполнить().Выбрать();

Пока ТаблицаОтчета.Следующий() Цикл
Сообщить(ТаблицаОтчета.КоличествоРасход/2);
КонецЦикла;

Как правильно сделать левое соединение для этих 2 запросов?

Максим75

gulnyr, не совсем понятно с вопросом.
но что сразу видно по запросам - в виртуальных таблицах (обороты, остатки, остатки и обороты) сама 1С рекомендует сразу делать расчет по периодам, нужным измерениям и т.д.
в первом запросе вот это убираем
РегистрНакопленияПартииТоваров.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоДаты) И КОНЕЦПЕРИОДА(&КонецДаты)
и запихиваем сразу в виртуальную таблицу РегистрНакопления.ПартииТоваровКомпании, тогда система сама выгребет все в регистре за этот период и сгруппирует по измерениям.а в том виде как сейчас вот сколько есть записей в регистре за период по каждой номенклатуре, столько строк и добавит, поэтому в запросе еще группировать надо.
по РегистрНакопления.ОстаткиТоваровКомпании.Остатки тоже надо задать на какой период рассчитать остатки.

по второму сюда РегистрНакопления.ПартииТоваровКомпании.ОстаткиИОбороты(&НачПериода,&КонецПериода) сразу запихивать надо отбор по номенклатуре.

Теги:

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

Рейтинг@Mail.ru

Поиск