Банковские дни запросом

24.11.11

Разработка - Запросы

Часто в отчетах требуется получить дату через N банковских дней,
данный запрос на выходе дает таблицу:
Дата | Дата_Через_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/

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    130531    704    390    

755

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    3426    implecs_team    6    

36

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2639    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6323    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2310    2    Yashazz    0    

32

Запрос 1С copilot

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7180    42    mkalimulin    32    

54

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    2027    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3502    52    DrZombi    54    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
0. sm0123 58 30.11.11 13:05 Сейчас в теме
Часто в отчетах требуется получить дату через N банковских дней,
данный запрос на выходе дает таблицу:
Дата | Дата_Через_N_Банковских дней.

Параметр (&КоличествоБанковскиДней*1.5 + 20)
не случаен 20 - максимальное количество не банковских дней подряд (примерно)
1,5 - отношение количества банковских дней к календарным дням,
чем он меньше тем быстрее выполняется запрос, но если он слишком мал, не все даты могут попасть в
результат, поэтому взял с запасом.




Перейти к публикации

1. dnikolaev 178 30.11.11 13:05 Сейчас в теме
2. Borisych 503 03.12.11 01:37 Сейчас в теме
Жесть.
ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней.ДатаКалендаря КАК ДатаКалендаря,
	СУММА(РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней.Пятидневка) КАК Пятидневка
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь_ДатаОт
		ПО РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней.ДатаКалендаря >= РегламентированныйПроизводственныйКалендарь_ДатаОт.ДатаКалендаря
ГДЕ
	РегламентированныйПроизводственныйКалендарь_ДатаОт.ДатаКалендаря >= &ДатаОт
	И РегламентированныйПроизводственныйКалендарь_ДатаОт.Пятидневка = 1

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней.ДатаКалендаря

ИМЕЮЩИЕ
	СУММА(РегламентированныйПроизводственныйКалендарь_ДатаЧерезNБанков­скихДней.Пятидневка) = &ЧерезNБанковскихДней

УПОРЯДОЧИТЬ ПО
	ДатаКалендаря
Показать


На мой взгляд гораздо проще смотрится
4. sm0123 58 03.12.11 09:38 Сейчас в теме
(2) Конечно проще, запрос вернет одну строку, но по условию задачи требуется таблица.
(3) Мне встречалось, при построении больших отчетов по расчету задолженности.
3. Borisych 503 03.12.11 01:39 Сейчас в теме
мне не встречалось необходимости получать список как в публикации, обычно дата через N банковских дней нужна для конкретной даты
5. opus70 74 09.12.11 12:58 Сейчас в теме
вот кому интресно правильный расчет банковских дат и так далее
можете переписать на 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
6. sm0123 58 09.12.11 13:05 Сейчас в теме
(5) Не спорю, разбираться лень,
текст "вот правильный расчет..." наводит на мысль что мой вариант не правильный :),
но запрос и результат запроса приведены, проверить не составит труда.

Осталось прикрутить это к 1С (особенно к файловой версии),
и еще я не увидел там банковских (читаем рабочих) дней.
8. opus70 74 09.12.11 14:24 Сейчас в теме
(6)
банковских дней всегда 30 помоему не зависимо от того 28 и 29 февраля
вот данный алгоритм это все и учитывет без всяких Условий и так далее
9. sm0123 58 09.12.11 16:08 Сейчас в теме
(8) Под банковскими днями обычно понимают рабочие (не праздники и не выходные, с учетом переносов).
А 30 - наверное среднее количество дней для расчета процентов
(при расчете услуг ЖКХ берется 30.2 дня в месяце, чтобы клиенту ежемесячно начислять одну и туже сумму при расчете по норме или по среднему).
7. opus70 74 09.12.11 14:05 Сейчас в теме
я не говарил что ваш вариант не правильный
тот алгоритм что я привел лучший что я видел за всю свою долгую практику
правда суть его (т.е. ту математику с датами годами в том числе и високосными ) я так и не понял
зато всегда работал правильно
10. opus70 74 10.12.11 16:31 Сейчас в теме
&& Вычисляет количество дней при
&& начислении процентов
говарит о том что взято из "опер дня банка" и так банки начисляют проценты
так что спорить я не буду
я просто привел хороший алгоритм работы с датами
11. RustIG 1640 25.03.15 10:29 Сейчас в теме
(0) Коллеги, зацените, пожалуйста, расчет просрочек по банковским дням (то есть не по календарным) через алгоритмы внешней обработки http://infostart.ru/public/338386/
Оставьте свое сообщение