Технологическая пауза... размещу утилитку - авось кому сгодится? В принципе на ней отлаживал алгоритмы для системы "УС Лэнд".
Задача/проблема: Предположим Вы ведете учет в ценах, включая НДС, а контрагент в ценах без НДС. Тогда при отпуске ему товаров и/или согласования спецификации могут возникнуть рассогласования данных по документообороту при дотошном (
построчном) сверке документов и встречаются ситуации, когда бухгалтера придираются к этому
Например! У Вас цена с НДС 43.00р. Тогда с математическим округлением в УПД будет:
Цена без НДС: 35.83 хотя фактически: 35.8333333...
Количество: 1000
Сумма с НДС: 43000.00
Сумма без НДС, как сверяет ФНС: 35833.33
Подгоняя НДС: 7166.67
У контрагента будет. Пусть он у себя проставит
цену без НДС = 35.83
Количество: 1000
Сумма с НДС 35.83*1.2*1000: 42996.00
Сумма без НДС - рассчитывается: 35830.00
Рассчитывая НДС: 7166.00
Как видно из примера:
1. Не стыкуются цены/суммы документов;
2. Рассогласование данных бухучета, контролируемые ФНС.
Какой выход? При работе с клиентами использовать цены, которые при расчетах не будут давать ошибок округления... на что без проблем идут даже влиятельные торговые сети.
Утилитка помогает Вам подобрать "правильную" цену, где вводите примерную согласованную цену (с НДС или без НДС) и ставку НДС в процентах. Программа предлагает "ближайшие" подходящие цены, встаёте на неё, нажимаете
Ctrl+C (копировать) и затем вставляете в "свою программу", например
Ctrl+V. Нажав Enter в последнем поле перейдёте на новый цикл подбора цены... и так до нажатия кнопки Esc.
Уменьшить число нажатий можно введя цену, затем нажать PgDown.
Алгоритмы примитивные и можно использовать данный код для своей программы:
Код:
* --------------------------------------------------------------------------------------------------
* Универсальная процедура циклической подгонки цены с возможностью копипаста результата
PROC pgClcPrice()
LOCA cOldCol:=SetColor(), GetList:={}
LOCA nInp:=100, nNds:=20, nDir:=2, nMin:=0, nMax:=0
LOCA nI:=0, nS:=0, nJ:=0, nT:=0
// Открываю головную форму с инструкцией для циклического в ней ввода и расчета цен
fswOpen(0,0,11,59,cColor,3)
@ 1,1 SAY "Пожалуйста введите значения и принципы расчетов цен от НДС" COLO cHelpc
@ 2,1 SAY "См. направление. Цена включая НДС или без НДС ............"
@ 3,1 SAY "Процент ставки НДС на расчетный товар ......"
@ 4,1 SAY "Направление: 2-Вы ввели цену включая НДС. Программа подбе-"
@ 5,1 SAY "рёт цены, что бы без НДС они были ровные, иначе Вы вводите"
@ 6,1 SAY "цену без НДС, а программа будет подбирать цены с НДС ."
@ 7,1 SAY "----------------------------------------------------------"
@ 8,1 SAY "Подходящая большая ............, меньшая цена ............"
@ 9,1 SAY "Получаемые цены: "
@10,1 SAY "Esc- выход, Ctrl+C - копировать в буфер, Enter- продолжить" COLO cHelpc
WHIL TRUE
@ 2,47 GET nInp PICT "999999999.99" VALI lValid({||nInp > 0},"Запрещена отрицательная цена!")
@ 3,53 GET nNds PICT "999.99" VALI lValid({||nNds >= 0},"Запрещена отрицательное значение!")
@ 6,58 GET nDir PICT "9"
READ
IF LastKey() == K_ESC THEN EXIT
// Подбор подходящих цен перебирая по копейке в зависимости от направления
IF nDir == 2 // Подбираем, что бы была ровной цена без НДС
FOR nJ := 1 TO 2
nT := nInp
WHIL TRUE
nS := nT / (1 + nNds/100)
IF Abs(nS*100 - zInt(nS*100)) <= 0.000001 THEN EXIT
nT += IF(nJ=1,(-1),(+1))*0.01
END
IF nJ = 1
nMin := nS*(1 + nNds/100)
ELSE
nMax := nS*(1 + nNds/100)
ENDI
NEXT nJ
ELSE // Подбираем ровные цены с НДС
FOR nJ := 1 TO 2
nT := nInp
WHIL TRUE
nS := nT * (1 + nNds/100)
IF Abs(nS*100 - zInt(nS*100)) <= 0.000001 THEN EXIT
nT += IF(nJ=1,(-1),(+1))*0.01
END
IF nJ = 1
nMin := nS/(1 + nNds/100)
ELSE
nMax := nS/(1 + nNds/100)
ENDI
NEXT nJ
ENDI
GetList := {}
@ 9,20 SAY Str(IF(nDir <> 2, nMax*(1+nNds/100), nMax/(1+nNds/100)),12,2)
@ 9,47 SAY Str(IF(nDir <> 2, nMin*(1+nNds/100), nMin/(1+nNds/100)),12,2)
@ 8,20 GET nMax PICT "999999999.99"
@ 8,47 GET nMin PICT "999999999.99"
READ
IF LastKey() == K_ESC THEN EXIT
END
fDeact( cOldCol )
RETU
При желании может взять приложенную утилиту и скопировав её куда угодно, например на рабочий стол использовать для "пользы дела"