|
Расчет розничной цены с округлением | ☑ | ||
---|---|---|---|---|
0
VAmbrazure
13.04.16
✎
22:35
|
Простая казалась бы задача:
--- Нужно придумать формулу в 1 строку на языке 1С, которая округляла бы заданное действительное число до целых таким образом, чтобы при добавлении 20% получалось бы число, нацело делимое на 500. --- Примеры правильного округления: Для числа 330175.12 - 330000, проверка +20% = 396000 Для числа 853755 - 853750, проверка +20% = 1024500 Для числа 853754.65 - 853750, проверка + 20% = 1024500 Чтобы вы не думали - задача имеет вполне практический смысл. Нужно подобрать такую целочисленную цену для товара в беларуских рублях, чтобы при добавлении 20% НДС продавцы получили легкую в счете сумму с округлением до 500 бел. рублей. У меня есть пока не для всех аргументов рабочая формула: --- ЦенаБезНДС = Окр(ЦенаБезНДС * 1.2 / 500, 0) * 500 / 1.2; --- |
|||
1
франц
13.04.16
✎
22:37
|
это какая то конфа типовая, или самописная?
|
|||
2
VAmbrazure
13.04.16
✎
22:40
|
(1) Пилим типовую Управление Торговлей. Но сам вопрос он универсальный, от конфы не зависит.
|
|||
3
франц
13.04.16
✎
22:43
|
(2) в ут 11 онное решено... и все изыски защиты в БСП...
|
|||
4
VAmbrazure
13.04.16
✎
22:49
|
(3) Знать бы куда рыть. Было бы идеально, если есть готовая функция, которая делает вышеописанное.
|
|||
5
Злопчинский
13.04.16
✎
22:56
|
имхается мне что в одну строку простое решение не записать...
|
|||
6
франц
13.04.16
✎
22:57
|
(4) я бы ринулся в "Маркетинг - Виды цен"..
|
|||
7
франц
13.04.16
✎
22:58
|
(5) программно не знаю.. но вот адекватно настроить в УТ 11 - стоит проверить.
|
|||
8
Злопчинский
13.04.16
✎
23:02
|
ща.. сек.. попробую выпилить...
когда то я такое для фармации писал чтобы цена с ндс и без ндс были круглыми |
|||
9
VAmbrazure
13.04.16
✎
23:04
|
Сам спросил - сам ответил:
--- ЦенаБезНДС = Окр(ЦенаБезНДС * 1.2 / 500 / 3, 0) * 500 / 1.2 * 3; --- Ребята, спасибо всем кто откликнулся! |
|||
10
VAmbrazure
13.04.16
✎
23:07
|
Если кому интересно, поясню как рассуждал:
Согласно условию, минимально возможная цена с НДС будет 500 руб. Откинем НДС: 500 / 1.2 = 416.666666... Чтобы получить целое число, надо эту дробь домножить до 3. Вот отсюда 3 в формуле. |
|||
11
Злопчинский
13.04.16
✎
23:09
|
(9) я б на всякий случай еще бы снаружи обрамил
окр(все твое выражение,0); |
|||
12
mingw
13.04.16
✎
23:11
|
(0) Округлять можно в любую сторону? Или только в меньшую?
|
|||
13
VAmbrazure
13.04.16
✎
23:11
|
(11) Нет, это лишнее. Минимально возможная цена без НДС - 1 рубль. Подставляя в формулу:
1*500/1.2*3 = 1250. Целое число. |
|||
14
VAmbrazure
13.04.16
✎
23:11
|
(12) В любую.
|
|||
15
VAmbrazure
13.04.16
✎
23:14
|
(13) То есть минимально возможное выражение в скобках...
|
|||
16
Злопчинский
13.04.16
✎
23:16
|
криво. при исходной цене без НДС = 417 результат = 0, что очевидно неверно
|
|||
17
VAmbrazure
13.04.16
✎
23:19
|
(16) Нормально. 417 бел. руб на наше время - это ничто. :)
В прайсе такой цены точно нет. |
|||
18
Злопчинский
13.04.16
✎
23:21
|
(17) херня. выражение неверное. отмаза не катит.
исходную цену без НДС надо округлять до 1250 |
|||
19
VAmbrazure
13.04.16
✎
23:22
|
(18) Как бы 500 / 1.2 * 3 в формуле - и есть 1250. :)
|
|||
20
Злопчинский
13.04.16
✎
23:22
|
.."надо округлять до 1250" читать как "надо округлять до кратного 1250" - а это решается проще чем твоя формула
|
|||
21
VAmbrazure
13.04.16
✎
23:24
|
(20) Ну смотри:
ЦенаБезНДС = Окр(ЦенаБезНДС * 1.2 / 500 / 3, 0) * 500 / 1.2 * 3; = ЦенаБезНДС = Окр(ЦенаБезНДС / 1250, 0) * 1250; Это и есть округление до 1250. |
|||
22
VAmbrazure
13.04.16
✎
23:27
|
(20) Моя формула чем хороша, что подставляя в нее свое значение НДС и свою величину округления - можно округлять числа для любых требуемых валют и величин НДС.
|
|||
23
VAmbrazure
13.04.16
✎
23:29
|
(22) Хотя в общем случае наименьшее общее кратное ( 3 ) тоже надо вычислять. Ну да ладно, свою задачу я решил.
|
|||
24
Злопчинский
13.04.16
✎
23:30
|
угу.
в округлении только параметром передавать округлять в меньшую или большую |
|||
25
Злопчинский
13.04.16
✎
23:31
|
покупатели не заценят такого скачка цен.. с 417 до 1250... ;-)
|
|||
26
mingw
13.04.16
✎
23:32
|
ЦенаПродажиСНДС20 = Окр(ИсходнаяЦена*1.2/500)*500;
ЦенаПродажиБезНДС20 = Окр(ЦенаПродажиСНДС20/1.2); |
|||
27
Злопчинский
13.04.16
✎
23:35
|
(26) не катит. для ценв в 417 снова криво, цена продажи без НДС - дробная.. ;-)
|
|||
28
mingw
13.04.16
✎
23:35
|
(27) Окр(416,67) = 417
|
|||
29
Злопчинский
13.04.16
✎
23:36
|
(23) пока что простым выражением в одну строку не получилось... надо "1250" вычислять...
|
|||
30
mingw
13.04.16
✎
23:37
|
НДС 20% Должно быть кратно 5. Или будет дробная без НДС.
|
|||
31
Злопчинский
13.04.16
✎
23:37
|
(28) согласен, ступил... не увидел окр
|
|||
32
VAmbrazure
13.04.16
✎
23:37
|
(25) Да, жизнь жестокая штука. :)
Посмотрим, если будут возмущаться, то сделаем округление не до 500, а до 100. Чтоб было понятно читателям: на сегодня 1250 бел. руб. = 4.17 росс. руб. = 5.5 евроцента. |
|||
33
mingw
13.04.16
✎
23:41
|
(32) Деноминация же. Бабла на округлении срубите.
|
|||
34
VAmbrazure
13.04.16
✎
23:43
|
(33) Не напоминайте. Все бухгалтеры в стране на ушах стоят. Плюс введение электронных счет-фактур по НДС тоже с 1 июля 2016г.
|
|||
35
Злопчинский
13.04.16
✎
23:54
|
(26) криво.
0. исходная цена = 1460 1. ЦенаПродажиСНДС20 = Окр(ИсходнаяЦена*1.2/500)*500; ЦенаПродажиСНДС20 = 2000 2. ЦенаПродажиБезНДС20 = Окр(ЦенаПродажиСНДС20/1.2); ЦенаПродажиБезНДС20 = 1667; 3. ПРОВЕРЯЕМ ?(ЦенаПродажиБезНДС20*1.2 = ЦенаПродажиСНДС20,"Ок","ERR) 1667*1.2 = 2000 2000.4 = 2000 ERR |
|||
36
Злопчинский
14.04.16
✎
00:01
|
То бишь правильно будет
ИсходнаяЦенаБезНДС = Макс(1,Окр(ИсходнаяЦенаБезНДС/1250,0,1))*1250; |
|||
37
Злопчинский
14.04.16
✎
00:01
|
ща внедрим вместо 1250 формулу...
|
|||
38
Злопчинский
14.04.16
✎
00:35
|
ууу, блин, все уперлось в нахождение вот это "3"...
|
|||
39
VAmbrazure
14.04.16
✎
00:51
|
(36) Ну если учитывать граничные случаи (что в идеале надо делать), то да.
(38) Интуитивно чувствую, это что-то из области нахождения НОД. Но уже поздно, да и свою частную задачу я решил. В любом случае спасибо за участие. Когда пытаешься грамотно сформулировать задачу - даже самому понятно становится как ее решить... |
|||
40
Злопчинский
14.04.16
✎
00:56
|
(39) надо решить для дробного А меньшего 0
А*Х=Цел(А*X) или перевести А в обыкновенную дробь... |
|||
41
Злопчинский
14.04.16
✎
00:57
|
и сделать это все короткими элементарными операциями...
|
|||
42
Злопчинский
14.04.16
✎
00:58
|
..а так-то проблемы нет написать универсальную функцию для лбого округления...
|
|||
43
VAmbrazure
14.04.16
✎
01:54
|
(40) Для дроби ОкруглятьДо/(1+СтавкаНДС/100) надо найти такое наименьшее число X, чтобы число ОкруглятьДо*X делилось нацело на (1+СтавкаНДС/100).
Или в нашем частном случае, для дроби 500 / 1.2 надо найти такое наименьшее число X, чтобы 500*X делилось нацело на 1.2. В нашем случае это 3. |
|||
44
hhhh
14.04.16
✎
08:18
|
(43) вроде же элементарно. делайте, чтобы все цены в прайсе делились на 6.
|
|||
45
Злопчинский
14.04.16
✎
13:59
|
(44) обоснуй
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |