Имя: Пароль:
1C
 
8.2 логическое условие в запросе
0 Stado_adama
 
16.02.11
12:52
есть строчка из запроса:
И (ВидПлатежа = &ВидПлатежа или &ВидЗаполнения = Истина)) КАК ПлатежиОстатки

вопрос: почему когда я передаю в ВидЗаполнения значение Истина, запрос все еще обращает внимание на условие ВидПлатежа = &ВидПлатежа?
1 Живой Ископаемый
 
16.02.11
12:53
потому что оно первое
2 Живой Ископаемый
 
16.02.11
12:53
попробуй переставить местами. По крайней мере в коде этого было бы достаточно, не знаю как в языке запросов.
3 Ненавижу 1С
 
гуру
16.02.11
12:53
(16) что значит обращает внимание?
4 ДенисЧ
 
16.02.11
12:54
Условие считается слева направо
5 Ненавижу 1С
 
гуру
16.02.11
12:54
(1) это как в языке запросов? он как бэ декларативный
6 Ненавижу 1С
 
гуру
16.02.11
12:54
(4) и ЧО?
7 Живой Ископаемый
 
16.02.11
12:56
2(5) э... и что?
Я имею в виду что при исполнении кода в8 не будет проверять все условие до конца, если на каком-то этапе уже гарантировано будет истина или ложь. а в языке запросов - может и будет - мне например неизвестно...
Это все равно как в коде можно сравнить с NULL, а в языке запросв - нельзя
8 ДенисЧ
 
16.02.11
12:57
(6) И всйо!
9 Живой Ископаемый
 
16.02.11
12:58
2(6) например в семерке вот такая конструкция приводила к ошибке:
Если Истина Или Объект.НесуществующийМетод()
а в в8 - прокатит...
10 Axel2009
 
16.02.11
12:58
(0) а что значит "все еще обращает внимание"?
11 Ненавижу 1С
 
гуру
16.02.11
12:59
(8)(9) хватит бухать на работе!
это пример из текста запроса!
12 Ненавижу 1С
 
гуру
16.02.11
12:59
(10) вот и я в (3) спросил
13 ДенисЧ
 
16.02.11
12:59
(11) И? чО спросить-то хотел?
14 Живой Ископаемый
 
16.02.11
13:00
2(11) так и скажи - что в запросе булево выражение будет вычисленно до конца.
15 Ненавижу 1С
 
гуру
16.02.11
13:00
(13) да я собственно призвал, а не спросил
короче твое "Условие считается слева направо" вряд ли автору поможет
16 Живой Ископаемый
 
16.02.11
13:00
и объяснил бы почему.
17 Stado_adama
 
16.02.11
13:00
(12) значит, что даже если ВидЗаполнения = Истина, запрос проверяет совпадение ВидПлатежа... а надо что бы не проверял...
18 hugo
 
16.02.11
13:01
(7) Это все равно как в коде можно сравнить с NULL, а в языке запросв - нельзя

ВЫБРАТЬ
   ВТ.ДоговорКонтрагента
ИЗ
   ВТ КАК ВТ
ГДЕ
   ВТ.Проект ЕСТЬ NULL

работающий запрос, или ты не про это?
19 Ненавижу 1С
 
гуру
16.02.11
13:01
(14) а ты интересно как это сможешь определить до конца или нет? в запросе (1С) методов нет, чтобы проверить это
20 Живой Ископаемый
 
16.02.11
13:02
2(19) я в 9 написал метод. Легко можно проверить
21 Axel2009
 
16.02.11
13:02
(17) пишите другой текст запроса.
22 Ненавижу 1С
 
гуру
16.02.11
13:02
(20) в языке запроса, ога
23 Живой Ископаемый
 
16.02.11
13:04
2(22) капец, чувак... ты фонтазию свою скурил что ли?
Если Истина ИЛИ ССылка.НесуществующийРекизит
24 Ненавижу 1С
 
гуру
16.02.11
13:04
Напиши строку полностью что ли, ну и может стоит скобки поставить:
( .... И ((ВидПлатежа = &ВидПлатежа) или &ВидЗаполнения)) КАК ПлатежиОстатки
25 Ненавижу 1С
 
гуру
16.02.11
13:05
(23) ну и как ты, чувачок, проверишь проверяет он второе условие или нет?

кстати в (0) вообще кусок не рабочий, имхо
26 Ненавижу 1С
 
гуру
16.02.11
13:06
(23) хотя для составных типов, этож буде NULL (гыгыгыгы)
тогда обязан проверить
27 Живой Ископаемый
 
16.02.11
13:07
я проверил.

вот такой запрос:

ВЫБРАТЬ
   Банки.Ссылка
ИЗ
   Справочник.Банки КАК Банки
ГДЕ
   ИСТИНА Или &Параметр

выдаст результат при значении Параметр равное лжи, значит в запросе тоже логическое выражение вычисляется не до конца
28 Stado_adama
 
16.02.11
13:07
(25) Код не рабочий, но и критических ощибок он не выдает...
кстати я вот тут недельку назад писал условие вот так вот:
   И (ЦветомодельКоллекционныеАтрибуты.Поставщик.ПоставщикКоммерческий = &Поставщик ИЛИ &ПоставщикЗаполнен = 0)

и оно нормально отрабатывало...
29 Живой Ископаемый
 
16.02.11
13:07
еще вопросы? :)
30 Axel2009
 
16.02.11
13:08
(28) что значит нормально?
31 Живой Ископаемый
 
16.02.11
13:08
нет, фигня
32 Живой Ископаемый
 
16.02.11
13:08
ничего не доказывает
33 Axel2009
 
16.02.11
13:08
(27) с чего бы вдруг не до конца? =)
34 Ненавижу 1С
 
гуру
16.02.11
13:08
(27) вывод не верный потому что "Истина или Ложь" дает "Истина"
35 Ненавижу 1С
 
гуру
16.02.11
13:09
(32) передай туда NULL
36 Живой Ископаемый
 
16.02.11
13:09
Да, в запросе вычисляет скорее всего до конца.. Потому что вот такой запрос:

ВЫБРАТЬ
   Банки.Ссылка
ИЗ
   Справочник.Банки КАК Банки
ГДЕ
   ИСТИНА Или &Параметр

Где Параметр я устанавливаю Дате - выдает ошибку

Текст запроса: Строка 6: {(6,8)}: Неверные параметры "ИЛИ"
ИЛИ <<?>>&Параметр)
37 Живой Ископаемый
 
16.02.11
13:11
Тоже самое:

ВЫБРАТЬ
   Банки.Ссылка
ИЗ
   Справочник.Банки КАК Банки
ГДЕ
   ИСТИНА Или Банки.НесуществующееПоле


Текст запроса: Строка 6: {(6,19)}: Поле не найдено "Банки.НесуществующееПоле"
ИСТИНА Или Банки.<<?>>НесуществующееПоле


====

(0)Чувак, переписывай запрос
38 fisher
 
16.02.11
13:11
(36) Не факт. Параметры могут заранее проверяться.
Короче, фиг проверишь. Вообще, подозреваю что метод вычисления логических выражений может быть вообще опциональным на серваке SQL
39 acsent
 
16.02.11
13:12
И эти люди ратуют за советское образование
40 fisher
 
16.02.11
13:12
(37) Это тоже ничего не доказывает.
41 hhhh
 
16.02.11
13:13
если телепатировать, наверняка у него ВидПлатежа NULL.
42 Axel2009
 
16.02.11
13:13
(38) скулю пойдет весь запрос, 1ска вырезать ничего не будет..
43 Живой Ископаемый
 
16.02.11
13:14
В тоже время в коде:

http://screencast.com/t/8gJDklqpX4
44 fisher
 
16.02.11
13:14
(42) Кэп? Речь о том, как скуль будет считать.
45 Живой Ископаемый
 
16.02.11
13:14
2(42) если пропустит его предварительно
46 Axel2009
 
16.02.11
13:14
(43) сравнил теплое и мягкое =)
47 Живой Ископаемый
 
16.02.11
13:15
2(40) в свете (43) имеем явное различие между тем что делается в коде и в запросе.
48 Живой Ископаемый
 
16.02.11
13:16
2(46) Ну, в этом и был пойнт.
49 Ненавижу 1С
 
гуру
16.02.11
13:16
(43) хаха, если 1С ЭТО вычисляет, то она шляпа
50 Живой Ископаемый
 
16.02.11
13:17
2(49) Это рекламировалось как огромный шаг в перед по сравнению с 77 еще как только 8.0 вышла.
51 fisher
 
16.02.11
13:18
(47) Разве что. Не слишком ценная информация, поскольку и так ясно что запрос выполняет сиквел, а код 1С - сама 1С.
52 Живой Ископаемый
 
16.02.11
13:18
и по сути в (0) об этом и вопрос. Теперь мы знаем что для запросов это не работает.
53 fisher
 
16.02.11
13:19
(50) А это разве не так? Избавляет от вложенных условий не в ущерб быстродействию.
54 Живой Ископаемый
 
16.02.11
13:20
2(51) Все верно, но прежде чем СКЛ получит свой текст запроса, 1С должна будет транслировать Банки.НесуществующееПоле в СКЛ-представление. Сделать этого не может. И поэтому понятно, почему она в случае языка запросов вычисляет логчиские выражения до конца, а не как в коде - чтобы СКЛ не сошел с ума.
55 Axel2009
 
16.02.11
13:21
(44) судя по планам - если первое условие истина - то второе игнорирует.
56 Ненавижу 1С
 
