Имя: Пароль:
1C
1С v8
Чудеса с индексами.
0 H A D G E H O G s
 
22.03.13
16:15
День добрый.
Прошу подтвердить ошибку платформы.

Запрос вида:

ВЫБРАТЬ
   МИНИМУМ(Справочник.Данное) КАК Данное
ИЗ
   Справочник.Справочник КАК Справочник
ГДЕ
   Справочник.Данное > 4.6

При условиях:
Справочник.Данное - тип Число (5.0), индексированное

для данных
1,2,3,4,5,6,7,8....
вернет 6 вместо 5.

8.2.17.169, но думаю, воспроизведется на всех 8.2

dt-шничег
http://zalil.ru/34371432
1 Фрагстер
 
22.03.13
16:16
(0) там неявный каст происходит
2 Фрагстер
 
22.03.13
16:17
Выразить(Справочник.Данное КАК Число(6,1)) > 4.6
3 H A D G E H O G s
 
22.03.13
16:17
Казалось бы херня, но эта херня выела мне мозг при расчетах по спирту.
4 Фрагстер
 
22.03.13
16:17
и дело даже не в том, что оно индексированное, а что приводится правое к левому, а не наоборот
5 Фрагстер
 
22.03.13
16:18
(3) мне выело мозг то, что для дробных точность 6 ставится, если напрямую не сказать больше...
6 H A D G E H O G s
 
22.03.13
16:18
(2) Это то понятно, не понятно (0).
7 H A D G E H O G s
 
22.03.13
16:18
(4) Почему, когда не индексированное - ничего такого нет?
8 Фрагстер
 
22.03.13
16:19
попробуй 4.6 < Справочник.Данное
9 sapphire
 
22.03.13
16:19
(0) Автор, подтверждаю, что у тебя ошибка в ... ДНК.
Справочник.Данное > 4.6
При условиях:
Справочник.Данное - тип Число (5.0), индексированное,

Будет равносильно Справочник.Данное >5

Учи матчасть :)
10 H A D G E H O G s
 
22.03.13
16:21
(9) Специально для таких мозгоклюев не сказал, что под SQL все нормально.
11 H A D G E H O G s
 
22.03.13
16:21
(8) Тоже самое.
12 Фрагстер
 
22.03.13
16:21
(10) пиши в 1с, пусть правят
13 sapphire
 
22.03.13
16:23
(10) Не имеет значения где именно. Это не ошибка самой 1С и индексы тут вообще не при делах.
14 H A D G E H O G s
 
22.03.13
16:23
(12) Выразить(Справочник.Данное как Число(6,1))>4.7

Вполне меня удовлетворит.
15 H A D G E H O G s
 
22.03.13
16:23
(13) Расскажи об этом SQL-ю.
16 Фрагстер
 
22.03.13
16:24
(14) только вот индекс тогда не работает
17 H A D G E H O G s
 
22.03.13
16:25
(16) гхм....
18 H A D G E H O G s
 
22.03.13
16:25
Индексы там нужны, там у нас большая табличка то.
19 sapphire
 
22.03.13
16:26
(15) При чем здесь SQL?
Ты со своими мозгами разберись сначала.
Ты сравниваешь числа разной точности и утверждаешь, что виноваты индексы.
20 H A D G E H O G s
 
22.03.13
16:26
2 запроса штоле, под файловую - с Выразить, под SQL - без выразить. Файловая то для отладки нужна так то.
21 sapphire
 
22.03.13
16:27
(20) Да там вообще неважно какая база, а важно как правильно написать запрос, ИМХО.
22 trad
 
22.03.13
16:27
(9) а почему у mssql это не равносильно?
у них тоже с матчастью туго?

declare t table(a int, b numeric(5,0))
insert into t values (4,4)
insert into t values (5,5)
insert into t values (6,6)
select min(b) from t where b > 4.6

-------
5

(1 row(s) affected)
23 H A D G E H O G s
 
22.03.13
16:28
(19) Ты dtшнег скачал хоть?
24 sapphire
 
22.03.13
16:30
(22) Потому что в 1С на SQL поедет иная конструкция.
25 sapphire
 
22.03.13
16:32
(23) Ну скачал и что? И что это меняет?
26 sapphire
 
22.03.13
16:33
Запрос=Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |    МИНИМУМ(Справочник.Данное) КАК Данное
   |ИЗ
   |    Справочник.Справочник КАК Справочник
   |ГДЕ
   |    1.0000000000000000000000*Справочник.Данное > 4.6";
   Выборка=Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
       Сообщить("Минимум справочника >4.6 равен "+Выборка.Данное);
   КонецЕсли;
27 trad
 
22.03.13
16:33
пофиг что куда поедет.
Ты сказал, что у тех у кого ДНК в норме, кто дружит с мозгами и знает матчасть,
Выражение (Данное > 4.6) равносильно выражению (Данное > 5), если Данное - не дробного типа.
Так ведь?
Так вот, например, mssql с тобой не согласен.
28 trad
 
22.03.13
16:34
(27) к (24)
29 H A D G E H O G s
 
22.03.13
16:34
(24)

Все тоже самое туда поедет

exec sp_executesql N'SELECT
MIN(T1._Fld24865)
FROM _Reference24862 T1 WITH(NOLOCK)
WHERE (T1._Fld24865 > P1)',N'P1 numeric(2,1)',4.7
30 sapphire
 
22.03.13
16:35
(27) Речь об 1С, а не о SQL
31 H A D G E H O G s
 
22.03.13
16:35
Кстати, Выразить() вполне себе Индекс использует
32 H A D G E H O G s
 
22.03.13
16:37
Но за решение
1.0*Справочник.Данное

спасибо.

Тоже польза от тебя есть.
33 sapphire
 
22.03.13
16:38
(29) SQL и файловая 1С по-разному приводят числа к одинаковой точности.
34 sapphire
 
22.03.13
16:38
(32) Решение старо, как мир :)
35 К_Дач
 
22.03.13
16:39
(32) ты же знаешь, что в запрос например в качестве параметра не рекомендуется передавать таблицу значений, колонка которой не типизирована заранее? здесь тоже самое. а 1.0*переменная - это и есть явная типизация к типу Real
36 H A D G E H O G s
 
22.03.13
16:39
(33) Файловая по запросу к индексному полю и файловая по запросу к безындексному полю по разному приводят числа к одинаковой точности.
37 H A D G E H O G s
 
22.03.13
16:40
(35) Какое не рекомендуется?! 1С пошлет к херам нетипизированную таблицу и все будет хорошо.
38 К_Дач
 
22.03.13
16:41
ты сравниваешь в запросе два числа различного типа, вот я к чему
39 trad
 
22.03.13
16:42
(30) осталось понять чья матчасть правильная (1c vs sql) и стоит ли посылать учить неправильную
40 sapphire
 
22.03.13
16:43
(39) Нужно учить ту матчасть кою используешь.
Если в 1С, то 1С, если в SQL, то в sql
41 H A D G E H O G s
 
22.03.13
16:44
(40) 1С придется учить 2-х типов - для индексного поля - Цел(), для не индексного - Окр(). Ага.
42 sapphire
 
22.03.13
16:49
(41) Сорьки, поигрался с индексацией, выспылил, был не прав :))))
43 sapphire
 
22.03.13
16:49
а ведь фича.
44 trad
 
22.03.13
16:49
(40) так почему матчасть зависит от того проиндексировано поле или нет?
45 К_Дач
 
22.03.13
16:49
(41) то есть ты утвержадешь, что индексирование числового реквезита (поля) в 1С преобразует его тип? То есть 5 ---> 5.000 ?
46 trad
 
22.03.13
16:50
(43) вот именно -баг
47 Hmster
 
22.03.13
16:50
ВЫБРАТЬ
   ВЫРАЗИТЬ(4 КАК ЧИСЛО(2,1)) КАК Данное
ПОМЕСТИТЬ Справочник_Справочник
ОБЪЕДИНИТЬ
ВЫБРАТЬ    5
ОБЪЕДИНИТЬ
ВЫБРАТЬ 6
ИНДЕКСИРОВАТЬ ПО
   Данное
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   МИНИМУМ(Справочник.Данное) КАК Данное
ИЗ
   Справочник_Справочник КАК Справочник
ГДЕ
   Справочник.Данное > 4.6
48 H A D G E H O G s
 
22.03.13
16:51
(42) "Я ... и закурил."
49 Hmster
 
22.03.13
16:51
для тех кому грузить лень.
попробуйте поменять 1 на 0
50 sapphire
 
22.03.13
16:52
кстати, проверял на 8.3 - таже хрень.
51 Serginio1
 
22.03.13
16:52
Скорее всего в файловом варианте (4.6) округляется до 5 ти.
В SQL по другому.
52 sapphire
 
22.03.13
16:53
(44) Видимо, строение индекса в файловой версии влияет.
53 Ёпрст
 
22.03.13
16:53
(47)
5
54 Hmster
 
22.03.13
16:53
8.2.15 та же фигня
55 Ёпрст
 
22.03.13
16:53
на скуле в 8.1
в 8.2 ща посмотрю
56 Serginio1
 
22.03.13
16:53
Попробуй
Справочник.Данное >= 4.6
57 sapphire
 
22.03.13
16:53
(51) Нет, SDBL одинаковый.
58 Hmster
 
22.03.13
16:53
(53) в файловой? 1 на 0 менял?
59 H A D G E H O G s
 
22.03.13
16:53
(49) Там загвоздка в

ИНДЕКСИРОВАТЬ ПО
   Данное
60 H A D G E H O G s
 
22.03.13
16:54
(56) Будет 5 и это логично, и это мне не надо.
61 Hmster
 
22.03.13
16:55
да если ее убрать ли через выразить указать что дробное
62 Serginio1
 
22.03.13
16:56
Вернее что выдает Справочник.Данное = 4.6
63 Serginio1
 
22.03.13
16:57
(62) в SQL и файловом варианте?
64 Classic
 
22.03.13
16:57
(32)
Чем это лучше ВЫРАЗИТЬ?
65 К_Дач
 
22.03.13
16:57
Да, реально, если закомментить ИНДЕКСИРОВАТЬ ПО
   Данное - результат меняется...

всегда в запросе пользоваться 1.0000 * Данное - к себе в мемориз...
66 Serginio1
 
22.03.13
16:58
а по индексу она ищет, так как в поиск в функцию сравнению нужно и передавать нужный тип.
67 МихаилМ
 
22.03.13
17:01
после 13 релиза 1с в ms sql намного меньше стало использовать
CAST. так что подобные проблемы возможны.

раньше в CAST было обрамлено буквально все.
приходилось чистить код.
68 trad
 
22.03.13
17:06
(57) тем не менее баг проявляется на файловом варианте, на серверном (с mssql) - нет
69 mikecool
 
22.03.13
17:09
(10)а в разных скулях - отличается?
70 H A D G E H O G s
 
22.03.13
17:15
(69) Вот я еще разные Скули не ставил.
71 Serginio1
 
22.03.13
17:24
(32) Если данное будет 4.99 то не спасет.
тогда 1.000000000000000000000000..... На все случаи жизни
72 Serginio1
 
22.03.13
17:35
Кстати по приведению типа в SQL
http://technet.microsoft.com/ru-ru/library/ms187928.aspx
Например, результатом следующего преобразования будет 10:

SELECT CAST(10.6496 AS int);