Имя: Пароль:
1C
1С v8
2 одинаковых логически, но разных по результатам запроса.
,
0 deevil
 
29.03.12
15:21
Есть запрос, для получения оборота по продажам, за исключением данных определенных контрагентов и определенных папок номенклатуры.

Есть 2 варианта для отбора контрагентов:
ВЫБОР КОГДА ДоговорКонтрагента ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ ВЫБОР КОГДА ДоговорКонтрагента.Владелец В (&КонтрагентИсключить)ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ

и

ВЫБОР КОГДА ДоговорКонтрагента ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ НЕ (ДоговорКонтрагента.Владелец В (&КонтрагентИсключить))
КОНЕЦ


Логически оба запроса одинаковы, но результаты различаются.
1й вариант выдает правильные данные, но интересно в чем ошибка.


Полный текст запроса:

ВЫБРАТЬ
СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала,&ДатаОкончания,
Регистратор,
НЕ Номенклатура.Родитель В (&НоменклатураРодительИсключить)
И НЕ Номенклатура.Услуга

и ВЫБОР КОГДА ДоговорКонтрагента ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ ВЫБОР КОГДА ДоговорКонтрагента.Владелец В (&КонтрагентИсключить)ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ

) КАК ПродажиОбороты
ГДЕ
ПродажиОбороты.Регистратор.Организация = &Организация
1 deevil
 
29.03.12
15:22
Парсер скушал

1й вариант

ВЫБОР
КОГДА ДоговорКонтрагента ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ
ВЫБОР КОГДА ДоговорКонтрагента.Владелец В (&КонтрагентИсключить)ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ
2 deevil
 
29.03.12
15:23
2й вариант

ВЫБОР КОГДА ДоговорКонтрагента ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ НЕ (ДоговорКонтрагента.Владелец В (&КонтрагентИсключить))
КОНЕЦ
3 lxs
 
29.03.12
15:23
не поверишь, они разные и по логике и по написанию
4 Kashemir
 
29.03.12
15:25
(3) Да логика вроде одинакова
5 Fragster
 
гуру
29.03.12
15:27
у Выбор может быть более одного когда .. Тогда .., только тсссс!
6 Kashemir
 
29.03.12
15:28
Обе конструкции возвращают ЛОЖЬ если Владелец контрагента входит в список исключений и ИСТИНА во всех остальных случаях

(5) Ну это по сути задачу то не меняет
7 Deon
 
29.03.12
15:34
Я б засунул условие в возвращаемое запросом поле и позырил бы, что оно там насчитало, а то я тоже разницы не вижу
8 Fragster
 
гуру
29.03.12
15:37
я бы вывел поле из Справочник.Договоры где
ДоговорКонтрагента.Владелец Есть NULL
9 deevil
 
29.03.12
15:40
(7) не дает, ругается на "В (&КонтрагентИсключить)"

(8) Условие "ДоговорКонтрагента.Владелец Есть NULL" исключит Продажи без договора (Розница).
10 Fragster
 
гуру
29.03.12
15:41
(9).2 у тебя договор есть NULL, а не договор.владелец есть NULL
11 deevil
 
29.03.12
15:45
(10) для того чтобы не пропали продажи без договора.
12 Deon
 
29.03.12
15:46
(9) Как ругается-то хоть?
13 lxs
 
29.03.12
15:46
(4) да нихрена логика не одинаковая. если ты не пишешь иначе запрос не ложь возвращает
14 Deon
 
29.03.12
15:48
(13) Где там нет "иначе"?
15 Kashemir
 
29.03.12
15:49
(13) Ты ошибаешся. В иначе открыта новая конструкция выбор которая в свою очередь и возвращает значение.
16 lxs
 
29.03.12
15:49
1. когда а=1 тогда "а" иначе "б"
результат выполнения: или а, или б
2. когда а=1 тогда "а"
результат выполнения: "а" или пустой
17 deevil
 
29.03.12
15:49
(12)
{(1, 44)}: Операция не разрешена в предложении
ПродажиОбороты.ДоговорКонтрагента.Владелец <<?>> В (&КонтрагентИсключить)

(13) не совсем понял что имеете ввиду
18 lxs
 
29.03.12
15:49
(15) вот именно, они либо возвращает что-то (конкретно это булево), либо нихрена не возвращает.
19 Fragster
 
гуру
29.03.12
15:50
(11) не тупи, NULL = NULL - ложь
20 Kashemir
 
29.03.12
15:50
(18) Приведи пример конструкции автора, которая по твоему ничего не возвращает.
21 lxs
 
29.03.12
15:50
а если запрос ничего не возвращает, что происходит?
22 Kashemir
 
29.03.12
15:51
(21) Происходит NULL
23 Deon
 
29.03.12
15:51
(17) Покажи весь запрос
24 lxs
 
