данный запрос на выходе дает таблицу:
Дата | Дата_Через_N_Банковских дней.
Параметр (&КоличествоБанковскиДней*1.5 + 20)
не случаен 20 — максимальное количество не банковских дней подряд (примерно)
1,5 — отношение количества банковских дней к календарным дням,
чем он меньше тем быстрее выполняется запрос, но если он слишком мал, не все даты могут попасть в
результат, поэтому взял с запасом.
// выбрать рабочие (банковские дни)
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря
ПОМЕСТИТЬ РабочиеДни
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.Пятидневка = 1
И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &Период
ИНДЕКСИРОВАТЬ ПО
ДатаКалендаря
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РабочиеДни0.ДатаКалендаря КАК ДатаКалендаря0,
РабочиеДни1.ДатаКалендаря КАК ДатаКалендаря1
ПОМЕСТИТЬ ДатаПериода
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РабочиеДни0
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РабочиеДни КАК РабочиеДни1
ПО РабочиеДни0.ДатаКалендаря >= &Период
И РабочиеДни0.ДатаКалендаря <= РабочиеДни1.ДатаКалендаря
И (РабочиеДни1.ДатаКалендаря <= ДОБАВИТЬКДАТЕ(РабочиеДни0.ДатаКалендаря, ДЕНЬ, &КоличествоБанковскиДней*1.5 + 20))
ИНДЕКСИРОВАТЬ ПО
ДатаКалендаря0,
ДатаКалендаря1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДатаПериода.ДатаКалендаря0 КАК Период,
ДатаПериода.ДатаКалендаря1 КАК ПериодЧерез_Н_Банковскихдней
ИЗ
ДатаПериода КАК ДатаПериода
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатаПериода КАК ДатаПериода1
ПО ДатаПериода.ДатаКалендаря0 = ДатаПериода1.ДатаКалендаря0
И ДатаПериода.ДатаКалендаря1 >= ДатаПериода1.ДатаКалендаря1
СГРУППИРОВАТЬ ПО
ДатаПериода.ДатаКалендаря0,
ДатаПериода.ДатаКалендаря1
ИМЕЮЩИЕ
СУММА(1) = &КоличествоБанковскиДней
УПОРЯДОЧИТЬ ПО Период
////////////////////////////////////////////////////////////////////////////////
пример результата:
1
|
Период |
ПериодЧерез_Н_Банковскихдней |
||
|
01.01.2011 |
21.02.2011 |
||
|
02.01.2011 |
21.02.2011 |
||
|
03.01.2011 |
21.02.2011 |
||
|
04.01.2011 |
21.02.2011 |
||
|
05.01.2011 |
21.02.2011 |
||
|
06.01.2011 |
21.02.2011 |
||
|
07.01.2011 |
21.02.2011 |
||
|
08.01.2011 |
21.02.2011 |
||
|
09.01.2011 |
21.02.2011 |
||
|
10.01.2011 |
21.02.2011 |
||
|
11.01.2011 |
21.02.2011 |
||
|
12.01.2011 |
22.02.2011 |
||
|
13.01.2011 |
24.02.2011 |
||
|
14.01.2011 |
25.02.2011 |
||
|
15.01.2011 |
28.02.2011 |
||
|
16.01.2011 |
28.02.2011 |
||
|
17.01.2011 |
28.02.2011 |
||
|
18.01.2011 |
01.03.2011 |
||
|
19.01.2011 |
02.03.2011 |
||
|
20.01.2011 |
03.03.2011 |
подобные статьи:
ФИФО для любопытных //infostart.ru/public/68225/
ФИФО в Запросе (с пояснениями для начинающих) http://forum.infostart.ru/forum24/topic46871/




Часто в отчетах требуется получить дату через N банковских дней,
данный запрос на выходе дает таблицу:
Дата | Дата_Через_N_Банковских дней.
Параметр (&КоличествоБанковскиДней*1.5 + 20)
не случаен 20 — максимальное количество не банковских дней подряд (примерно)
1,5 — отношение количества банковских дней к календарным дням,
чем он меньше тем быстрее выполняется запрос, но если он слишком мал, не все даты могут попасть в
результат, поэтому взял с запасом.
Перейти к публикации
Что сказать? Круто!
Жесть.
Показать
На мой взгляд гораздо проще смотрится
мне не встречалось необходимости получать список как в публикации, обычно дата через N банковских дней нужна для конкретной даты
(2) Конечно проще, запрос вернет одну строку, но по условию задачи требуется таблица.
(3) Мне встречалось, при построении больших отчетов по расчету задолженности.
вот кому интресно правильный расчет банковских дат и так далее
можете переписать на 1С
proc nextDATE && вернуть дату следующего начисления
&& в банковской системе
para _st_DATE,_cn_DAY
priv _cur_DAY
_cur_Day=_st_DATE+_cn_DAY-1
do whil CountDay(_st_DATE,_cur_DAY,.T.)<=_cn_DAY
_cur_DAY=_cur_DAY+1
endd
retu _cur_DAY
FUNC CountDay && Вычисляет количество дней при
&& начислении процентов
PARA DNP,TODAY,M30D
IF TODAY<=DNP
RETU 0
ENDI
IF M30D
IF MONTH(DNP)<MONTH(TODAY)+(YEAR(TODAY)-YEAR(DNP))*12
ND1 = 30-DAY(DNP)
ND2 = DAY(TODAY)
ND3 = 30*(MONTH(TODAY)+((YEAR(TODAY)-YEAR(DNP))*12)-MONTH(DNP)-1)
NUMDAY = ND1+ND2+ND3
ELSE
NUMDAY = TODAY-DNP
ENDI
ELSE
NUMDAY = TODAY-DNP
ENDI
RETU NUMDAY
(5) Не спорю, разбираться лень,
текст «вот правильный расчет…» наводит на мысль что мой вариант не правильный :),
но запрос и результат запроса приведены, проверить не составит труда.
Осталось прикрутить это к 1С (особенно к файловой версии),
и еще я не увидел там банковских (читаем рабочих) дней.
я не говарил что ваш вариант не правильный
тот алгоритм что я привел лучший что я видел за всю свою долгую практику
правда суть его (т.е. ту математику с датами годами в том числе и високосными ) я так и не понял
зато всегда работал правильно
(6)
банковских дней всегда 30 помоему не зависимо от того 28 и 29 февраля
вот данный алгоритм это все и учитывет без всяких Условий и так далее
(8) Под банковскими днями обычно понимают рабочие (не праздники и не выходные, с учетом переносов).
А 30 — наверное среднее количество дней для расчета процентов
(при расчете услуг ЖКХ берется 30.2 дня в месяце, чтобы клиенту ежемесячно начислять одну и туже сумму при расчете по норме или по среднему).
&& Вычисляет количество дней при
&& начислении процентов
говарит о том что взято из «опер дня банка» и так банки начисляют проценты
так что спорить я не буду
я просто привел хороший алгоритм работы с датами
(0) Коллеги, зацените, пожалуйста, расчет просрочек по банковским дням (то есть не по календарным) через алгоритмы внешней обработки