Вход | Регистрация
 

Запрос. Странно работает "Выбор когда". Или лыжи не едут.

Запрос. Странно работает "Выбор когда". Или лыжи не едут.
Я
   Галахад
 
22.09.21 - 08:02
Простой запрос:
ВЫБРАТЬ
    Док.Ссылка КАК Ссылка
ИЗ
    Документ.Док КАК Док
ГДЕ
    ВЫБОР
            КОГДА &ТекущийПользователь = Док.ААА
                ТОГДА ИСТИНА
            КОГДА &ТекущийПользователь В (Док.ТЧ_ААА.ААА)
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ
   Галахад
 
1 - 22.09.21 - 08:03
Возвращает 1 запись

Запрос:    
Простой запрос:
ВЫБРАТЬ
    Док.Ссылка КАК Ссылка
ИЗ
    Документ.Док КАК Док
ГДЕ
    ВЫБОР
            КОГДА &ТекущийПользователь В (Док.ТЧ_ААА.ААА)
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ

возвращает множество записей.

С чего это?
   Галахад
 
2 - 22.09.21 - 08:04
Не, (1) не читать.

ВЫБРАТЬ
    Док.Ссылка КАК Ссылка
ИЗ
    Документ.Док КАК Док
ГДЕ
    ВЫБОР
            КОГДА &ТекущийПользователь = Док.ААА
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ

возвращает множество записей.
   Галахад
 
3 - 22.09.21 - 08:09
ВЫБРАТЬ
    Док.Ссылка КАК Ссылка
ИЗ
    Документ.Док КАК Док
ГДЕ
    &ТекущийПользователь = Док.ААА ИЛИ &ТекущийПользователь В (Док.ТЧ_ААА.ААА)

Такой тоже возвращает множество записей.
   Мультук
 
4 - 22.09.21 - 08:10
(0)

1C неправильно раскручивает условие &ТекущийПользователь В (Док.ТЧ_ААА.ААА)
Не делай так (с)

P.S.

Раньше (когда трава была зеленая) даже за мысли о подобном
&ТекущийПользователь В (Док.ТЧ_ААА.ААА)

гуру били ногами в живот. 

Но сейчас все по другому, жаль только (как видно из примера) 1С об этом не в курсе

P.P.S.
Если можешь, глянь какие SQL-запросы рожает 1С в обоих случаях, это любопытно, но не более того
   Ненавижу 1С
 
5 - 22.09.21 - 08:10
(0) пихать неявно табличную часть это моветон
   acanta
 
6 - 22.09.21 - 08:13
Возможно, в файловой или постгресе оно будет работать по другому?
   PuhUfa
 
7 - 22.09.21 - 08:21
(0)
    Запрос = НОвый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказНаряд.Ссылка
        |ИЗ
        |    Документ.ЗаказНаряд КАК ЗаказНаряд
        |ГДЕ
        |    ВЫБОР
        |            КОГДА &Реквизит1 = ЗаказНаряд.Менеджер
        |                ТОГДА ИСТИНА
        |            КОГДА &Реквизит1 В (ЗаказНаряд.Исполнители.Исполнитель)
        |                ТОГДА ИСТИНА
        |            ИНАЧЕ ЛОЖЬ
        |        КОНЕЦ";
    Запрос.УстановитьПараметр("Реквизит1",Реквизит1);
    Результат = Запрос.Выполнить().Выгрузить();

В файловой на 8.3.17.1851 работает нормально
   Галахад
 
8 - 22.09.21 - 08:34
Ну, млин. Не прокатило по простому... :-(
   Галахад
 
9 - 22.09.21 - 09:09
(4) Да, весело получилось...

ВЫБРАТЬ
    T1.Ссылка КАК Ссылка
ИЗ
    Документ.Док КАК T1
ГДЕ
    ИСТИНА В
            (ВЫБРАТЬ
                1
            ИЗ
                Документ.Док.ААА КАК T2
            ГДЕ
                T1.Ссылка = T2.Ссылка
                И ВЫБОР
                    КОГДА T1.ААА = &P1
                        ТОГДА ИСТИНА
                    КОГДА T2.ААА = &P2
                        ТОГДА ИСТИНА
                    ИНАЧЕ ЛОЖЬ
                КОНЕЦ = ИСТИНА)
   Мультук
 
10 - 22.09.21 - 09:14
(9)

ВЫБРАТЬ 
   РАЗЛИЧНЫЕ т1.ссылка КАК Ссылка
ИЗ
  Документ.Док.ААА как т1
ГДЕ
   т1.Реквизит = &Реквизит1  
   ИЛИ т1.Ссылка.Реквизит = &Реквизит1  


Индексируем поля (по вкусу)
Документ.Док.ААА.Реквизит
Документ.Док.Реквизит
   Галахад
 
11 - 22.09.21 - 09:19
(10) Это зачем? В (9) я показал что делает SQL.
   Галахад
 
12 - 22.09.21 - 09:21
Кстати с РЛС что-то попроще этого написать?
Док ИЗ Документ.Док КАК Док
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.Док.ААА КАК ДокААА
    ПО Док.Ссылка = ДокААА.Ссылка
        И (ДокААА.ААА = &ТекущийПользователь)
ГДЕ (ВЫБОР
                КОГДА Док.ААА = &ТекущийПользователь
                    ТОГДА ИСТИНА
                ИНАЧЕ ЛОЖЬ
            КОНЕЦ
            ИЛИ НЕ ДокААА.Ссылка ЕСТЬ NULL)
   acanta
 
13 - 22.09.21 - 09:27
Вы хотите рлс на табличную часть?
   Галахад
 
14 - 22.09.21 - 09:29
(13) Если пользователь есть в ТЧ ААА, то ему можно работать с документом.
   youalex
 
15 - 22.09.21 - 09:41
(0) Не лучше будет РС создать с разрезом Док/Пользователь, обновлять при записи Док (в подписке)  и в RLS его джойнить.
   Галахад
 
16 - 22.09.21 - 09:54
(15) Лень двигатель прогресса. Уже сделал как в (12), и лень что-то усложнять. :-)
   Малыш Джон
 
17 - 22.09.21 - 12:27
(12) ВЫБОР
                КОГДА Док.ААА = &ТекущийПользователь
                    ТОГДА ИСТИНА
                ИНАЧЕ ЛОЖЬ
            КОНЕЦ

собственно это то же самое что и 

Док.ААА = &ТекущийПользователь
   Галахад
 
18 - 22.09.21 - 12:32
(17) Ага, спасибо. Но это же пример запроса, а не оригинал. В оригинале еще пара веток есть.

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.