29.03.12
15:51
(20) второй запрос. у него же результат отличается, он же сам сказал? почему я тебе должен доказательства приводить? если ты не видишь разницы между булево и неопределено, то я тут тебе ничем не помогу.
25 deevil
 
29.03.12
15:52
Конструкция в обоих вариантах возвращает данные, но во втором пропадает приличная сумма.
Проверками определил что 1й вариант возвращает верные данные, просто интересно что я не так сделал во втором.
26 lxs
 
29.03.12
15:53
(22) все, нет вопросов, я не досмотрел)
27 Kashemir
 
29.03.12
15:53
(24) Я долго напрягал свое прекрасное зрение и не увидел возможности возврата "неопределено". Соответственно помощь нужна не мне.
28 deevil
 
29.03.12
15:54
(24) (27) - там и не может быть неопределенно, откуда оно возьмется?
29 lxs
 
29.03.12
15:56
(27) проехали, я из-за херового отображения в тегах не досмотрел текст.

(0) попробуй так


ВЫБОР
   КОГДА ДоговорКонтрагента ЕСТЬ NULL
       ТОГДА ИСТИНА
   ИНАЧЕ (НЕ ДоговорКонтрагента.Владелец В (&КонтрагентИсключить))
КОНЕЦ
30 deevil
 
29.03.12
15:57
По сути я заменил конструкцию

ВЫБОР КОГДА ДоговорКонтрагента.Владелец В (&КонтрагентИсключить) ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА
на
НЕ (ДоговорКонтрагента.Владелец В (&КонтрагентИсключить))

И результат разный...
31 lxs
 
29.03.12
15:57
(30) "НЕ" возьми в скобки
32 lxs
 
29.03.12
16:01
off: мля, когда здесь сделают нормальный "кодоопределитель"?
33 deevil
 
29.03.12
16:02
(31) все равно.
Такое ощущение, что " НЕ " в запросе тупит.
34 Kashemir
 
29.03.12
16:06
(33) альтернативная конструкция
ДоговорКонтрагента.Владелец В (&КонтрагентИсключить) = ЛОЖЬ
35 Fragster
 
гуру
29.03.12
16:07
блин, ну происходит инверсия из-за NULL. Инфа 146%
36 Kashemir
 
29.03.12
16:08
(35) Так в оригинальной конструкции не может быть ибо договор проверяется на существование
37 Kashemir
 
29.03.12
16:09
+(36) Не может быть NULL *
38 Fragster
 
гуру
29.03.12
16:09
(36) договор - да. а договор.Владелец - может быть чем угодно.


Выбрать "ЫЫЫЫ"
Где Не (NULL = NULL)
Объединить Все
Выбрать "огого!"
Где Выбор когда NULL <> NULL Тогда Ложь Иначе Истина Конец = Истина
39 Fragster
 
гуру
29.03.12
16:09
(38)+ у пустой ссылки владелец - NULL, если что
40 Kashemir
 
29.03.12
16:12
(38) У пустой ссылки заданного типа при реквизите несоставного типа не может быть нул
41 Fragster
 
гуру
29.03.12
16:13
(40)

ВЫБРАТЬ
   ВЫБОР
       КОГДА ВЫРАЗИТЬ(ЗНАЧЕНИЕ(Справочник.ДОговорыКонтрагентов.ПустаяСсылка) КАК Справочник.ДоговорыКонтрагентов).Владелец ЕСТЬ NULL
           ТОГДА "Таки NULL"
       ИНАЧЕ "Нету NULL"
   КОНЕЦ КАК Поле1
42 Fragster
 
гуру
29.03.12
16:14
(41)+ объяснить, откуда он там, или сам догадаешься?
43 Kashemir
 
29.03.12
16:15
(42) Действительно, мой косяк.
44 Kashemir
 
29.03.12
16:16
+(43) ВЫБРАТЬ
   ТипЗначения(ВЫРАЗИТЬ(NULL КАК Справочник.ДоговорыКонтрагентов).Владелец)
Возвращает NULL
45 Fragster
 
гуру
29.03.12
16:19
(44)
ВЫРАЗИТЬ(NULL КАК Справочник.ДоговорыКонтрагентов) = ЗНАЧЕНИЕ(Справочник.ДОговорыКонтрагентов.ПустаяСсылка)
46 Kashemir
 
29.03.12
16:20
(45) Та да - я уже увидел
47 Kashemir
 
29.03.12
16:21
+(46) Хотя честно говоря не совсем понятно, почему явное приведение типа не привело к выражению пустого ссылочного
48 hhhh
 
29.03.12
16:57
(29) надо так

ЕСТЬNULL(НЕ ДоговорКонтрагента.Владелец В (&КонтрагентИсключить), ИСТИНА)

чего ты размахал на полстраницы?
Независимо от того, куда вы едете — это в гору и против ветра!