18.06.2018 (М) ПОДГОТОВКА К ХРОНОЛОГИЧЕСКОЙ ЗАМЕНЕ % НДС — различия между версиями
Maria (обсуждение | вклад) м |
Maria (обсуждение | вклад) м |
||
(не показано 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, … - где | + | <u>'''Если вызов SeekRef() или ProdNDS() из R165, R186, R220, … - где ОПРЕДЕЛЕНА CurDate:'''</u><br/> |
− | + | : ''SeekRef(спрк, код, 'PRODNDS',…)'' | |
− | : меняем на | + | ::: меняем на ''ProdNDS(код [,спрк])'', где спрк = R08, R11, R197; умолч.=R11 |
− | : | + | : ''ProdNDS(код [, спрк])'' |
− | : | + | ::: оставляем без изменений |
− | : | + | : ''ProdNDS(код, [спрк], умолч)'' |
+ | ::: меняем на ''ProdNDS(код, [спрк], GetPrm('NDS_...', , , dtdt:=CurDate))'' | ||
+ | ::: dtdt, как обычно, необязательно определять | ||
− | <u>'''Если вызов из запросов, | + | <u>'''Если вызов SeekRef() или ProdNDS() из запросов, печ/форм, … - где НЕ определена CurDate:'''</u><br/> |
− | : | + | : нужно использовать ''ProdNDS(код, [спрк], , некаяДата)'' |
− | : | + | : а если нужно умолчание НДС (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илиИнаяДата), | + | : так и просто ''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))'' | ||
− | + | <font size=2> | |
+ | примечание: a_s() = alltrim(str()) с автоматическим отсечением дробной части при её равенстве нулю<br/> | ||
+ | </font> | ||
+ | <font size=4> | ||
<u>'''SQL-запросы:'''</u><br/> | <u>'''SQL-запросы:'''</u><br/> | ||
− | : Было "…, SUM(round( | + | : Было ''"…, 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( | + | :: dtdt:=CurDate или некая иная дата (например, какая-то переменная в цикле dtdt:=next_dt) |
− | + | : сам запрос меняем на | |
− | : НЕ забываем: если в запросе просто обращение “…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( | + | : НЕ забываем: если в запросе было просто обращение “…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))