Подсчет банковских дней

05.03.16

Разработка - Математика и алгоритмы

Алгоритм расчета банковских дней от заданной даты, опираясь на производственный календарь. Внимание! Предпраздничные дни не учитываются!

Не знаю, кому принадлежит этот алгоритм. Для меня он уже был народным. Здесь выкладываю большей частью и для себя, чтобы не забыть, но буду рад, если это пригодится кому-нибудь.

Часто возникает задача расчета просрочки платежа от даты реализации на текущую дату. Если речь идет о календарных днях, то все просто - это будет разность дат. Но если речь идет о банковских днях, то необходимо в таком расчете опираться на производственный календарь, который, естественно, предварительно необходимо будет заполнить.

Конкретно мы на нашем предприятии решали задачу просроченной задолженности в УТ 10.3. Там производственный календарь - это регистр сведений РегламентированныйПроизводственныйКалендарь.

Теперь привожу непосредственно алгоритм:

    ВЫБРАТЬ
        Календарь.ДатаКалендаря
    ПОМЕСТИТЬ БанковскиеДни
    ИЗ
        РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
    ГДЕ
        Календарь.ДатаКалендаря >= &ДатаДокумента
        И Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        &ДатаДокумента КАК ДатаДокумента,
        БанковскиеДни.ДатаКалендаря КАК ДатаКалендаря,
        КОЛИЧЕСТВО(БанковскиеДни1.ДатаКалендаря) КАК НомерДняОтЗаданнойДаты
    ИЗ
        БанковскиеДни КАК БанковскиеДни
            ЛЕВОЕ СОЕДИНЕНИЕ БанковскиеДни КАК БанковскиеДни1
            ПО БанковскиеДни.ДатаКалендаря > БанковскиеДни1.ДатаКалендаря
    
    СГРУППИРОВАТЬ ПО
        БанковскиеДни.ДатаКалендаря

Так что получается на выходе этого запроса? А на выходе этого запроса получается таблица, состоящая из дат, исключая выходные дни, идущих в диапазоне от &ДатаДокумента до последней даты заполненного производственного календаря. Каждой такой дате будет соответствовать поле КоличествоДнейОтЗаданнойДаты, т.е от &ДатаДокумента. Приведем запрос и его результат на рисунке:

Теперь можно взять любую дату, сравнить ее с получившейся таблицей и узнать, какое количество банковских дней между &ДатаДокумента и любой из дат из результирующей таблицы. Правда, если датой из результирующей таблицы должен быть выходной, то придется пойти на какую-нибудь хитрость, поскольку выходные из этой таблицы исключены!

расчет банковских дней

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159725    876    399    

862

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9964    sergey279    18    

64

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5213    XilDen    36    

80

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    19364    skovpin_sa    15    

105

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    28278    Филин    37    

118

Запросы Инструментарий разработчика Программист Бесплатно (free)

Список всех популярных обработок.

17.03.2023    60313    kuzyara    89    

190

Запросы Механизмы платформы 1С Программист Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    65299    dsdred    26    

109
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dgolovanov 03.12.15 12:24 Сейчас в теме
А почему Предпраздничный день не учитываете?
vladir; kite2; +2 Ответить
2. kite2 61 03.12.15 15:49 Сейчас в теме
(1) dgolovanov, На самом деле не только предпраздничный. У нас не учтены даже некоторые праздничные дни, потому что календарь мы заполняем по умолчанию. Но так вроде бы всех устраивало. Если честно я даже не очень хорошо понимаю, как учитывать предпраздничный день, это значит вычитать 1 час из общей суммы? Если так, то здесь играет роль понятие день, а не час. День 7 часов = дню 8 часов. У нас так принято.
3. dgolovanov 03.12.15 16:30 Сейчас в теме
(2) Вы меня не поняли, наверное. Предпраздничный день на час короче, но он тоже рабочий, так сказать.
Например, пятница - предпраздничный день, работаем на час меньше. Но отбор только по рабочим дням нам скажет, что в неделе было 4 дня, а не 5. Т.е. один день, вполне себе рабочий, по в регистре являющийся предпраздничным - потеряем.
4. kite2 61 03.12.15 16:47 Сейчас в теме
(3) dgolovanov, Все, понял Вас!
Действительно, предпраздничные дни не учитываются в данном алгоритме.
За год работы от пользователей не поступало жалоб на это! Вы нашли баг, но думаю, что это нетрудно исправить в алгоритме, если предпраздничный день имеет реквизит, а он скорее всего имеет какой-то реквизит или другой признак.
В общем, не учитывали, потому что никто не обращал на это внимание :). Спасибо за замечание.
5. dgolovanov 03.12.15 18:06 Сейчас в теме
Я просто для себя ваял такого плана алгоритм совсем недавно, решил сравнить. Там нечего исправлять-то:
| И Календарь.ВидДня В (
| ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий),
| ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))

Просто может кому пригодится.
Stradivari; kite2; +2 Ответить
6. kite2 61 03.12.15 19:10 Сейчас в теме
(5) dgolovanov, Да, все очень просто.
7. denver069 12.01.16 07:04 Сейчас в теме
Это примитивный вариант подходящий лишь для расчета показателя, например на форме документа. Как правило период просрочки рассчитывать нужно в отчете, а в отчете ДатаДокумента это не параметр, а поле таблицы.
8. kite2 61 12.01.16 08:57 Сейчас в теме
(7) denver069, Для того, о чем Вы говорите, используется связь по параметру в СКД между 2-я наборами данных. Но даже без СКД я придумал однажды как исхитриться, чтобы использовать этот алгоритм, когда дат много. Но это тема для отдельной статьи. Может позже я напишу ее. Сейчас пока нет времени.
9. denver069 12.01.16 10:33 Сейчас в теме
(8) Настоятельно не рекомендую использовать в таких случаях связь наборов данных в СКД. Такие вещи вполне себе нормально делаются и в запросе с использованием производственного календаря и ранжирования исходной таблицы данных.
10. kite2 61 12.01.16 14:22 Сейчас в теме
(9) denver069, Прекрасно. Вот Ваше домашнее задание - напишите об этом статью.
11. kite2 61 12.01.16 14:57 Сейчас в теме
(9) denver069, Вообще говоря, это какой-то не программистский подход "рекомендую, не рекомендую". Технари так не мыслят. Технарь мыслит так, что надо, чтобы это работало. Если он что-то действительно не рекомендует, то способен внятно объяснить, почему он этого не рекомендует. И еще был очень сильный аргумент "примтивный вариант". E=mc^2 - это тоже очень примитивно по сравнению даже с определителем матрицы.
12. Stradivari 157 27.09.16 17:09 Сейчас в теме
Спасибо, пригодилось!
13. kite2 61 28.09.16 08:19 Сейчас в теме
(12) Stradivari, Я рад, что на мою страничку заходят не только тролли, но и люди, которым что-то надо на самом деле.
Оставьте свое сообщение