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