Имя: Пароль:
1C
1С v8
Комплексная, вторая редакция. Пересчет веса и объема. Крик души.
, ,
0 Byasha
 
26.02.19
22:57
Релиз конфигурации 2.4.6.207
Стал не верно рассчитываться вес и объем. Заметили не сразу.
Имеем вес упаковки 46,8 кг
В ордере отгружается 3 упаковки.
При открытии ордера вес рассчитан правильно 3*46,8 = 140,4 кг.
При изменении количества, на то же самое получаем 3*46,8 = 140,397!!!!!
Склад оказался в ступоре, т.к. отгрузка идет контейнерами и на одном контейнере получили "недовес" около двух тонн!!!
После долгих мытарств и исканий в коде нашел такую процедуру - "ПересчитатьВесОбъемВСтрокеТЧ" и в ней следующий код

ВесЕдиницыИзмерения = ПолучитьКоэффициентУпаковки(ТекущаяСтрока.ЕдиницаИзмеренияВеса, КэшированныеЗначения).Коэффициент;
Если ВесЕдиницыИзмерения * ТекущаяСтрока.ВесУпаковки <> 0 Тогда
    ТекущаяСтрока.Вес =    ТекущаяСтрока["КоличествоУпаковок" + Суффикс] *
                1/Окр(ВесЕдиницыИзмерения/ТекущаяСтрока.ВесУпаковки , 6, РежимОкругления.Окр15как20);
КонецЕсли;

Вся загвоздка в округлении. Если округлять конечный результат, то все считается верно.
Стало очень интересно, а почему два года считалось правильно, и вдруг "перестало".
Поднял старые релизы типовых.
В релизе 2.4.6.175 эта же процедура выглядит несколько иначе

ВесЕдиницыИзмерения = ПолучитьКоэффициентУпаковки(ТекущаяСтрока.ЕдиницаИзмеренияВеса, КэшированныеЗначения).Коэффициент;
Если ВесЕдиницыИзмерения * ТекущаяСтрока.ВесУпаковки <> 0 Тогда
    ТекущаяСтрока.Вес = ТекущаяСтрока["КоличествоУпаковок" + Суффикс] *
                ТекущаяСтрока.ВесУпаковки /
                ВесЕдиницыИзмерения;
КонецЕсли;

Т.е. округления нет.
Ради интереса расписал на бумаге формулы.
Старая: КоличествоУпаковок * ВесУпаковки / ВесЕдиницыИзмерения.
Новая БЕЗ ОКРУГЛЕНИЯ: КоличествоУпаковок * 1 / (ВесЕдиницыИзмерения/ВесУпаковки) что опять превращается в КоличествоУпаковок * ВесУпаковки / ВесЕдиницыИзмерения.

Собственно сам крик души. ЗАЧЕМ ОКРУГЛЕНИЕ!!!!!!
Объясните, может я что-то не так понимаю?
1 Garykom
 
гуру
26.02.19
23:20
Это какой то "программист" пытался сделать чтобы при отгрузке дробными "упаковками" итоги сходились.

Например попробуй не 3 упаковки отгрузить а по 1/3 упаковки 9 раз ))
2 Йохохо
 
26.02.19
23:22
при ВесЕдиницыИзмерения = 1 и в дробной части новая формула всегда хуже, мб под крупняк прогнулись
(1) свернуть() же везде
3 Byasha
 
26.02.19
23:29
(1) Мне сложно представить ситуацию когда склад будет отгружать 1/3 упаковки. Ну вот никак не могу. Даже Джамшуты, которые там работают, до этого не догадались.
4 Йохохо
 
26.02.19
23:33
(3) идеально для всех такой пересчет написать нельзя. Написано глупо, отругайте того кто писал и кто обновлял
5 Byasha
 
26.02.19
23:39
(4) Отругать кого? Товарищей из 1С-Софт? Или своих программистов? Которые даже и внимания не обратили на этот модуль, потому что он на замке.
6 Йохохо
 
26.02.19
23:46
(5) изменения видно было
7 Базис
 
naïve
26.02.19
23:46
Отдельно проверял подобную ветку в УПП. Подпиской, вроде бы.
8 Byasha
 
26.02.19
23:47
(4) А при чем тут идеально? Крик души был в том, что округление делается не на конечный результат, а в процессе вычисления.
9 Byasha
 
26.02.19
23:49
(6) Видно было. И я совершенно не хочу ругать того, кто накатывал обновления. Мне что, за 1С-Софт ВСЕ их изменения контролировать? Может тогда мне их на работу взять?
10 Йохохо
 
26.02.19
23:53
(8) "*1/(1/" Вам должно не нравиться, ну да ладно, Вы там (9) все спешите
11 Byasha
 
27.02.19
00:05
(10) Так мне не только это не нравиться. Это "затыкается" через округление. Там есть еще такая конструкция "/ТекущаяСтрока.ВесУпаковки". И если при получении веса единицы измерения есть проверка на 0 - возвращается 1. То вес упаковки берется из табличной части документа, а там он очень прекрасно может принимать нулевое значение.
12 Йохохо
 
27.02.19
00:18
(11) не спешите) ВесЕдиницыИзмерения * ТекущаяСтрока.ВесУпаковки <> 0
13 Конструктор1С
 
27.02.19
06:06
Так округление до 6 знаков после запятой, это не должно быть губительно. Какое значение у переменной ВесЕдиницыИзмерения?
14 Конструктор1С
 
27.02.19
06:18
И чем истерить в интернете, не пробовал разработчикам написать?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.