18.06.2018 (М) ПОДГОТОВКА К ХРОНОЛОГИЧЕСКОЙ ЗАМЕНЕ % НДС — различия между версиями

Материал из Фабиус wiki
Перейти к: навигация, поиск
м
м
 
(не показано 25 промежуточных версий этого же участника)
Строка 3: Строка 3:
 
При правильно заполненной хронологии параметров (за это отвечает OnAfterUpdateConfig) <br/>  
 
При правильно заполненной хронологии параметров (за это отвечает OnAfterUpdateConfig) <br/>  
 
в R11 (R08,R197) может стоять и  18%, и 20%.<br/>   
 
в R11 (R08,R197) может стоять и  18%, и 20%.<br/>   
Доработанная ф-я ProdNDS() вернёт 20%, если 2019 год,  и 18%, если 2018.
+
Доработанная ф-я ProdNDS() вернёт 20%, если 2019 год,  и 18%, если 2018.<br/>
  
  
<u>'''Ключевые фразы поиска мест для изменения:'''</u><br/>
+
Расчёт на то, что 10 %  - неизменная ставка.
 +
Не забываем, что существует и НДС 0% !<br/>
 +
Поэтому общая схема определения ставки НДС:<br/>
 +
:  если R11[R08].НДС=0,  вернуть 0
 +
:  иначе если R11[R08].НДС=10, вернуть 10
 +
:  иначе согласно дате вернуть 18 ли 20.
 +
 
 +
 
 +
<u>'''Ctrl-F Ключевые фразы поиска мест для изменения:'''</u><br/>
 +
помечать, как минимум, Документы, Сводные запросы, Программы, Печ/формы.
 
:  ''PRODNDS'' - это и имя поля в R11,R08, и название ф-и
 
:  ''PRODNDS'' - это и имя поля в R11,R08, и название ф-и
 
:  ''=18'', ''=10'' (или с пробелом ''= 18'', ''= 10'' - кто как пишет)
 
:  ''=18'', ''=10'' (или с пробелом ''= 18'', ''= 10'' - кто как пишет)
Строка 13: Строка 22:
  
  
<u>'''Если вызов из R165, R186, R220, … - где определена CurDate:'''</u><br/>
+
<u>'''Если вызов SeekRef() или ProdNDS() из R165, R186, R220, … - где ОПРЕДЕЛЕНА CurDate:'''</u><br/>
:::::::''SeekRef(спрк, код, 'PRODNDS',…)''     
+
: ''SeekRef(спрк, код, 'PRODNDS',…)''     
:  меняем на ProdNDS(код [,спрк]), где спрк = R08, R11, R197;  умолч.=R11
+
:::  меняем на ''ProdNDS(код [,спрк])'', где спрк = R08, R11, R197;  умолч.=R11
: ''ProdNDS(код [, спрк])''    -->    без изменений
+
: ''ProdNDS(код [, спрк])''     
: ''ProdNDS(код, [спрк], умолч)''   -->    ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=CurDate))
+
:::  оставляем без изменений
:         dtdt, как обычно, необязательно определять
+
: ''ProdNDS(код, [спрк], умолч)''  
 +
:::  меняем на ''ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=CurDate))''
 +
:::  dtdt, как обычно, необязательно определять
  
  
<u>'''Если вызов из запросов, п/ф, … - где НЕ определена CurDate:'''</u><br/>
+
<u>'''Если вызов SeekRef() или ProdNDS() из запросов, печ/форм, … - где НЕ определена CurDate:'''</u><br/>
: ProdNDS(код, [спрк], , некаяДата)
+
: нужно использовать ''ProdNDS(код, [спрк], , некаяДата)''
: ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=некаяДата), некаяДата) - если передаётся пар-р умолчания НДС
+
: а если нужно умолчание НДС (3-й параметр ф-и ProdNDS:
 +
: ''ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=некаяДата), некаяДата)''
  
  
 
<u>'''Получение из ставки НДС цифирьки-субсчёта -1 или -2:'''</u><br/>
 
<u>'''Получение из ставки НДС цифирьки-субсчёта -1 или -2:'''</u><br/>
:  вариант 1  min(2, round(n_d_s/10,0))
+
: сначала нужно определить переменную, например, n_d_s: 
:  вариант 2  max(1, round(n_d_s/10,0))
+
: это может быть как ''n_d_s:=ProdNDS(код)'',<br/>
:  вариант 3  iif(n_d_s=GetPrm('NDS_Prvlg', , , dtdt:=CurDateилиИнаяДата),'1','2')  
+
: так и просто ''n_d_s:=R11->PRODNDS'': в R11 может стоять и 18, и 20 – всё равно получится -2.
где  n_d_s  может быть как  ProdNDS(код),<br/>
+
: а далее используем эту переменную n_d_s:
так и просто R11->PRODNDS: в R11 может стоять и 18, и 20 – всё равно получится -2.
+
::  вариант 1  ''min(2, round(n_d_s/10,0))'', если уверены, что 0% НДС не бывает, иначе ''max(0, min(2, round(n_d_s/10,0)))''
 +
::  вариант 2  ''max(1, round(n_d_s/10,0))'', только если уверены, что 0% НДС не бывает
 +
::  вариант 3  ''iif(n_d_s=0, 0, iif(n_d_s=GetPrm('NDS_Prvlg', , , dtdt:=CurDateилиИнаяДата),1,2))''
  
  
''a_s() = alltrim(str()) с автоматическим отсечением дробной части при её равенстве 0''<br/>
+
<font size=2>
 +
примечание: a_s() = alltrim(str()) с автоматическим отсечением дробной части при её равенстве нулю<br/>
 +
</font>
 +
<font size=4>
 
<u>'''SQL-запросы:'''</u><br/>
 
<u>'''SQL-запросы:'''</u><br/>
:  Было  "…, SUM(round(RTH_SUM*(100+R11[R08].PRODNDS)/100,2)) …"
+
:  Было  ''"…, SUM(round(RTH.SUM*(100+R11[R08].PRODNDS)/100,2)) …"''
Меняем на:     
+
Чем заменяем:     
Новые переменные       
+
определяем новые переменные       
::  Local  ndsS:=GetPrm('NDS_STND',,,dtdt:=…), ndsP:=GetPrm('NDS_PRVLG',,,dtdt:=…)   
+
::  ''Local  ndsS:=GetPrm('NDS_STND',,,dtdt:=…), ndsP:=GetPrm('NDS_PRVLG',,,dtdt:=…)''
::  "…, SUM(round(RTH_SUM*(100+iif(R11[R08].PRODNDS="+a_s(ndsP)+","+a_s(ndsS)+","+a_s(ndsS)+"))/100,2)) …"
+
:: dtdt:=CurDate или некая иная дата (например, какая-то переменная в цикле dtdt:=next_dt)
:  Расчёт на то, что 10 %  - неизменная ставка.
+
:  сам запрос меняем на
:  НЕ забываем:  если в запросе просто обращение “…R11.PRODNDS”, после замены пишем эйлиас:
+
::  ''"…, SUM(iif(R11[R08].PRODNDS=0, RTH.SUM, round(RTH.SUM*(100+iif(R11[R08].PRODNDS="+a_s(ndsP)+","+a_s(ndsP)+","+a_s(ndsS)+"))/100,2))) …"''
:  "…iif(R11.PRODNDS="+a_s(ndsP)+","+a_s(ndsS)+","+a_s(ndsS)+") '''as PRODNDS'''"
+
:  НЕ забываем:  если в запросе было просто обращение “…R11.PRODNDS”, после замены пишем эйлиас:
 +
''"…iif(R11.PRODNDS=0, 0, iif(R11.PRODNDS="+a_s(ndsP)+","+a_s(ndsP)+","+a_s(ndsS)+")) '''as PRODNDS'''"''
  
  
Строка 49: Строка 67:
 
:  «Реквизит»  R11[R08].PRODNDS
 
:  «Реквизит»  R11[R08].PRODNDS
 
:  вариант 1  
 
:  вариант 1  
::  На уровне вызова запроса (R174 или в R266) определить как Global  ndsS, ndsP.  
+
::  На уровне вызова запроса (R174 или в R266) определить как ''Global  ndsS, ndsP''.  
 
::  Если там же запрос периода, сразу присвоить значения этим ndsS/P.  
 
::  Если там же запрос периода, сразу присвоить значения этим ndsS/P.  
 
::  Иначе в «Условии отбора» R238, где уже известен период ArrMY, присвоить   
 
::  Иначе в «Условии отбора» R238, где уже известен период ArrMY, присвоить   
::  ndsS/P:=GetPrm('NDS_...', , , dtdt:= SToD(atr(ArrMY[1,1])))
+
::  ''ndsS/P:=GetPrm('NDS_...', , , dtdt:= SToD(atr(ArrMY[1,1])))''
::  «Выражение преобразования» {|| “iif(R11.PRODNDS=”+a_s(ndsP)+”,”+a_s(ndsP)+”,”+a_s(ndsS)+”)” }
+
::  «Выражение преобразования» ''{|| “iif(R11.PRODNDS=0, 0, iif(R11.PRODNDS=”+a_s(ndsP)+”,”+a_s(ndsP)+”,”+a_s(ndsS)+”))” }''
 
:  вариант 2   
 
:  вариант 2   
::  «Выражение преобразования»  R11[R08].KOD
+
::  «Выражение преобразования»  ''R11[R08].KOD''
::  «Выражение отображения»  ProdNDS(val(Value), [‘R08’], , MYToDate(wCurMonth,wCurYear))
+
::  «Выражение отображения»  ''ProdNDS(val(Value), [‘R08’], , MYToDate(wCurMonth,wCurYear))''

Текущая версия на 09:26, 21 сентября 2018

В OnAfterUpdateConfig() уже предусмотрено автозаполнение хронологии NDS_STND/PRVLG при очередном обновлении.
При правильно заполненной хронологии параметров (за это отвечает OnAfterUpdateConfig)
в R11 (R08,R197) может стоять и 18%, и 20%.
Доработанная ф-я ProdNDS() вернёт 20%, если 2019 год, и 18%, если 2018.


Расчёт на то, что 10 % - неизменная ставка. Не забываем, что существует и НДС 0% !
Поэтому общая схема определения ставки НДС:

если R11[R08].НДС=0, вернуть 0
иначе если R11[R08].НДС=10, вернуть 10
иначе согласно дате вернуть 18 ли 20.


Ctrl-F Ключевые фразы поиска мест для изменения:
помечать, как минимум, Документы, Сводные запросы, Программы, Печ/формы.

PRODNDS - это и имя поля в R11,R08, и название ф-и
=18, =10 (или с пробелом = 18, = 10 - кто как пишет)
NDS_STND, NDS_PRVLG
10%, 18% (или с пробелом 10 %, 18 % - кто как пишет)


Если вызов SeekRef() или ProdNDS() из R165, R186, R220, … - где ОПРЕДЕЛЕНА CurDate:

SeekRef(спрк, код, 'PRODNDS',…)
меняем на ProdNDS(код [,спрк]), где спрк = R08, R11, R197; умолч.=R11
ProdNDS(код [, спрк])
оставляем без изменений
ProdNDS(код, [спрк], умолч)
меняем на ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=CurDate))
dtdt, как обычно, необязательно определять


Если вызов SeekRef() или ProdNDS() из запросов, печ/форм, … - где НЕ определена CurDate:

нужно использовать ProdNDS(код, [спрк], , некаяДата)
а если нужно умолчание НДС (3-й параметр ф-и ProdNDS:
ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=некаяДата), некаяДата)


Получение из ставки НДС цифирьки-субсчёта -1 или -2:

сначала нужно определить переменную, например, n_d_s:
это может быть как n_d_s:=ProdNDS(код),
так и просто n_d_s:=R11->PRODNDS: в R11 может стоять и 18, и 20 – всё равно получится -2.
а далее используем эту переменную n_d_s:
вариант 1 min(2, round(n_d_s/10,0)), если уверены, что 0% НДС не бывает, иначе max(0, min(2, round(n_d_s/10,0)))
вариант 2 max(1, round(n_d_s/10,0)), только если уверены, что 0% НДС не бывает
вариант 3 iif(n_d_s=0, 0, iif(n_d_s=GetPrm('NDS_Prvlg', , , dtdt:=CurDateилиИнаяДата),1,2))


примечание: a_s() = alltrim(str()) с автоматическим отсечением дробной части при её равенстве нулю
SQL-запросы:

Было "…, SUM(round(RTH.SUM*(100+R11[R08].PRODNDS)/100,2)) …"
Чем заменяем:
определяем новые переменные
Local ndsS:=GetPrm('NDS_STND',,,dtdt:=…), ndsP:=GetPrm('NDS_PRVLG',,,dtdt:=…)
dtdt:=CurDate или некая иная дата (например, какая-то переменная в цикле dtdt:=next_dt)
сам запрос меняем на
"…, SUM(iif(R11[R08].PRODNDS=0, RTH.SUM, round(RTH.SUM*(100+iif(R11[R08].PRODNDS="+a_s(ndsP)+","+a_s(ndsP)+","+a_s(ndsS)+"))/100,2))) …"
НЕ забываем: если в запросе было просто обращение “…R11.PRODNDS”, после замены пишем эйлиас:
"…iif(R11.PRODNDS=0, 0, iif(R11.PRODNDS="+a_s(ndsP)+","+a_s(ndsP)+","+a_s(ndsS)+")) as PRODNDS"


Колонки Сводных запросов (R239):

«Реквизит» R11[R08].PRODNDS
вариант 1
На уровне вызова запроса (R174 или в R266) определить как Global ndsS, ndsP.
Если там же запрос периода, сразу присвоить значения этим ndsS/P.
Иначе в «Условии отбора» R238, где уже известен период ArrMY, присвоить
ndsS/P:=GetPrm('NDS_...', , , dtdt:= SToD(atr(ArrMY[1,1])))
«Выражение преобразования» {|| “iif(R11.PRODNDS=0, 0, iif(R11.PRODNDS=”+a_s(ndsP)+”,”+a_s(ndsP)+”,”+a_s(ndsS)+”))” }
вариант 2
«Выражение преобразования» R11[R08].KOD
«Выражение отображения» ProdNDS(val(Value), [‘R08’], , MYToDate(wCurMonth,wCurYear))