|
Для знатоков MSSQL. Ошибка возникает только в серверном режиме. | ☑ | ||
---|---|---|---|---|
0
ssalikoff
12.04.16
✎
04:06
|
В полностью типовой конфигурации УТ 11.2.3.108 в модуле формы «ФормаВыбораИзДокуменов» справочника «УпаковкиЕдиницыИзмерения»
имеется следующий код: ВЫБРАТЬ СпрУпаковки.Ссылка КАК Ссылка, СпрУпаковки.Числитель / СпрУпаковки.Знаменатель КАК Коэффициент ИЗ Справочник.Номенклатура КАК СпрНоменклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК СпрУпаковки ПО (СпрУпаковки.Владелец = ВЫБОР КОГДА СпрНоменклатура.НаборУпаковок = ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ИндивидуальныйДляНоменклатуры) ТОГДА СпрНоменклатура.Ссылка КОГДА СпрНоменклатура.НаборУпаковок <> ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ПустаяСсылка) ТОГДА СпрНоменклатура.НаборУпаковок ИНАЧЕ ЛОЖЬ КОНЕЦ) ГДЕ СпрНоменклатура.Ссылка = &Номенклатура И НЕ СпрУпаковки.ПометкаУдаления УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ Попытка выполнить запрос заканчивается неудачей: система сообщает, что происходит деление на 0. При этом СпрУпаковки.Знаменатель не равен нулю, он у меня для любой номенклатурной позиции равен 1. http://f-picture.net/fp/67b7387a49a44b85a2eef41299098e13 http://radikal.ru/fp/b41fcae3a5d842be9bcf46e2f2ca6669 База работает через MSSQL. Интересные моменты: 1. Тот же запрос, выполняемый на файловой базе, отрабатывает безошибочно. 2. Если убрать ИЕРАРХИЯ из запроса, то запрос выполнится без проблем. 3. Выражение в скобках после ПО может принимать три возможных значения, которые возвращает оператор ВЫБОР. Пробую упростить выражение. Меняю выражение в скобках последовательно на СпрУпаковки.Владелец = СпрНоменклатура.Ссылка СпрУпаковки.Владелец = СпрНоменклатура.НаборУпаковок СпрУпаковки.Владелец = ЛОЖЬ При любом варианте запрос выполняется без проблем. Я решил, что проблема, возможно, находится в SQL-сервере. Перенес базу на другую машину, на другой SQL-сервер (другой версии). То же самое: проблема остаётся. Думаю дальше: может быть, платформа (у меня последняя, 8.3.7.2008) как-то неправильно генерирует запрос для SQL? Проверим. Запускаем профайлер, получаем результирующий запрос: http://pastebin.com/Q1wveSK7 Экспериментирую с запросом в SQL Management Studio. «Обнаружена ошибка: деление на ноль.» — говорит система. Проверяю — в T2._Fld7361 находится 1. В секции ORDER BY находятся два поля. Если убрать любое из них, оставив одно, ошибка исчезает. Если их поменять местами, ошибка исчезает. Проведя такое исследование проблемы, я так и не понял её причины. Не хватает знаний. Саму проблему я обошёл, переписав немного код в модуле формы. Но мне очень хочется знать причины подобного поведения и поэтому я обращаю свой вопрос к знатокам SQL: что это всё значит? Почему и отчего? Да, кстати, проблема появилась в релизе 11.2.3.108 (именно в нём разработчики изменили код запроса). Релиз уже недели три как вышел, но на сайте обновлений нет никакой информации о планируемых версиях. Вообще. Ведь, наверное, тысячи людей должны были столкнуться с этой ошибкой, которая просто не позволяет работать и которую нельзя обойти без изменения кода. |
|||
1
mehfk
12.04.16
✎
06:09
|
Не в курсе устройства УТ 11, но в Справочник.УпаковкиЕдиницыИзмерения у тебя группы есть?
|
|||
2
vvp91
12.04.16
✎
06:17
|
Для отладки замени поле Коэффициент на два поля - Числитель и Знаменатель. Выведи запрос в консоле. Посмотри на выгрузку, увидишь записи с нулевым знаменателем.
|
|||
3
Ёпрст
12.04.16
✎
07:37
|
зачем сравнивать
СпрУпаковки.Владелец с СпрНоменклатура.НаборУпаковок ???? Это всегда ЛОЖЬ ибо ССылка на Номенклатуру никогда не равна ссылке Справочник.НаборыУпаковок |
|||
4
Фрэнки
12.04.16
✎
08:01
|
мявкну такое: mssql какого релиза? может уже пора обновить его на 2014-ый? Если ставим платформу последнего релиза, то почему субд в соответствующий ей релиз не ставим?
|
|||
5
assasu
12.04.16
✎
08:26
|
валится на группах. у групп К=0
|
|||
6
Фрэнки
12.04.16
✎
08:36
|
(5) лично я только не пойму, почему у ТС группы вылазят только в серверном режиме? разные данные использует в тестах?
|
|||
7
assasu
12.04.16
✎
08:39
|
(6) хз.
|
|||
8
Тролль главный
12.04.16
✎
08:43
|
(6) по-разному движок обрабатывает
|
|||
9
assasu
12.04.16
✎
08:45
|
(8) в конфигураторе для реквизитов есть настройки "Для элементов", "Для групп","Для Групп и элементов". Может файловая уже правильно понимает это заранее ?
|
|||
10
Fedor-1971
12.04.16
✎
08:48
|
(0) Иерархия Ссылка - формирует сводную запись, как думаешь СпрУпаковки.Знаменатель = Сколько?
Для чистоты эксперимента - выгрузи серверную БД в DT и загрузи в файловую, выполни запрос и посмотри что произойдёт. (9) это вряд ли, в запросе создано вычисляемое поле. Скорее всего просто использует для тестов данные без групп |
|||
11
Тролль главный
12.04.16
✎
08:51
|
(9) надо профайлер смотреть у серверной базы
|
|||
12
Fedor-1971
12.04.16
✎
08:52
|
(10) ошибся! в запросе Упорядочить, а не Сгруппировать
|
|||
13
trdm
12.04.16
✎
08:53
|
Когда уже Asmody сделает теги для кода...
|
|||
14
Фрэнки
12.04.16
✎
09:08
|
(8) да фиг с ним с движком, но таблица на выходе должна быть с одинаковыми строками, по идее. Ну на одинаковых данных, конечно.
|
|||
15
ssalikoff
12.04.16
✎
09:53
|
(4) MSSQL 2014
На другой машине, где я пробовал, 2008 стоит Поведение одинаковое |
|||
16
Ёпрст
12.04.16
✎
09:54
|
(15) к чему вообще этот г-код ?
|
|||
17
ssalikoff
12.04.16
✎
09:55
|
(10)
«Для чистоты эксперимента - выгрузи серверную БД в DT и загрузи в файловую, выполни запрос и посмотри что произойдёт. » Именно это я и сделал. Об этом написано в (0) |
|||
18
ssalikoff
12.04.16
✎
09:57
|
(16) Этот код выполняется при выборе упаковки из выпадающего списка.
В любом документе, где в табличной части указывается номенклатура, также указывается упаковка. И вот при попытке её выбора работает этот код. |
|||
19
Ёпрст
12.04.16
✎
09:58
|
(17) см. (2),(3)
|
|||
20
ssalikoff
12.04.16
✎
09:58
|
(11) Это сделано. Об этом написано в (0). Результаты проанализированы и выложены для обозрения
|
|||
21
rs_trade
12.04.16
✎
09:59
|
(0) Проверяю — в T2._Fld7361 находится 1.
А как ты это проверяешь? |
|||
22
ssalikoff
12.04.16
✎
10:00
|
(21) select T2._Fld7361 from ....
это очевидно |
|||
23
ssalikoff
12.04.16
✎
10:02
|
(3) Бред.
|
|||
24
Ёпрст
12.04.16
✎
10:04
|
(23) че бред ?
|
|||
25
Ёпрст
12.04.16
✎
10:05
|
КОГДА СпрНоменклатура.НаборУпаковок <> ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ПустаяСсылка)
ТОГДА СпрНоменклатура.НаборУпаковок это че, по твоему ? |
|||
26
ssalikoff
12.04.16
✎
10:05
|
(24) Сообщение в (3). Вы в курсе, как в УТ 11.2 реализован механизм упаковок номенклатуры?
|
|||
27
rs_trade
12.04.16
✎
10:05
|
(22) поставь поле просто рядом в запросе, а вместо него единицу. посмотри выборку.
(CAST(T2._Fld7360 AS NUMERIC(20, 8)) / 1, T2._Fld7361, |
|||
28
Ёпрст
12.04.16
✎
10:06
|
зачем иннер джоин вот с этим ???
ПО (СпрУпаковки.Владелец = СпрНоменклатура.НаборУпаковок) ??? это всешда ложь |
|||
29
Ёпрст
12.04.16
✎
10:07
|
(26) нет, но если ты сравниваешь перед этим
НаборУпаковок <> ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ПустаяСсылка) отсюда следует, что НаборУпаковок - тип Справочник.НаборыУпаковок, а не Справочник.Номенклатура.. |
|||
30
Ёпрст
12.04.16
✎
10:07
|
дальше смотри (28)
|
|||
31
Ёпрст
12.04.16
✎
10:08
|
ну и (3).
|
|||
32
ssalikoff
12.04.16
✎
10:08
|
(27) Именно так и делал! T2._Fld7361 = 1 (Это знаменатель)
(CAST(T2._Fld7360 AS NUMERIC(20, 8)) / 1 (Это числитель) Все выполняется корректно. Вот именно поэтому я и недоумеваю и задаю вопрос на форуме. Как это такое может быть? |
|||
33
ssalikoff
12.04.16
✎
10:10
|
(31) Ещё раз повторяю - если интересно, откройте УТ 11.2 и посмотрите, как устроен справочник УпаковкиНоменклатуры. Всё в коде правильно. Тем более, что он типовой, а не мой собственный.
|
|||
34
rs_trade
12.04.16
✎
10:11
|
(0) Если убрать ИЕРАРХИЯ из запроса, то запрос выполнится без проблем.
А это уже не этот, а следующий запрос от сервера 1с. В этом запросе нет проблем значит. |
|||
35
ssalikoff
12.04.16
✎
10:21
|
(34) не понял. Какой ещё следующий запрос от сервера?
|
|||
36
Карупян
12.04.16
✎
10:22
|
если без иерархии работает, то сделай проверку на группы
|
|||
37
ssalikoff
12.04.16
✎
10:24
|
(36) что значит проверку на группы? что именно проверить?
|
|||
38
Фрэнки
12.04.16
✎
10:34
|
(37) у элемента реквизит или поле - есть
у группы - нет " по иерархии " дополняет выборку строками с группами но почему-то в случае выборки из файлового режима работы базы этих строк нет. Может быть это как-то связано с версией платформы или еще с чем-то подобным, т.к. версии mssql вы использовали разные и результаты серверного режима у вас одинаковые. |
|||
39
rs_trade
12.04.16
✎
10:36
|
(35) ИЕРАРХИЯ это же чисто 1с-ная фича и выполняется доп. запросами.
получается основной набор данных, сервер 1с их колбасит у себя и кидает еще доп. запросы к скл. |
|||
40
rs_trade
12.04.16
✎
10:39
|
+(39) правда делений там быть никаких не должно вроде как.
Чет путано немного. Если убрать ИЕРАРХИЯ из запроса, то запрос выполнится без проблем. Но в приведенной трассе и так нет никаких иерархий. |
|||
41
Тролль главный
12.04.16
✎
10:39
|
ВЫБОР КОГДА НЕ СпрУпаковки.ЭтоГруппа ТОГДА СпрУпаковки.Числитель / СпрУпаковки.Знаменатель КОНЕЦ
|
|||
42
ssalikoff
12.04.16
✎
10:47
|
(40) Я без понятия, как платформа транслирует запрос из языка 1С в T-SQL
Ведь в T-SQL нет оператора ИЕРАРХИЯ, он там как-то по другому реализуется? |
|||
43
ssalikoff
12.04.16
✎
10:51
|
(39) Кстати, может я в профайлере что-то упустил, и какие-то дополнительные запросы платформы не увидел. Но, я думаю, это не очень страшно, так как в той трассе, что я привёл, ошибка и возникает.
|
|||
44
MiniMuk
13.04.16
✎
10:42
|
Потверждаю та же ошибка. Создали группу в единицах измерений, при выборе единиц измерений в скульной версии падаете, ищу варианты решений
|
|||
45
Карупян
13.04.16
✎
10:45
|
(43) Покажи запрос SQL который падает
|
|||
46
Фрэнки
13.04.16
✎
10:55
|
(45) так все о том, что в (0) - и он типовой вроде бы.
|
|||
47
Карупян
13.04.16
✎
10:56
|
ну и что в типовых ошибок чтоли не бывает?
|
|||
48
Фрэнки
13.04.16
✎
11:06
|
(47) Ты спросил где текст запроса - я ответил.
Что бывает в типовых или нет, я не обсуждал, сказал только к тому, что его можно в своем конфиге найти при желании |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |