Имя: Пароль:
1C
1С v8
Запрос, левое соединение.
0 Zombi
 
21.07.11
09:33
В конфигурации УТ 10.3 пишу такой запрос:

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

Если выбрать просто расход(без второй таблицы), результат запроса - 90 строк. Если делаю так как выше, результат - 60 строк. В запрос не попадают строки, для которых нет остатка. Но ведь "ЛЕВОЕ СОЕДИНЕНИЕ" должно выбирать первую таблицу полностью, а из второй брать что есть? ЧЯДНТ?
1 Defender aka LINN
 
21.07.11
09:34
(0) У тебя внутреннее соединение
2 Defender aka LINN
 
21.07.11
09:34
+(1) И вообще, за такие запросы ногами бьют.
3 Ненавижу 1С
 
гуру
21.07.11
09:35
ВЫБРАТЬ
   ТоварыНаСкладахОбороты.Номенклатура,
   ТоварыНаСкладахОбороты.Склад,
   ТоварыНаСкладахОбороты.КоличествоРасход,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Обороты(&НачаДата, &КонДата) КАК ТоварыНаСкладахОбороты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонДата) КАК ТоварыНаСкладахОстатки
       ПО ТоварыНаСкладахОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
И ТоварыНаСкладахОбороты.Склад= ТоварыНаСкладахОстатки.Склад
ГДЕ
   ТоварыНаСкладахОбороты.Склад = &склад
4 vicof
 
21.07.11
09:35
(0) а остаткиИобороты не предлагать?
5 Jstunner
 
21.07.11
09:37
(3) зачем бяку советуешь?
6 Ненавижу 1С
 
гуру
21.07.11
09:38
(5) я такой ))
7 Zombi
 
21.07.11
09:40
Ну так как в (3) работает. А как правильнее этот запрос написать?
8 Ненавижу 1С
 
гуру
21.07.11
09:41
(7) правильно передавть условия в параметрах виртуальных таблиц и подмать над использованием таблицы ОстаткиИОбороты вместо двух этих
9 Jstunner
 
21.07.11
09:41
(7) используй (4), условие в параметры виртуальной таблицы
10 Zombi
 
21.07.11
09:42
(4) ОстаткиИОбороты не прокатят, так как данные нужно будет выбирать еще с периодичностью "регистратор", а остатки нужны будут на конечную дату.
11 Jstunner
 
21.07.11
09:43
(10) открой для себя СП
12 Zombi
 
21.07.11
09:43
Запрос как доделаю, выложу.
13 Defender aka LINN
 
21.07.11
09:47
(10) Прямо любопытно, как ты будешь жить с тем, что у тебя количество в итогах умножится на количество строк с регистраторами.
14 СвинТуз
 
21.07.11
09:48
(3)
такое можно только от ненависти написать )
большой ненависти
15 Zombi
 
21.07.11
09:55
Сейчас все работает, вот полный код:

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

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

   Результат = Запрос.Выполнить();
                         
   Секция = Макет.ПолучитьОбласть("R3C2:R4C2");
   ТабОтчет.Вывести(Секция);
   Секция = Макет.ПолучитьОбласть("R3C3:R4C4");
   
   ВыборкаШапка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Склад","Все");
   Пока ВыборкаШапка.Следующий() цикл
       Секция.Параметры.НаимСклада = ВыборкаШапка.Склад.Наименование;
       ТабОтчет.Присоединить(Секция);
   КонецЦикла;
                         
   Секция = Макет.ПолучитьОбласть("R3C5:R4C6");
   ТабОтчет.Присоединить(Секция);
                         
   ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура","Все");
   Пока ВыборкаНоменклатура.Следующий() Цикл
       Секция = Макет.ПолучитьОбласть("R5C2:R5C2");
       Секция.Параметры.Номенклатура = ВыборкаНоменклатура.Номенклатура;
       Секция.Область().Расшифровка = ВыборкаНоменклатура.Номенклатура;
       Если ВыборкаНоменклатура.Период > КонДата - 86400 * 7 Тогда
           Фон = WebЦвета.СветлоЗеленый;
       ИначеЕсли (ВыборкаНоменклатура.Период > КонДата - 86400 * 14) И (ВыборкаНоменклатура.Период < КонДата - 86400 * 7) Тогда
           Фон = WebЦвета.СветлоЖелтый;
       ИначеЕсли ВыборкаНоменклатура.Период < КонДата - 86400 * 14 Тогда
           Фон = WebЦвета.Розовый;
       КонецЕсли;
       Секция.Область().ЦветФона = Фон;
       ТабОтчет.Вывести(Секция);
       
       РасходВсего = 0;
       Заказывать = 0;
       ВыборкаСклад = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Склад","Все");
       Пока ВыборкаСклад.Следующий() Цикл
           Секция = Макет.ПолучитьОбласть("R5C3:R5C4");
           Секция.Параметры.Расход = ВыборкаСклад.КоличествоРасход;
           Секция.Параметры.КонОстаток = ВыборкаСклад.КоличествоОстаток;
           Секция.Область().Расшифровка = ВыборкаСклад.Номенклатура;
           Секция.Область().ЦветФона = Фон;
           ТабОтчет.Присоединить(Секция);
           Если (ВыборкаСклад.КоличествоРасход <> Null) И (ВыборкаСклад.КоличествоОстаток <> Null) Тогда
               РасходВсего = РасходВсего + ВыборкаСклад.КоличествоРасход;
               Если ВыборкаСклад.Номенклатура.БазоваяЕдиницаИзмерения.Наименование = "т.шт." Тогда
                   Если ВыборкаСклад.КоличествоОстаток <= 0.001 Тогда
                       Заказывать = 1;
                   КонецЕсли;
               Иначе
                   Если ВыборкаСклад.КоличествоОстаток <= 1 Тогда
                       Заказывать = 1;
                   КонецЕсли
               КонецЕсли;
           КонецЕсли;
       КонецЦикла; // Пока
       
       Если Заказывать = 1 Тогда
           НоваяСтрокаПеремещение = КПеремещению.Добавить();
           НоваяСтрокаПеремещение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
           НоваяСтрокаПеремещение.Продано = РасходВсего;
           НоваяСтрокаПеремещение.Перемещать = РасходВсего;
       КонецЕсли;
       
       Секция = Макет.ПолучитьОбласть("R5C5:R5C6");
       Секция.Параметры.ОстатокОтрпав = ВыборкаНоменклатура.КоличествоОстатокОтправ;
       Секция.Параметры.КПеремещению = ?(Заказывать = 1,РасходВсего,0);
       Секция.Область().Расшифровка = ВыборкаНоменклатура.Номенклатура;
       Секция.Область().ЦветФона = Фон;
       ТабОтчет.Присоединить(Секция);
       
   КонецЦикла; // Пока
   
   ТабОтчет.ТолькоПросмотр = Истина;
   ТабОтчет.ФиксацияСверху = 2;
                         
КонецПроцедуры


Если подскажите что можно оптимизировать, буду признателен :)
16 Jstunner
 
21.07.11
10:05
кошмар
17 Шапокляк
 
21.07.11
10:11
(15) А вас устраивает, что в отчете не будет остатков тех товаров, по которым оборотов не было?
18 Шапокляк
 
21.07.11
10:18
+(17) И вообще, зачем периодичность Регистратор, если дальше информация о регистраторах не используется? Что все-таки мешает использовать ОстаткиИОбороты?
19 Zombi
 
21.07.11
10:22
(17) Да, это как бы отчет по расходам.
(18) В отчете используется дата последнего расхода.
20 Zombi
 
21.07.11
11:01
(16) Как бы ты написал этот отчет?(в общих чертах).