Имя: Пароль:
1C
1C 7.7
v7: Условие в ПрямомЗапросе 1С++
,
0 smitti911
 
24.11.14
14:14
Здравствуйте. Чет туплю. Есть такой вот запрос (класс ПрямойЗапрос) :

    оПЗ.Текст="ВЫБРАТЬ
    |    $Жур.ТекущийДокумент      КАК [Документ $Документ]
    |,    $Жур.ВидДокумента         КАК Документ_вид
    |,  $Жур.Проведен             КАК Проведен
    |,    $Жур.ВремяДокумента       КАК [ВремяДокумента $Время]
    |,  $Жур.ДатаДокумента         КАК [ДатаДокумента $Дата]
    |
    |,  ВЫБОР КОГДА (($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1))
    |        ТОГДА 1
    |    КОГДА ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция))
    |        ТОГДА 1
    |    КОГДА ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1)
    |        ТОГДА 1
    |    ИНАЧЕ 0 КОНЕЦ КАК [Признак :Число.1.0]
    |ИЗ
    |    ЖурналДокументов КАК Жур $nolock
    |
    |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Калькуляция КАК Калк $nolock
    |ПО $Калк.ТекущийДокумент = $Жур.ТекущийДокумент
    |
    |ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладнаяБ КАК Расх $nolock
    |ПО $Расх.ТекущийДокумент = $Жур.ТекущийДокумент
    |  
    |ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетБ КАК Счет $nolock
    |ПО $Счет.ТекущийДокумент = $Жур.ТекущийДокумент
    |
    |ГДЕ
//    |($Жур.Проведен = 1)
    |   $Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~
    |И   (($Жур.ВидДокумента = :ВидДокумента.РасходнаяНакладнаяБ)
    |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.Калькуляция)  
    |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.СчетБ))
//    |И   (Признак = 1)



Можна ли поставить фильтр на переменную Признак . Если раскомментировать последнюю строку - то выдает ошибку no such column
1 фобка
 
24.11.14
14:16
Переменная в тексте запроса не прокатит
2 фобка
 
24.11.14
14:16
чо за Признак?
3 smitti911
 
24.11.14
14:17
Очень жаль.Придется фильтровать результат запроса после выполнения :(
4 smitti911
 
24.11.14
14:17
Признак - это просто имя переменной в запросе
5 akaBrr
 
24.11.14
14:26
(4) а просто значение переменной как планируется задавать?
6 akaBrr
 
24.11.14
14:27
+(5) почему у вас НачПериода не "просто переменная"?
7 Попытка1С
 
24.11.14
14:28
И   (Признак = :ВыбПризнак)


Запрос.УстановитьТекстовыйПарметр("ВыбПризнак",трям)
8 Попытка1С
 
24.11.14
14:28
Только вместо Признак должно быть что=то относящеесе к запросу хотя бы
9 akaBrr
 
24.11.14
14:33
(7) лучше ":Признак = 1"
10 Попытка1С
 
24.11.14
14:37
(9) Так мало ли что у него там
11 Попытка1С
 
24.11.14
14:38
А так вот

|    ИНАЧЕ 0 КОНЕЦ КАК [Признак :Число.1.0]
12 Попытка1С
 
24.11.14
14:39
Тогда в запросе пиши тупо

ГДЕ

(($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1)) ИЛИ ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция)) ИЛИ ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1))
13 dk
 
24.11.14
14:40
просто скопируй все из признака в условие
ВЫБОР КОГДА (($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1))
    |        ТОГДА 1
    |    КОГДА ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция))
    |        ТОГДА 1
    |    КОГДА ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1)
    |        ТОГДА 1
    |    ИНАЧЕ 0 КОНЕЦ) = 1
14 smitti911
 
24.11.14
14:48
Спасибо за ответы.Сейчас попробую и отпишусь...
15 smitti911
 
24.11.14
14:51
Мммдаа, помогает только засунуть все в "ГДЕ"  :

    |   $Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~
    |И   ((($Жур.ВидДокумента = :ВидДокумента.РасходнаяНакладнаяБ) И ($Расх.Бетон = 1))
    |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.Калькуляция)  
    |ИЛИ (($Жур.ВидДокумента = :ВидДокумента.СчетБ) И ($Счет.Бетон = 1)))
16 smitti911
 
24.11.14
14:52
Если будут еще условия то "ГДЕ" разрастется еще на пару строк :)
17 dk
 
24.11.14
14:56
если условия капец здоровые можно обернуть еще в один запрос, тогда можно ставить условия на просто Признак = 1
18 smitti911
 
24.11.14
14:57
(17) Я думал про это...
19 smitti911
 
24.11.14
14:59
Еще вопрос: Можно ли использовать класс ПоставщикДанных.Документ* для отображения результата запроса.То есть некий список документов разных видов.Или создавать ТабличноеПоле с поставщиком ТЗ?
20 ado
 
24.11.14
15:06
Что тебе в итоге нужно то? Зачем тебе в запросе условие на переменную, не относящуюся к запросу?

(19) А чем не устраивает поставщик ODBC?
21 КонецЦикла
 
24.11.14
15:11
22 smitti911
 
24.11.14
15:11
(20) Там будет очень хитрое условие, вот и хотелось знать пойдет ли фильтр по переменной  "Признак".
В классе Поставщик данных хотелось получить красивую формочку с командной панелькой и использованием всех возможностей данного класса...
23 smitti911
 
24.11.14
15:11
База DBF
24 КонецЦикла
 
24.11.14
15:12
(22) Да, форма прекрасна...
25 ado
 
24.11.14
15:16
(22) В зависимости от внешней переменной просто присоединяй разные условия к запросу.

Ээээ, а какая еще форма у поставщика данных? Форму то все равно с помощью ТП придется делать, поставщик только данные для нее поставляет, не?
26 КонецЦикла
 
24.11.14
15:18
(25) Еще есть замечательные другие классы :)
27 ado
 
24.11.14
15:32
(26) Штатно в составе 1С++ или внешние?
28 smitti911
 
24.11.14
15:36
29 smitti911
 
24.11.14
15:36
(25) Имелось ввиду командная панель Поставщика. Если ТипЗначений - Документ.***** - то в панели доступны кнопки выбора периода,отбора, и т.д.
30 ado
 
24.11.14
15:39
(28) Мммм, а можно ссылку источник этой красоты?
31 akaBrr
 
24.11.14
15:39
32 ado
 
24.11.14
15:41
Спасибо, а то в доках я про это что-то ничего не вижу (или плохо смотрю?)
33 КонецЦикла
 
24.11.14
15:50
(30) Ссылку дали, выглядит примерно так
http://1c911.by/uskorenie-1s-77.htm#1
34 smitti911
 
24.11.14
15:51
(33) Вот мне и надо такой журнальчик но с разными видами доков.
35 Попытка1С
 
24.11.14
16:24
(34) А зачем ты вот это джонишь?

  |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Калькуляция КАК Калк $nolock
    |ПО $Калк.ТекущийДокумент = $Жур.ТекущийДокумент
36 smitti911
 
24.11.14
16:41
(35) Будет условие :
$Калк.ТМЦ В (ВЫБРАТЬ val ИЗ #СписокТМЦ)
37 ado
 
24.11.14
16:58
(33) Лепота. Жаль только FormEx в требованиях. Он у нас сейчас не используется, а подключить новую ВК -- это целая история (не техническая, организационная).
38 Эльниньо
 
25.11.14
11:10
Сколько тут прямозапросечников.
Неужели ни одного безработного нет?
39 КонецЦикла
 
25.11.14
11:11
(38) Есть безработные :)
40 DCKiller
 
25.11.14
11:12
(38) Работу предлагаешь? Прям в Питере? :)
41 Banned
 
25.11.14
11:13
(38) А что по деньгам?
42 Эльниньо
 
25.11.14
11:25
В личку, велкам
43 Banned
 
25.11.14
12:17
(42) ну это скучно же ))
Сначала хотя бы порядок цифр... 50-70-100-150? ))
44 smitti911
 
25.11.14
19:01
Проблема с запросом к регистру. Флаг БыстраяОбработкаДвижений = 0 , у реквизитов регистра флаг отбора движений = 0.
Текст запроса :

    оПЗ.Текст="
    |ВЫБРАТЬ
    |  $РегОб.Счет КАК [Счет $Счет]
    |, $РегОб.ТМЦ КАК [ТМЦ $Справочник.ТМЦ]
    |, НАЧАЛОПЕРИОДА($Жур.ДатаДокумента, Месяц ) КАК [Месяц $Дата]
    |, $РегОб.ТекущийДокумент [Док $Документ]
    |, $Жур.ВидДокумента КАК Док_вид
    |, $РегОб.ПризнакДвижения КАК ПризнакДвижения
    |, $РегОб.Склад КАК [Склад $Справочник.МестаХранения]
    |, СУММА($РегОб.ПриходСуммаСебест) КАК ОборотС
    |, СУММА($РегОб.ПриходКво) КАК ОборотК
    |, 0 КАК [ИспКво :Число.15.3]
    |
    |FROM Регистр.ОборотыБ КАК РегОб
    |
    |ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов КАК Жур $nolock
    |ПО $Жур.ТекущийДокумент = $РегОб.ТекущийДокумент
    |
    |ГДЕ $РегОб.ПризнакДвижения = :Перечисление.ПризнакДвижения.Приход
    |И   $РегОб.ВидДвижения = 0
    |И   $РегОб.Счет = :ВыбСчет~
    |И   $РегОб.Склад В (ВЫБРАТЬ val ИЗ #СписокСкладов)
    |И  ($Жур.Проведен = 1)
    |И  ($Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~)
    |И   $Жур.ВидДокумента = :ВидДокумента.ПриходнаяНакладнаяБ
//    |И (ТМЦ В (ВЫБРАТЬ val ИЗ #СписокТМЦ))
    |
    |СГРУППИРОВАТЬ $РегОб.ТМЦ,$РегОб.Склад,$РегОб.ТекущийДокумент
    |
    |УПОРЯДОЧИТЬ $РегОб.ТМЦ,$РегОб.Склад,$РегОб.ТекущийДокумент УБЫВ
    |";
    
    //}Текст запроса
    
    ОпределитьСклады(НаДату);
    оПЗ.УстановитьТекстовыйПараметр("НачПериода",НачДата);
    оПЗ.УстановитьТекстовыйПараметр("КонПериода",КонДата);
    оПЗ.УстановитьТекстовыйПараметр("ВыбСчет",СчетПоКоду("281"));
    СпСкл = СоздатьОбъект("СписокЗначений");
    Для Поз = 1 По глСписокТоргСкладов.РазмерСписка() Цикл
        ТекЗн = глСписокТоргСкладов.ПолучитьЗначение(Поз);
        Если Число(ТекЗн.Код) = 50 Тогда
            Продолжить;
        КонецЕсли;
        СпСкл.ДобавитьЗначение(ТекЗн);
    КонецЦикла;
    оПЗ.УложитьСписокЗначений(СпСкл,"#СписокСкладов");

Проблема :

Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=;
    Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC,
    Найдено в кэше
    Индекс не выбран.
    Стоимость: 9982
Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=;
    Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC,
    Найдено в кэше
    Индекс не выбран.
    Стоимость: 9982
Подбор индекса для таблицы 1SJOURN:
    Ограничения: IDDOCDEF=; IDDOC=;
    Найдено в кэше
    Выбран индекс IDDOC: IDDOC
    Стоимость: 20
Подбор индекса для таблицы 1SJOURN:
    Ограничения: IDDOCDEF=; IDDOC=;
    Найдено в кэше
    Выбран индекс IDDOC: IDDOC
    Стоимость: 20



Как можно побороть Стоимость: 9982   ?
45 trad
 
25.11.14
19:15
внутреннее соединение
если не поможет, внутреннее соединение и поменять таблицы местами
46 КонецЦикла
 
25.11.14
21:53
Если уж настолько критично - подобрать штатный индекс или свой создать
Но другая сторона - проиграешь по времени записи движений
Еще вариант - использование временных таблиц (иногда пригождается)
http://1c911.by/stati_1s/statya-primery-resheniya-nestandartnyh-zadach-na-t-sql-v-1s.htm#4
47 smitti911
 
26.11.14
00:06
внутреннее соединение и поменять таблицы местами - это помогло, спасибо.

Подбор индекса для таблицы 1SJOURN:
    Ограничения: IDDOCDEF=; IDDOC=;
    Найдено в кэше
    Выбран индекс IDDOC: IDDOC
    Стоимость: 20
Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=;
    Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC,
    Найдено в кэше
    Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
    Стоимость: 54
Подбор индекса для таблицы 1SJOURN:
    Ограничения: IDDOCDEF=;
    Найдено в кэше
    Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC
    Стоимость: 80
Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=;
    Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC,
    Найдено в кэше
    Индекс не выбран.
    Стоимость: 9982
Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=;
    Найдено в кэше
    Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
    Стоимость: 54
Подбор индекса для таблицы RA18284:
    Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=;
    Найдено в кэше
    Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
    Стоимость: 54

Может попробую еще временные таблицы