Имя: Пароль:
1C
 
Проблема со знаками после запятой
,
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
(6) https://ibb.co/DzXMhvG

Вы может в реквизит данные присваиваете, у которого тип другой?
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) Кстати ТКО прикольная штука, там "покупают" в кубометрах а "продают" на полигон ТКО в тоннах ))
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.