Имя: Пароль:
1C
1С v8
Стоит ли менять Или на И в условиях запроса
0 arancar
 
12.10.21
11:43
В рамках задачи нужно было при подготовке данных для формируемого внешнего источника данных отчета сформировать таблицу, прокинув условия по необязательным параметрам формирования отчета, т.е. добавить к двум десяткам запросов по 3-5 условий вида
<code>
&ИспользованиеФильтра И (ВТ.Поле1 = &Фильтр) Или Не &ИспользованиеФильтра
</code>
Раскладывать подобный запрос с учетом возможных сочетаний через объединения бессмысленно. Имеет ли смысл в подобных ситуациях играться с булевой алгеброй и заменять условие по "Или" через условие по "И" и "Не"
<code>
A или B = Не (Не А И Не B)
</code>
что с учетом сокращенного вычисления логических выражений сводит исходное условие к
<code>
Не (&ИспользованиеФильтра И Не ВТ.Поле1 = &Фильтр)
</code>
1 Asmody
 
12.10.21
11:47
Только профайлер тебе даст точный ответ на этот вопрос.
2 ДенисЧ
 
12.10.21
11:50
Имеет смысл в этом случае воспользоваться компоновкой или построителем запроса.
Или руками собирать текст запроса.
А не извращаться с условиями.
3 pechkin
 
12.10.21
11:54
Не &ИспользованиеФильтра  ИЛИ ВТ.Поле1 = &Фильтр
4 arancar
 
12.10.21
12:01
(2) Спасибо, раньше с объектом Построитель не сталкивался, хотя и использовал Компановку данных внутри СКД отчетов. Похоже идеальное решение и значительно упростит читабельность кода самого запроса.
5 ДенисЧ
 
12.10.21
12:02
"Стаж: 7 лет 10 месяцев"
Я ухожу в афуй, извинте.
6 arancar
 
12.10.21
12:04
(3) Основная задача - уйти от табуированного использования Или в условии запроса.
7 acht
 
12.10.21
12:05
(6) > табуированного
Кем и почему?
8 polosov
 
12.10.21
12:07
(7) Он про ИЛИ в секции ГДЕ, наверное.
9 acht
 
12.10.21
12:08
(8) Да какая разница
Что плохого в конструкции (Поле1 = 1) ИЛИ (Поле1 = 2) ?
10 mikecool
 
12.10.21
12:09
(9) иногда плохо, но надо смотреть планы запросов
11 polosov
 
12.10.21
12:09
(9) Ответ на ИТС есть. Такое рекомендуется заменять объединением запросов
12 acht
 
12.10.21
12:11
(10) К чорту ИТС, мне нужна конкретно твоя интрепретация.

И чем это условие отличается от Поле1 В (1, 2) ?
13 youalex
 
12.10.21
12:11
(9) тем что его можно заменить на Поле1 В (1, 2)
)
14 acht
 
12.10.21
12:11
(13) Нетарапись =)
15 Малыш Джон
 
12.10.21
12:12
(13) а в чем разница?
16 youalex
 
12.10.21
12:12
(14) не успел)
17 Малыш Джон
 
12.10.21
12:14
(9) вот интересно, а если заменить на

НЕ((Поле1 <> 1) И (Поле1 <> 2))

это улучшит ситуацию?
18 polosov
 
12.10.21
12:15
(17) Если невозможно будет использовать индексы, то не улучшит.
19 mikecool
 
12.10.21
12:15
(12) согласен про ИТС, только хардкор!
20 2mugik
 
12.10.21
12:19
(0)Ставлю на черное) Если индексы есть МС СКЛ их найдет. А так имхо ответ в 1.
21 pechkin
 
12.10.21
12:19
условие на <> еще хуже чем или
22 Малыш Джон
 
12.10.21
12:20
(21) чем же?
23 acht
 
12.10.21
12:25
(19) Ну, есть надежда, что он сам ИТС откроет и прочитает.
Вторая надежда, что он попытается понять и третья - что сможет пересказать своими словами...
24 ДенисЧ
 
12.10.21
12:33
Кому не нравится (по религиозным соображениям) ИТС, можете почитать вот это
http://rsdn.org/forum/db/8090508.flat#8090508
25 ILM
 
модератор
12.10.21
12:34
ВЫБОР используйте. Всегда когда есть куча условий в отчете, то мой выбор ВЫБОР.
26 Малыш Джон
 
12.10.21
13:15
(25) а ВЫБОР чем от ИЛИ отличается? В данном контексте.
27 Конструктор1С
 
12.10.21
13:45
НЕ Поле1 = &Значение1 - не будет использовать индекс
Поле1 <> &Значение1 - не будет использовать индекс
Поле1 = &Значение1 ИЛИ Поле1 = &Значение2 Поле1 = &Значение3 - будет использовать индекс (с оговорками)
28 2mugik
 
12.10.21
13:50
(24)rsdn это гуд. Я там про блокировки читал.
29 ДенисЧ
 
12.10.21
13:50
(28) Я в курсе, мне говорили. В смысле, я читал )))
30 Конструктор1С
 
12.10.21
14:00
(27) последнее условие читать так:

Поле1 = &Значение1 ИЛИ Поле1 = &Значение2 ИЛИ Поле1 = &Значение3

это аналог Поле1 В(&Значение1, &Значение2, &Значение3)
31 acanta
 
12.10.21
14:02
А в случае  Поле1 В(&Значение1, &Значение2, &Значение3) индекс используется?
32 Eiffil123
 
12.10.21
14:31
(0) если объем данных небольшой и скорость работы устраивает - не имеет никакого смысла. Заниматься оптимизацией нужно тогда и в тех местах, где это действительно нужно.
33 polosov
 
12.10.21
14:34
(32) А когда база встанет колом, то будет немного поздно.
34 Eiffil123
 
12.10.21
14:38
(33) а почему она должна встать колом? всегда же можно это планировать и этим управлять.
35 Почему 1С
 
12.10.21
14:40
(31) Зависит что планировщик решит, может использовать, а может и нет.
36 acanta
 
12.10.21
14:44
(34) Простите за грубость - аутизм лечится, а карьеризм нет. Планировать и управлять базой человеку неинтересно.
37 polosov
 
12.10.21
14:47
(34) Сегодня ты в базе ХХвП, а завтра ты уйдешь другую организацию говнокодить.
38 Конструктор1С
 
12.10.21
14:51
(31) используется, если это первое поле в индексе, или по более высоким полям индекса было фильтрануто на равно.

Допустим, есть регистр сведений с измерениями Контрагент, Товар, Акция. Все ссылки, идут в перечисленно порядке. Индекс отработает при отборах
Контрагент = ...
Товар = ...
Акция В ()


Контрагент = ...
Товар В ()


Контрагент В ()
39 ДядяМитяй
 
12.10.21
14:52
КОГДА &Фильтр = ЗНАЧЕНИЕ(Справочник.ИлиНеСправочникАЧтоТамУВас.ПустаяСсылка) ТОГДА Истина
ИНАЧЕ (ВТ.Поле1 = &Фильтр)
40 acanta
 
12.10.21
15:03
(38) Спасибо. Смутно что-то помню про порядок измерений в регистрах типовых конфигураций. В регистре остатки товаров -  партия, товар, склад. И получение остатков в форме списка справочника ТМЦ запросом. То есть индексировать регистр вообще смысла не имело.
41 Eiffil123
 
12.10.21
17:15
(37) ну уйдешь и далее что? из-за этого объем данных резко вырастет и запрос перестанет работать?
42 polosov
 
12.10.21
17:16
(41) Ты этого уже не узнаешь.
43 Eiffil123
 
12.10.21
17:23
(42) верно, не узнаешь
44 Eiffil123
 
12.10.21
17:24
можно подумать, вы пишете нетленки на века
45 АнализДанных
 
12.10.21
17:27
(4) Посмотри мое последнее сообщение в этой теме Как избежать рваного запроса Я там приложил процедуру с примером.