Задача
Дана таблица "Исходные даты" с колонками:
"Дата отсчета";
"Прибавить рабочих дней".
Нужно получить таблицу "Результат" с колонками:
"Дата отсчета";
"Прибавить рабочих дней";
"Дата добавлены рабочие дни".
Запрос
ВЫБРАТЬ
ИсходныеДаты.ДатаОтсчета КАК ДатаОтсчета,
ИсходныеДаты.ПрибавитьРабочихДней + 1 КАК ПрибавитьРабочихДней
ПОМЕСТИТЬ ИсходныеДаты
ИЗ
&ИсходныеДаты КАК ИсходныеДаты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ИсходныеДаты.ДатаОтсчета,
ИсходныеДаты.ПрибавитьРабочихДней,
ДанныеПроизводственногоКалендаря.Дата КАК РабочийДень
ПОМЕСТИТЬ СоединениеСРабочими
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходныеДаты КАК ИсходныеДаты
ПО (ИсходныеДаты.ДатаОтсчета <= ДанныеПроизводственногоКалендаря.Дата)
И (ДОБАВИТЬКДАТЕ(ИсходныеДаты.ДатаОтсчета, ДЕНЬ, ИсходныеДаты.ПрибавитьРабочихДней * 2 + 10) > ДанныеПроизводственногоКалендаря.Дата)
ГДЕ
ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
И ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &КалендарьРФ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СоединениеСРабочими.ДатаОтсчета,
СоединениеСРабочими.ПрибавитьРабочихДней - 1 КАК ПрибавитьРабочихДней,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) КАК КоличествоРабочихДней,
СоединениеСРабочими1.РабочийДень КАК ДатаДобавленыРабочиеДни
ИЗ
СоединениеСРабочими КАК СоединениеСРабочими
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоединениеСРабочими КАК СоединениеСРабочими1
ПО СоединениеСРабочими.РабочийДень <= СоединениеСРабочими1.РабочийДень
СГРУППИРОВАТЬ ПО
СоединениеСРабочими.ПрибавитьРабочихДней,
СоединениеСРабочими.ДатаОтсчета,
СоединениеСРабочими1.РабочийДень
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) = СоединениеСРабочими.ПрибавитьРабочихДней
Нужно пояснить применение конструкции:
"ДОБАВИТЬКДАТЕ(ИсходныеДаты.ДатаОтсчета, ДЕНЬ, ИсходныеДаты.ПрибавитьРабочихДней * 2 + 10)"
Назовём её "Глубина поиска".
Это конец периода, в котором мы ищем дату "Дата добавлены рабочие дни".
Поясню на примере:
"Дата отсчета" = 01.07.2015.
"Прибавить рабочих дней" = 5.
Искомая дата ("Дата добавлены рабочие дни") = 08.07.2015;
Глубина поиска в таком случае равна 21.07.2015.
Тоесть мы ищем дату 08.07.2015 и интервале между 01.07.2015 и 21.07.2015. И находим.
Теперь почему +10 и умножаем на 2 ?
Потому что максимальное количество выходных подряд в году равно примерно 10 и соотношение рабочих и выходных дней примерно 2 к 1.
Таким образом должно работать для всех случаев.
П.С.
Есть аналогичная публикация:
Отличие моей:
1) Сделано для БП 3.0;
2) Сделано для нескольких дат (задаётся в таблице, а не параметром);
3) Значительно более эффективный запрос.