гуру
16.02.11
13:21
(50) это имеет право на жизнь, только по причине нетипизированности 1С
вообще весь плюс тут когда используются именно методы или обращения по ссылкам к базе:

Если МетодА() или МетодБ() Тогда
57 Живой Ископаемый
 
16.02.11
13:21
2(53) этот вопрос я переадресую (49), потому что мне по правде все равно. :) Главное чтобы я это знал и мог использовать.
58 fisher
 
16.02.11
13:21
(52) Но мне до сих пор непонятно, будет ли в сиквеле использовано полное вычисление логических выражений или сокращенное.
59 Ненавижу 1С
 
гуру
16.02.11
13:22
(55) судя по планам также можно сделать вывод, что оптимизатор увидев заранее истинное условие: "Истина или А" просто выплюнул это условие вообще
60 Живой Ископаемый
 
16.02.11
13:23
(58) думаю это можно почитать в доке к окнкретной СУБД. :)
61 Axel2009
 
16.02.11
13:23
(53)+ если задана константа в первом условии. если зависит от поля таблицы - то вычисляться будут оба каждый раз..
62 fisher
 
16.02.11
13:25
(54) Да ничего она (1С) не вычисляет. Не путай синтаксическую проверку запроса с его выполнением. Вычисляет она в файловой версии.
63 fisher
 
16.02.11
13:28
(60) Скорее всего. И скорее всего это опционально. Помню, в настройках компиляторов тоже можно было выбирать, какой метод вычисления логических выражений использовать.
64 fisher
 
16.02.11
13:30
Хотя мне навскидку сложно предположить, какая польза может быть от полного вычисления логических выражений. Разве что на этапе отладки можно больше глюков выгрести.
65 Живой Ископаемый
 
16.02.11
13:31
Зависит от оператора сравнения:
http://screencast.com/t/eLMAcbAW3
66 Ненавижу 1С
 
гуру
16.02.11
13:31
(64) ну если оба условия не только вычисляют что-то, но и изменяют состояние
хотя имхо плохой код это
67 Axel2009
 
16.02.11
13:33
(65) потому что сначала выполняется ИЛИ, а потом И
68 Ненавижу 1С
 
гуру
16.02.11
13:34
(64) еще 1С такой скрин и еще больше буду ненавидеть 1С, за

А = Истина или Перечисления.СтавкиНДС.НДС18;
Сообщить(А); //выдает Истина

))
69 Живой Ископаемый
 
16.02.11
13:35
70 Axel2009
 
16.02.11
13:37
(69) ответ в (67)
71 Живой Ископаемый
 
16.02.11
13:38
2(70)я ничего не спрашиваю. :) попробуй просветить кого-то другого. :)
72 Живой Ископаемый
 
16.02.11
13:45
2(62) да, наверное ты прав... Тут до вычислений вообще не доходит.
73 fisher
 
16.02.11
14:37
(68) Считает абсолютно правильно. Просто в идеале при синтаксической проверке модуля должно ругаться.
74 5 Элемент
 
16.02.11
15:41
(49) а что собственно не так?
75 Ненавижу 1С
 
гуру
16.02.11
15:43
(74) NULL<>НЕОПРЕДЕЛЕНО
76 5 Элемент
 
16.02.11
15:48
(75) а она говорит что NULL=НЕОПРЕДЕЛЕНО ?
77 Ненавижу 1С
 
гуру
16.02.11
16:01
(76) я говорю, а 1С меня не понимает, НЕНАВИЖУ!
78 Живой Ископаемый
 
16.02.11
16:03
79 Ненавижу 1С
 
гуру
16.02.11
16:07
(78) сукин сын!!!
80 Axel2009
 
16.02.11
16:09
(78) вообще NULL <> NULL если что =) так что шляпа!
81 fisher
 
16.02.11
16:12
Это стёб, или кому-то до сих пор что-то с NULL непонятно?
82 Axel2009
 
16.02.11
16:14
(81) NULL = NULL - Ложь по определению =) а в 1с - Истина =)
83 Живой Ископаемый
 
16.02.11
16:16
2(82) В запросах - Ложь, в коде - истина...
84 Axel2009
 
16.02.11
16:18
(83) и как можно сравнить ничто с ничтом? =)
85 Живой Ископаемый
 
16.02.11
16:18
86 fisher
 
16.02.11
16:18
(82) А... Есть такой ньюанс :)
Но он логичен и объясним. В языке запросов - всё канонично. Для логических операций с NULL есть специальный оператор.
Но во внутреннем языке выборку тоже нужно как-то анализировать? Решили не заморачиваться с новыми операторами и заставить работать стандартные :) Ибо в этот момент финты ушами с NULL в SQL уже теряют смысл. Вполне логичный ход.
87 Живой Ископаемый
 
16.02.11
16:18
2(84) без понятия, меня это не касается...