|
Проблема со знаками после запятой | ☑ | ||
---|---|---|---|---|
0
Азат
04.12.23
✎
12:02
|
Всем доброго дня!
Возникла такая проблема - создается регистр накопления. У него ресурс - Количество, типа Число(25,18) В виртуальных таблицах 1С не видит больше десятого знака. То есть остаток на начало месяца = 2,123456789012345 Если проходит продажа 2,123456789012300, то запрос к РегистрНакопления..Остатки() вернет 2,1234567890 и типа 0,0000000000123 отправляет в минус. В результате разъезжаются партии наглухо. Вопрос - сталкивался ли кто-то с таким и есть ли варианты решения кроме как умножить все на 10^9 и делить при выводе отчетом на экран? Спасибо |
|||
1
maxab72
04.12.23
✎
12:15
|
хранить целую и дробную часть числа в разных реквизитах. можно даже в текстовом виде, например в 36-ричном представлении, тогда будет экономия места большая.
|
|||
2
Азат
04.12.23
✎
12:18
|
(1) что-то не совсем уловлю.
Тогда будет 1 реквизит "ЦелоеКоличество" - Тип Число(7,0) и 1 реквизит "ДробноеКоличество" - Тип Число(18,0) так что ли? |
|||
3
timurhv
04.12.23
✎
12:21
|
(0) https://its.1c.ru/db/metod8dev/content/2665/hdoc
Если при выполнении операций над данными в запросах целесообразно изменить правила вычисления длин и точностей результатов, то для задания желаемой длины и точности необходимо использовать оператор ВЫРАЗИТЬ. Следует иметь в виду, что если необходимо изменить длину и точность результата какой-нибудь операции, то оператор ВЫРАЗИТЬ нужно применять к ее операнду. Тогда длина и точность результата операции будет вычислена по описанным выше правилам, исходя из длины и точности операнда, заданной оператором ВЫРАЗИТЬ. Например, если поле "Реквизит1" имеет тип "Число(8, 0)", то чтобы выражение Реквизит1 / 3 имело в дробной части 15 цифр необходимо записать: ВЫРАЗИТЬ(Реквизит1 КАК Число(23, 15)) / 3 |
|||
4
НЕА123
04.12.23
✎
12:24
|
||||
5
maxab72
04.12.23
✎
12:26
|
Можно и так. Главное написать библиотеку, чтоб умела делать арифметические операции над такими парами чисел.
P.S. предложение о текстовом представлении это не шутка. Я так делал в одной базе специальный тип данных для хранения пар чисел - допусков (+ и -). И писал модуль по работе с таким типом данных (сложение, сравнение на полное вхождение, процент перекрытия, обращение и т.п.). Данные хранил в виде строки в специально придуманном формате. |
|||
6
Азат
04.12.23
✎
12:44
|
(3)
Выбрать КоличествоОстаток Из РегистрНакопления..Остатки() Или Выбрать ВЫРАЗИТЬ(КоличествоОстаток КАК Число(25,18)) Из РегистрНакопления..Остатки() возвращают одинаковый результат 2,12334567890 |
|||
7
Has
04.12.23
✎
13:15
|
(0) если приемлемо - изменить единицы измерения
|
|||
8
Азат
04.12.23
✎
13:20
|
(7) ну просто умножать на миллиард и делить обратно?
|
|||
9
timurhv
04.12.23
✎
14:04
|
||||
10
Азат
04.12.23
✎
14:54
|
(9) где присвоение в п.6?
просто 2 документа первый делает приход 2,123456789012345 второй делает расход 2,123456789012300 в итоге в разбивке по партиям получаю 2 партии: на одной 0,000000000000012345 а на второй -0,000000000000012300 |
|||
11
Garykom
04.12.23
✎
15:04
|
(0) Криво сделаны партии, надо через отдельный справочник
Незначимые остатки в регистре обнулять |
|||
12
Garykom
04.12.23
✎
15:08
|
Для обдумывания могу пример без этих много цифер после запятой
Упаковка - 1 шт, состоит из 3 блистеров (в каждом по нескоко таблеток/капсул это неважно) Дробная продажа разрешена Пришла 1 упаковка... Продали 3 блистера (по 0.33 шт)... Остаток 1.00 - 0.99 = 0.01 - кого наипали? |
|||
13
Garykom
04.12.23
✎
15:12
|
(12)+ Есть два метода решения проблемы
1. Разные единицы измерения, везде в доках и регистрах хранить с единицей И использовать разукомплектатацию - перед списанием первого блистера, списывать 1 уп. и ставить на приход 3 блистера 2. Все в базовых шт, при списании последнего блистера если остаток малый (меньше чем блистер) его тоже списывать 1 = 0.33 + 0.33 + 0.34 |
|||
14
timurhv
04.12.23
✎
15:49
|
(10) Я вам вывел результат, со стороны SQL-запроса все ок.
То что разбивается неверно, это уже к логике работы. |
|||
15
uno-group
04.12.23
✎
16:48
|
Неправильно выбрана базовая единица измерений в товаре. Три знака после запитой более чем достаточно.
Будет единица измерения блистер 1 шт. Упаковка 3 блистера и никаких зависших 0,01 и прочей фигни. |
|||
16
uno-group
04.12.23
✎
16:54
|
Продаете по ампульно, капсульно, таблеточно соответственно основная единица буде таблетка.
будет блистер 5 таблеток и блистер 10 таблеток. упаковка 30 шт. и упаковка 50 шт. И никаких дробей в периоде никогда не получится. |
|||
17
Garykom
04.12.23
✎
19:48
|
(16) На предпоследней работе была единица человеко-месяцы (коммунальные услуги)
И да там 8 знаков после запятой точности не хватало ибо тариф за человека в месяц уже изначально 2 знака после запятой А человек мог 1 день только присутствовать по адресу... |
|||
18
uno-group
05.12.23
✎
16:27
|
(17) С дуру можно и не такое придумать. Есть базовая единица нормо/часы. Перевести тариф за час из человеко/месяц в нормо/часы вообще не вопрос учетчица или кто там Устанавливает ставку может про них и не знать установил там Ставку за месяц 30 тыс. программа в рубль/час пересчитала и забыла. Учетчики себе рисуют 8 или что там по факту вышло. все прозрачно и в пределах 2 знаков.
|
|||
20
Garykom
05.12.23
✎
16:48
|
(18) >Перевести тариф за час из человеко/месяц в нормо/часы вообще не вопрос
Низзя Потребуется точность КолвоЧасовВМесяце * ТочностьТарифаЧеловекоМесяц |
|||
21
uno-group
06.12.23
✎
11:29
|
(20) Даже у бюджетников это приказом по предприятию делается и 0,5 ставки учителя превращается в н часов.
|
|||
22
Garykom
06.12.23
✎
11:54
|
(21) Ты квитанции за коммуналку видел?
Сколько например за вывоз ТКО платишь с человека? |
|||
23
stopa85
06.12.23
✎
11:57
|
Интересно, это SQL-сервер не может с типом DECIMAL(25,12) работать и суммировать как надо или 1С-ка родимая.
|
|||
24
Garykom
06.12.23
✎
12:51
|
(23) 1С использует тип NUMERIC при работе с SQL
(0) >Количество, типа Число(25,18) Сделай тип Число(38,18) |
|||
25
uno-group
06.12.23
✎
13:12
|
(22) Там нет разбивки почасовой, для частника просто фиксированная сумма. Для фирмы договор на вывоз контейнера раз в 2 недели а не тариф за месяц. В какие то месяцы это и 3 вывоза может быть соответственно тогда и сумма в 1,5 раза выше. Зп водителя мусоровоза и всех остальных от этого не зависит. Он сколько часов отработал столько и получит. А не в 1,5 раза больше в этот месяц.
|
|||
26
Garykom
06.12.23
✎
14:06
|
(25) Если ты внимательно изучишь тему то выяснишь офигительные подробности про тарифы (стоимость вывоза 1 м3 ТКО).
И нормативы (сколько по замерам мусорит один человек за год) - которые по категориям жилья. И дальше идет деление годового норматива в кубах на 12 (месяцев). Но человек может часть месяца отсутствовать (уехал на отдых или в командировку) и не обязан платить за вывоз ТКО (да надо принести доказательства в виде билетов или справок). И тут начинаются веселые приколы что 1 день разных месяцев стоит неодинаково в кубах на 1 человека. )) А еще этих дробных человеко-месяцев надо сложить правильно чтобы перевыставить счет. Но округлять низзя - иначе сумма от многих физиков не сойдется с одной суммой которую надо заплатить выше. |
|||
27
Garykom
06.12.23
✎
14:08
|
(25) Кстати ТКО прикольная штука, там "покупают" в кубометрах а "продают" на полигон ТКО в тоннах ))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |