Имя: Пароль:
1C
1С v8
Помогите доработать запрос
0 dmitn
 
13.02.20
15:50

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


чтобы не было этого дополнительного условия, чтобы условие было в самом запросе.
1 unbred
 
13.02.20
15:51
зачем?
2 shuhard
 
13.02.20
15:53
(0) дык &Склад=Значение(Справочник.Склады.Пустаяссылка) ИЛИ ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
3 dmitn
 
13.02.20
15:53
(1) чтобы не разрывать запрос
4 IOANNscrp
 
13.02.20
15:56
(0) РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , ,&Склад =Значение(Справочник.Склады.Пустаяссылка) или Склад = &Склад ) КАК ТоварыНаСкладахОстаткиИОбороты";
5 unenu
 
13.02.20
15:58
ГДЕ
ВЫБОР КОГДА &НетОтбораПоСкладам
    ТОГДА ИСТИНА  
ИНАЧЕ
    ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
КОНЕЦ

или запихнуть это в отбор виртуальной таблицы

всякие ИЛИ и ЗначениеЗаполнено() - ересь адская и на больших БД дадут вам по лбу.
6 FIXXXL
 
13.02.20
16:07
(5) ВЫБОР круче ИЛИ? :)
7 unbred
 
13.02.20
16:12
(6) ВЫБОР проверяет одно условие. ИЛИ проверяет n условий.
8 FIXXXL
 
13.02.20
16:16
(7) да ну? а если я напишу "бороду" КОГДА - ТОГДА?
9 unenu
 
13.02.20
16:18
(8) о бороде речь не шла, я указал фрагмент для задачи из темы.
10 ИУБиПовиц
 
13.02.20
16:21
Сделайте условие в запросе, а затем    Если НЕ ЗначениеЗаполнено(Склад) Тогда СтрЗаменить условие на ""
11 080808Ник
 
13.02.20
16:29
(6) при или индекс не работает. а вот при выбор хороший вопрос)
12 arsik
 
гуру
13.02.20
16:35
(2) (4) Криво будет запрос по скорости работать.
Я делаю так
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
|    ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК ВНаличииНачальныйОстаток,
|    ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , &УсловиеСклад) КАК ТоварыНаСкладахОстаткиИОбороты";

Если ЗначениеЗаполнено(Склад) Тогда
   Запрос.Текст = стрЗаменить(Запрос.Текст,"&УсловиеСклад","СкладКомпании = &Склад");
иначе
   Запрос.Текст = стрЗаменить(Запрос.Текст,"&УсловиеСклад","Истина");
КонецЕсли;
13 Йохохо
 
13.02.20
16:36
(11) при ИЛИ работают ленивые вычисления оптимизатора, тоже ничего вопрос
14 hhhh
 
13.02.20
16:41
(11) при выбор тоже не работает индекс
15 Андроны едут
 
13.02.20
16:50
(0) В старые добрые времена использовали построитель
16 Андроны едут
 
13.02.20
16:55
старики говорят ещё можно так

РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , &Склад В (Склад, Значение(Справочник.Склады.Пустаяссылка)))
17 unenu
 
13.02.20
17:06
(16) тот же хрен только в другой руке, что и с ИЛИ - индексы тю-тю, да еще и подзапрос.
вобщем у меня на большой БД Выбор Когда лечит на скуле, остальное по барабану.
перестанет лечить будем крутить по другому.

ес-но речь о тех случаях когда невозможно модифицировать запрос на лету по методу предтавлений или как в коде выше.
18 080808Ник
 
13.02.20
17:12
Запрос = Новый Запрос;
    Текст =
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    |    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладахОстаткиИОбороты";
    Если ЗначениеЗаполнено(Склад) Тогда
        СхемаЗапроса = Новый СхемаЗапроса;
        СхемаЗапроса.УстановитьТекстЗапроса(Текст);
        СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[4].Выражение = Новый ВыражениеСхемыЗапроса("Склад=&Склад");
        Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    КонецЕсли;    
    Запрос.текст = Текст;
19 famnam
 
14.02.20
06:38
(15) а сейчас не используют?
20 D_E_S_131
 
14.02.20
10:25
(18) Вот очень хорошее решение через СхемуЗапроса, а не через анахронизм ПостроительОтчета. +++