Имя: Пароль:
1C
1С v8
Для знатоков 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) Ты спросил где текст запроса - я ответил.
Что бывает в типовых или нет, я не обсуждал, сказал только к тому, что его можно в своем конфиге найти при желании