Имя: Пароль:
1C
1С v8
Не срабатывает условие на вхождение в запросе.
0 ks_83
 
26.05.20
14:21
Вот так работает:
РегистрНакопления.ДвижениеПродукции.Остатки(
            ,
             ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе)=ЛОЖЬ)
Вот так тоже работает:
РегистрНакопления.ДвижениеПродукции.Остатки(
            ,
             НЕ ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе)=ИСТИНА)

А вот так не работает!(выдает пустой результат)
РегистрНакопления.ДвижениеПродукции.Остатки(
            ,
             НЕ ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе))

Кто знает в чем подвох? В профайлеры пока лень лезть. Попробую сначала ТИИ сделать вечером.
1 Beduin
 
26.05.20
14:30
А у тебя в первых двух условиях ИСТИНА получается. Все ЗаписьСкладскогоЖурнала есть в регистре
2 VladZ
 
26.05.20
14:32
(0) Херню пишешь, вот и не работает.
3 ks_83
 
26.05.20
14:33
(1) Все 3 условия не отличаются по логике.
4 fisher
 
26.05.20
14:48
А так?
РегистрНакопления.ДвижениеПродукции.Остатки(
            ,
             НЕ (ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе)))
5 ks_83
 
26.05.20
14:51
(2) Это говорит человек, который постит говнокоменты в темах, в которых ничего не смыслит. Ок.
6 ks_83
 
26.05.20
14:55
(4) Скобки по разному уже пытался ставить. Не помогло( и слава богу).
7 fisher
 
26.05.20
14:58
(6) Согласен :)
Уверен, что запросы, их параметры и окружение ничем не отличаются?
Тогда очевидно, что фиг его знает.
8 ks_83
 
26.05.20
15:06
(7) Запрос один. Просто я меняю в нем условие и получаю разный результат. Хотя результат меняться не должен, ибо условия различаются чисто синтаксически, но не логически.
9 1Сергей
 
26.05.20
15:09
Дико извиняюсь. ЗаписьСкладскогоЖурнала - это измерение, ресурс или реквизит регистра?
10 ks_83
 
26.05.20
15:10
(9) Измерение, не составное.
11 1Сергей
 
26.05.20
15:13
(10) И вид регистра - остатки?
12 ks_83
 
26.05.20
15:15
(11) Да.
13 palpetrovich
 
26.05.20
15:24
ЗаписьСкладскогоЖурнала  -булево что-ли?
я что-то вообще не понимаю что здесь написано:
ЗаписьСкладскогоЖурнала В(ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ЛОЖЬ
без шуток, просто интересно как это работает
14 RomanYS
 
26.05.20
15:26
(13) похоже смысл понимать надо так :) :
(ЗаписьСкладскогоЖурнала В(ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)) = ЛОЖЬ
15 palpetrovich
 
26.05.20
15:38
мдя, работает как-то, "Да"  возвращает:
ВЫБРАТЬ 1 как ЗаписьСкладскогоЖурнала
Поместить  ВтВпроцессе
объединить
ВЫБРАТЬ 2
;
ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ЛОЖЬ
16 fisher
 
26.05.20
15:40
(13) Это тоже самое, что и ГДЕ Проведен = ИСТИНА
Тавтология, которая не должна повлиять на результат.
Или вопрос про работу оператора "В"? Тогда RTFM.
17 palpetrovich
 
26.05.20
15:44
(15) только вот есть у автора ЗаписьСкладскогоЖурнала  не булево - то чему он удивляется? )
18 fisher
 
26.05.20
15:45
(17) Ок. Не хочешь в RTFM, тогда маленький ликбез. Результат работы оператора "В" - булево.
19 palpetrovich
 
26.05.20
15:47
(18) да нет, меня смутило "=ложь"
20 Ёпрст
 
26.05.20
15:48
(6) конструктором открой, он раставит как надо скобочки
21 Ёпрст
 
26.05.20
15:49
(0) посмотри в консоле, че возвращает
НЕ ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе)
22 fisher
 
26.05.20
15:51
(19) У ТС не заработало "НЕ..." и он начал экспериментировать. Внезапно "=ложь" выдало другой результат, хотя логически это одно и то же. И вот он здесь.
23 palpetrovich
 
26.05.20
15:59
(22) у ненго НЕ не там
так тоже работает
ВЫБРАТЬ 1 как ЗаписьСкладскогоЖурнала
Поместить  ВтВпроцессе
объединить
ВЫБРАТЬ 2
;ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=Ложь
;ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)
;ВЫБРАТЬ 3 НЕ В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=Истина
24 palpetrovich
 
26.05.20
16:00
+(23)  впрочем пофик на место НЕ , чьл "ВЫБРАТЬ 3 НЕ" , что "ВЫБРАТЬ НЕ 3 "
25 ks_83
 
26.05.20
16:05
Короче завел в запросе два поля:
      НЕ ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала В
                (ВЫБРАТЬ
                    ВтВпроцессе.ЗаписьСкладскогоЖурнала
                ИЗ
                    ВтВпроцессе) КАК Поле1,
     ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала В
                (ВЫБРАТЬ
                    ВтВпроцессе.ЗаписьСкладскогоЖурнала
                ИЗ
                    ВтВпроцессе) КАК Поле2

В итоге Поле2 принимает значения как истина так и ложь, Поле 1 ВСЕГДА ПРИНИМАЕТ ЗНАЧЕНИЕ ЛОЖЬ. Вот такое бывает. Первый раз такую дичь наблюдаю.
26 Ёпрст
 
26.05.20
16:07
(25) битые записи поди в регистре, да ?
27 Ёпрст
 
26.05.20
16:10
Выведи, чему равно  ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала ..и свои поля, увидишь
28 fisher
 
26.05.20
16:10
(25) А так?
      ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала НЕ В
                (ВЫБРАТЬ
                    ВтВпроцессе.ЗаписьСкладскогоЖурнала
                ИЗ
                    ВтВпроцессе) КАК Поле1,
29 Ёпрст
 
26.05.20
16:18
Или где-тое есть null
30 Ненавижу 1С
 
гуру
26.05.20
16:18
(23) а теперь в исходной таблице оставь одно значение NULL
31 fisher
 
26.05.20
16:21
Мимо. "В" - наллоустойчив.
32 ks_83
 
26.05.20
16:25
33 Ненавижу 1С
 
гуру
26.05.20
16:25
(31) офигенный вывод
34 dezss
 
26.05.20
16:26
(29) В этом и дело, похоже.
Именно "НЕ В" дает такое поведение когда в подзапросе встречается null
35 dezss
 
26.05.20
16:28
Кому интересно, вот набросал.

ВЫБРАТЬ
    "1" КАК ЧС
ПОМЕСТИТЬ ВТ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "2"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "3"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "4"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "5"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "6"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "8"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Null КАК ЧСНалл
ПОМЕСТИТЬ ВТН

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "8"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "1"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.ЧС
ИЗ
    ВТ КАК ВТ
ГДЕ
    ВТ.ЧС НЕ В
            (ВЫБРАТЬ
                ВТН.ЧСНалл
            ИЗ
                ВТН КАК ВТН)
36 dezss
 
26.05.20
16:29
(35) + убираете null во второй ВТ и все отрабатывает.
37 fisher
 
26.05.20
16:30
(33)
ВЫБРАТЬ 1 В (ВЫБРАТЬ NULL) = "Нет"
ВЫБРАТЬ НЕ 1 В (ВЫБРАТЬ NULL) = "Да"
Или ты про что?
38 ks_83
 
26.05.20
16:34
Точняк. Именно в виртуальной таблице  есть битая строка с NULL-ами! А я и не заметил сначала. Усем спасибо.
39 fisher
 
26.05.20
16:37
(30)(35) Опа. А я и не знал.
40 fisher
 
26.05.20
16:41
Но у меня на (35) все сабжевые примеры отрабатывают одинаково. Что логично.
41 fisher
 
26.05.20
16:43
Стопудово тут еще логика работы виртуальной таблицы подсломалась.
42 dezss
 
26.05.20
16:45
(41) Не. Тут, скорей всего, дело в самом sql.
При проверке на вхождение, он ищет такое значение, находит его и все хорошо.
А вот если проверяет на НЕвхождение, то сравнивает со всеми записями второй таблицы и спотыкается на сравнении с null.
Надо еще несколько проверок сделать.
43 ks_83
 
26.05.20
16:46
Кому интересно почему при этом работает конструкция
РегистрНакопления.ДвижениеПродукции.Остатки(
            ,
             НЕ ЗаписьСкладскогоЖурнала  В
                    (ВЫБРАТЬ
                        ВтВпроцессе.ЗаписьСкладскогоЖурнала
                    ИЗ
                        ВтВпроцессе)=ИСТИНА)

На скуле это выглядит как
WHERE ((T2.ОбластьДанныхОсновныеДанные = ?)) AND (T2.Период = ? AND ((NOT (((CASE WHEN (T2.ЗаписьСкладскогоЖурнала IN
(SELECT
T3._Q_001_F_000RRef AS Q_001_F_000RRef
FROM ВременнаяТаблица40 T3 WITH(NOLOCK))) THEN 0x01 ELSE 0x00 END = 0x01))))) AND (T2.Количество <> ?) AND (T2.Количество <> ?))

т.е здесь NOT применяется не к IN, а к CASE

Если убрать "=ИСТИНА", то будет просто
WHERE ((T2.ОбластьДанныхОсновныеДанные = ?)) AND (T2.Период = ? AND ((NOT ((T2.ЗаписьСкладскогоЖурнала IN
(SELECT
T3._Q_001_F_000RRef AS Q_001_F_000RRef
FROM ВременнаяТаблица40 T3 WITH(NOLOCK)))))) AND (T2.Количество <> ?) AND (T2.Количество <> ?))

и на этом все ломается.
44 dezss
 
26.05.20
16:55
(43) В общем, исключай null-ы из подзапроса. Нехорошо с ним сравнивать)))
45 fisher
 
26.05.20
16:57
Прикольная фича
46 ks_83
 
26.05.20
17:02
(38) Пардоньте, во временной таблице,а не в виртуальной. В виртуальной все норм.
(44) В моем случае null-ы появились из-за косяка в БД, поэтому надо делать ТИИ.
47 1Сергей
 
26.05.20
17:04
Ёпрст как всегда быстрее всех протелепатил
48 Ненавижу 1С
 
гуру
26.05.20
17:10
да нет, тут помимо NOT IN вполне задокументированного поведением SQL сама 1С начудачила

Внимание запрос:

ВЫБРАТЬ ВЫРАЗИТЬ(NULL КАК ЧИСЛО(10,0)) как Поле
Поместить Таблица1
;
ВЫБРАТЬ NULL как Поле
Поместить Таблица2
;
ВЫБРАТЬ
ТИПЗНАЧЕНИЯ(3 В (ВЫБРАТЬ Поле ИЗ Таблица1)),
(3 В (ВЫБРАТЬ Поле ИЗ Таблица1)),
(3 НЕ В (ВЫБРАТЬ Поле ИЗ Таблица1)),
(3 В (ВЫБРАТЬ Поле ИЗ Таблица1) = ЛОЖЬ),
НЕ (3 В (ВЫБРАТЬ Поле ИЗ Таблица1)),
ТИПЗНАЧЕНИЯ(3 В (ВЫБРАТЬ Поле ИЗ Таблица2)),
(3 В (ВЫБРАТЬ Поле ИЗ Таблица2)),
(3 НЕ В (ВЫБРАТЬ Поле ИЗ Таблица2)),
(3 В (ВЫБРАТЬ Поле ИЗ Таблица2) = ЛОЖЬ),
НЕ (3 В (ВЫБРАТЬ Поле ИЗ Таблица2))
49 Ненавижу 1С
 
гуру
26.05.20
17:39
+(48) проанализировав профайлер: 1С криво строит запрос с нетипизированным NULL
50 Ненавижу 1С
 
гуру
26.05.20
22:04
то же самое иначе:

ВЫБРАТЬ
    КОЛИЧЕСТВО(1) КАК Поле1
ГДЕ
    НЕ 1 В
                (ВЫБРАТЬ
                    ВЫРАЗИТЬ(NULL КАК ЧИСЛО(10, 0)))

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    КОЛИЧЕСТВО(1)
ГДЕ
    НЕ 1 В
                (ВЫБРАТЬ
                    NULL)
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс