Имя: Пароль:
1C
1С v8
Как работает неявное преобразование типов внутри платформы?
0 ssalikoff
 
09.07.19
14:54
Добрый день!
После недавнего обновления платформы до 8.3.15.1489 и релиза УТ до 11.4.8.84 в базе обнаружилась проблема: в списке заказов клиентов в уже закрытых и отработанных заказах процент оплаты и отгрузки стал отображаться 99%.
Стал разбираться. Нашёл проблемное место. Оно находится в процедуре ТаблицаСостоянийЗаказов() модуля менеджера РС СостоянияЗаказовКлиентов. Проблема в запросе, точнее в возвращаемом им значении. Я выкинул всё лишнее из запроса, оставил только саму суть:

ВЫБРАТЬ
    ЗаказыОстатки.ЗаказКлиента КАК ЗаказКлиента,
    СУММА(ЗаказыОстатки.СуммаРасход) КАК СуммаРасход
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(, , , , ЗаказКлиента = &Заказ)  КАК ЗаказыОстатки

СГРУППИРОВАТЬ ПО
    ЗаказыОстатки.ЗаказКлиента
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.СуммаРасход * 100 / Документ.СуммаДокумента КАК ПроцентОтгрузки
ИЗ
    Документ.ЗаказКлиента КАК Документ
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО Документ.Ссылка = ВТ.ЗаказКлиента
ГДЕ
    Документ.Ссылка = &Заказ

ВТ.СуммаРасход равна 10840.00 и Документ.СуммаДокумента равна 10840.00.
Однако ВТ.СуммаРасход * 100 / Документ.СуммаДокумента возвращает значение 99.9999756

Что это значит? Я не могу это объяснить и обращаюсь к вам за помощью.

Если поменять порядок операций, и сначала поделить, а потом умножить, тогда всё в норме:
ВТ.СуммаРасход / Документ.СуммаДокумента  * 100 = 100
Если сделать так: ВЫРАЗИТЬ(ВТ.СуммаРасход КАК Число(15,2)) * 100 / Документ.СуммаДокумента, то снова всё в порядке.

В конфигураторе тип данных обоих операндов Число(15,2), на всяких случай проверил в MSSQL, там тип данных numeric(15,2)
1 Admin_Net_1C
 
09.07.19
14:57
(0) забавно. Подпишусь на тему, интересен ход расследования )
2 vis_tmp
 
09.07.19
15:11
(0)На hotline написал, пример выслал?
3 ssalikoff
 
09.07.19
15:12
(2)подписки нету, ничего выслать не могу
4 ДенисЧ
 
09.07.19
15:14
Тут вроде совсем недавно в одной из тем проскакивало... Похоже, баг платформы.
Или, как они пишут "поведение платформы приведено к ожидаемому" )))
5 Вафель
 
09.07.19
15:14
скуль или файловая?
6 ssalikoff
 
09.07.19
15:15
(5) MSSQL
Хотел в файловом варианте проверить, но не могу: ограничение размера базы не даёт.
7 Ёпрст
 
09.07.19
15:17
(5) >>>на всяких случай проверил в MSSQL, там тип данных numeric(15,2)
8 Вафель
 
09.07.19
15:17
на скуле вроде не может быть такой ошибки. не флоаты же
9 Вафель
 
09.07.19
15:18
хотя это ВТ же. может 1с накосячила с типами временных
10 ssalikoff
 
09.07.19
15:18
(8) Конечно. Поэтому и написал сюда. У меня нет идей, подумал, может здесь кто подкинет мысль
11 Ёпрст
 
09.07.19
15:19
(0)

если тут делаешь

Выразить(СУММА(ЗаказыОстатки.СуммаРасход) как Число(15,2)) КАК СуммаРасход

тоже поди норм ?
12 ssalikoff
 
09.07.19
15:19
(9) Я переписал запрос без временной таблицы, заменив её подзапросом. Проблема осталась. Так что проблема не во временной таблице
13 ssalikoff
 
09.07.19
15:20
(11) Да, тоже всё нормально
14 Ёпрст
 
09.07.19
15:20
(12) ОстаткиИОбороты - это тоже временная
15 Ёпрст
 
09.07.19
15:21
именно в ней и косяк
16 ssalikoff
 
09.07.19
15:21
(12) В этом смысле да, согласен
17 Вафель
 
09.07.19
15:22
на хотлайн нужно писать
18 ssalikoff
 
09.07.19
15:22
Вот интересно, если это такой косяк платформы, то это должно вылезти боком в тысяче мест. Странно, что никакого визга не слышно.
19 Вафель
 
09.07.19
15:23
(18) ни один вменяемый 15 релиз не ставит
20 Ёпрст
 
09.07.19
15:24
Это, на всякий, в регистре ЗаказыОстатки ресурс Сумма, какой тип имеет ?
21 Lama12
 
09.07.19
15:25
(0)В зарегистрированных ошибках видел недавно. Но вроде они отчитались что исправили ее.
22 ssalikoff
 
09.07.19
15:25
(20)  ОпределяемыйТип.ДенежнаяСуммаЛюбогоЗнака
23 ssalikoff
 
09.07.19
15:26
(20) Число (15,2)
24 Ёпрст
 
09.07.19
15:29
Ну.. тут тока в профайлере посмотреть реальный запрос, во что там ОстаткиИОбороты  разворачивается. Раньше, там cast-ов было понапихано мама не горюй ..
25 ssalikoff
 
09.07.19
15:34
(24) Попробую это сделать
26 fisher
 
09.07.19
15:43
(0) Похоже на баг. Каждый раз когда приходит время обновлять платформу, внимательно читаю баг-листы и форумы и содрогаюсь. Обычно в итоге выбирается какой-то стабильный билд из релиза предыдущего актуальному. А то и пред-предыдущего.
27 тарам пам пам
 
09.07.19
16:03
(21) Номер ошибки 10212223, если интересно. Статус пока что висит "принято к исправлению".
28 ssalikoff
 
09.07.19
16:24
(27) Спасибо, тарам пам пам!
Теперь можно успокоиться, всё стало понятно.

Непонятно лишь, почему эта ошибка не находится в разделе «Публикуемые ошибки продукта "Технологическая платформа" версии 8.3.15.1489».
Я там всё перечитал, но не нашёл нужного. А по номеру ошибки всё нашлось
29 Сияющий в темноте
 
09.07.19
19:48
Вычисления делаются в double,а результат переводится в нужный тип,вот и ходим по граблям.
кстати,в win10 перестало правильно работать округление,и выводит даже в VbScript кучу знаков после запятой-чай проблема не на стороне 1с,а в системной библиотеке.
Фронтол суммы нс win10 в результат при копейках очень очаровательно пишет,что парсер давится.
30 mkalimulin
 
10.07.19
08:13
(0) Компьютер не способен считать точно. Вы этого не знали?
31 Сияющий в темноте
 
10.07.19
08:23
Компьютер способен.
типы Currency и Decimal специально для этого.
только нужно понимать,что когда мы сумму умножаем на количество и три дробных знака плюс два должны перейти в два,то будет округление,не по тому,что компьютер тае хочет,а потому,что у денежных величин два знака после запятой и в документе нельзя указать три знака.
а вот уже правила округления каждый выбирает,как ему больше нравится.
32 xXeNoNx
 
10.07.19
08:32
Они не могут ответить как инициализируются параметры страницы при новый ТабличныйДокумент, а ТС хочет что бы ему это сказали...
По поводу сабжа, то ошибка эта зарегана и исправляется, если уже не исправлена...
33 xXeNoNx
 
10.07.19
08:34
34 xXeNoNx
 
10.07.19
08:35
Ошибка номер 10212223
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн