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

05.03.16

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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

10000 руб.

02.09.2020    124821    682    389    

732

Начните уже использовать хранилище запросов

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

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

11.10.2023    16589    skovpin_sa    14    

101

MS SQL Server: изучаем планы запросов

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

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

20.06.2023    16989    Филин    37    

114

Все консоли запросов для 1С

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

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

17.03.2023    37381    kuzyara    87    

181

Идентификатор объекта в запросе. Вы этого хотели?

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

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

12.01.2023    41623    dsdred    26    

97

Практическая шпаргалка по новым возможностям языка запросов 1С

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

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    23869    quazare    36    

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

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