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