26.02.2020 09:26
Технологическая пауза... размещу утилитку - авось кому сгодится? В принципе на ней отлаживал алгоритмы для системы "УС Лэнд".

Задача/проблема: Предположим Вы ведете учет в ценах, включая НДС, а контрагент в ценах без НДС. Тогда при отпуске ему товаров и/или согласования спецификации могут возникнуть рассогласования данных по документообороту при дотошном (построчном) сверке документов и встречаются ситуации, когда бухгалтера придираются к этому

Например! У Вас цена с НДС 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


При желании может взять приложенную утилиту и скопировав её куда угодно, например на рабочий стол использовать для "пользы дела"