Имя: Пароль:
1C
1С v8
Расчет розничной цены с округлением
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) обоснуй
AdBlock убивает бесплатный контент. 1Сергей