Добрый день! Подскажите как программно выделить календарные недели в периоде, например период с 17.06.2021-30.06.2021 должно получится интервалы 17.06.2021-20.06.2021; 21.06.2021-27.06.2021; 28.06.2021-30.06.2021 (возможно и до 04.07.2021 если есть такая функция в БСП)
---
Попробуй вот это

```1c
    &НаСервере
    Функция РазбитьПериодНаПодпериоды(Знач ДатаНачала, Знач ДатаОкончания)

    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("ДатаНачала");
    ТаблицаЗначений.Колонки.Добавить("ДатаОкончания");

    ПервыйОбход = Истина;

    Если Отчет.УровеньДетализации = "День" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецДня(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоДня(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоДня(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецДня(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецДня(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Неделя" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецНедели(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоНедели(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоНедели(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецНедели(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецНедели(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Месяц" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецМесяца(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоМесяца(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоМесяца(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецМесяца(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецМесяца(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Квартал" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецКвартала(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоКвартала(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоКвартала(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецКвартала(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецКвартала(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    КонецЕсли;

    Возврат ТаблицаЗначений;

    КонецФункции
```
---
Можно примерно так:

```1c
    НачалоНедели=НачалоПериода;
    КонецНедели=НачалоПериода+24*60*60*(7-ДеньНедели(НачалоПериода));
    Пока НачалоНедели<=КонецПериода Цикл
    НачалоНедели=КонецНедели+24*60*60;
    КонецНедели=Мин(НачалоНедели+24*60*60*7,КонецПериода);
    КонецЦикла;
```
---
```1c
    &НаКлиенте
    Процедура РазложитьПериода(Команда)

    НачалоНедели = Объект.НачалоПериода;
    КонецНедели = Объект.НачалоПериода+24*60*60*(7-ДеньНедели(Объект.НачалоПериода));
    Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));

    Пока НачалоНедели <= Объект.КонецПериода Цикл
    НачалоНедели = КонецНедели+24*60*60;
    КонецНедели = Мин(НачалоНедели+24*60*60*7,Объект.КонецПериода);
    Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));
    КонецЦикла;

    КонецПроцедуры
```

Получили:
21.06.2021 0:00:00 - 28.06.2021 0:00:00
17.06.2021 0:00:00 - 20.06.2021 0:00:00
29.06.2021 0:00:00 - 30.06.2021 0:00:00
01.07.2021 0:00:00 - 30.06.2021 0:00:00
---
Получили:
21.06.2021 0:00:00 - 28.06.2021 0:00:00
17.06.2021 0:00:00 - 20.06.2021 0:00:00
29.06.2021 0:00:00 - 30.06.2021 0:00:00
01.07.2021 0:00:00 - 30.06.2021 0:00:00
Я лишь показал направление, куда копать, осталось добавить еще одну проверку:

```1c
    Пока НачалоНедели <= Объект.КонецПериода Цикл
    Если НачалоНедели + 24*60*60 > Объект.КонецПериода Тогда
    Прервать;
    КонецЕсли;
    НачалоНедели = КонецНедели+24*60*60;
    КонецНедели = Мин(НачалоНедели+24*60*60*7,Объект.КонецПериода);
    Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));
    КонецЦикла;
```
---
есть функции НачалоНедели, КонецНедели
---
```1c
    Дата = НачалоМесяца(ТекущаяДата());
    Пока Дата<=КонецМесяца(ТекущаяДата()) Цикл
    НачалоНед=НачалоНедели(Дата);
    КонецНед=КонецНедели(Дата);

    Дата=Дата+7*86400;
    КонецЦикла;
```
---
Дата = НачалоМесяца(ТекущаяДата());
Пока Дата<=КонецМесяца(ТекущаяДата()) Цикл
НачалоНед=НачалоНедели(Дата);
КонецНед=КонецНедели(Дата);

Дата=Дата+7*86400;
КонецЦикла;

Не совсем то что нужно, так как период четко определен
---
+(7) Или так:

```1c
    Пока КонецНедели < Объект.КонецПериода Цикл
    НачалоНедели = КонецНедели+24*60*60;
    КонецНедели = Мин(НачалоНедели+24*60*60*7,Объект.КонецПериода);
    Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));
    КонецЦикла;
```
---
Попробуй вот это

```1c
    &НаСервере
    Функция РазбитьПериодНаПодпериоды(Знач ДатаНачала, Знач ДатаОкончания)

    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("ДатаНачала");
    ТаблицаЗначений.Колонки.Добавить("ДатаОкончания");

    ПервыйОбход = Истина;

    Если Отчет.УровеньДетализации = "День" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецДня(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоДня(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоДня(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецДня(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецДня(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Неделя" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецНедели(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоНедели(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоНедели(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецНедели(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецНедели(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Месяц" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецМесяца(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоМесяца(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоМесяца(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецМесяца(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецМесяца(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    ИначеЕсли Отчет.УровеньДетализации = "Квартал" Тогда

    Пока ДатаНачала <= ДатаОкончания Цикл

    Если ПервыйОбход Тогда

    Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = ДатаНачала;
    НоваяСтрока.ДатаОкончания = КонецКвартала(ДатаНачала);
    КонецЕсли;

    Иначе

    Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоКвартала(ДатаНачала);
    НоваяСтрока.ДатаОкончания = ДатаОкончания;

    Прервать;
    Иначе
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ДатаНачала = НачалоКвартала(ДатаНачала);
    НоваяСтрока.ДатаОкончания = КонецКвартала(ДатаНачала);
    КонецЕсли;

    КонецЕсли;

    ДатаНачала = КонецКвартала(ДатаНачала)+1;
    ПервыйОбход = Ложь;

    КонецЦикла;

    КонецЕсли;

    Возврат ТаблицаЗначений;

    КонецФункции
```
---
уровень детализации через параметр передай
---
Может в запросе выбрать все даты за период, сгруппировать по Год, Номер недели, Дата (минимум) и Дата (максимум)?