Выделить календарные недели с периоде

1. NatalkaBal 28 21.06.21 08:55 Сейчас в теме
Добрый день! Подскажите как программно выделить календарные недели в периоде, например период с 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 если есть такая функция в БСП)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
9. Kolesonik 14 21.06.21 11:46 Сейчас в теме +0.8 $m
Попробуй вот это
&НаСервере
Функция РазбитьПериодНаПодпериоды(Знач ДатаНачала, Знач ДатаОкончания)
    
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("ДатаНачала");
    ТаблицаЗначений.Колонки.Добавить("ДатаОкончания");
    
    ПервыйОбход = Истина;
    
    Если Отчет.УровеньДетализации = "День" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецДня(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоДня(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоДня(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецДня(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецДня(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    ИначеЕсли Отчет.УровеньДетализации = "Неделя" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецНедели(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоНедели(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоНедели(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецНедели(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецНедели(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;

        
    ИначеЕсли Отчет.УровеньДетализации = "Месяц" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецМесяца(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоМесяца(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоМесяца(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецМесяца(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецМесяца(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    ИначеЕсли Отчет.УровеньДетализации = "Квартал" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецКвартала(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоКвартала(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоКвартала(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецКвартала(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецКвартала(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    КонецЕсли;
        
    
    Возврат ТаблицаЗначений;
    
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 13 21.06.21 09:07 Сейчас в теме +0.2 $m
(1) Можно примерно так:
НачалоНедели=НачалоПериода;
КонецНедели=НачалоПериода+24*60*60*(7-ДеньНедели(НачалоПериода));
Пока НачалоНедели<=КонецПериода Цикл
   НачалоНедели=КонецНедели+24*60*60;
   КонецНедели=Мин(НачалоНедели+24*60*60*7,КонецПериода);
КонецЦикла;
6. NatalkaBal 28 21.06.21 09:36 Сейчас в теме
(2)
&НаКлиенте
Процедура РазложитьПериода(Команда)

	НачалоНедели = Объект.НачалоПериода;
	КонецНедели  = Объект.НачалоПериода+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
7. user856012 13 21.06.21 09:42 Сейчас в теме
(6)
Получили:
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

Я лишь показал направление, куда копать, осталось добавить еще одну проверку:
    Пока НачалоНедели <= Объект.КонецПериода Цикл
        Если НачалоНедели + 24*60*60 > Объект.КонецПериода Тогда
           Прервать;
        КонецЕсли;
        НачалоНедели = КонецНедели+24*60*60;
        КонецНедели  = Мин(НачалоНедели+24*60*60*7,Объект.КонецПериода);
        Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));
    КонецЦикла;
3. MishinVl 6 21.06.21 09:13 Сейчас в теме
есть функции НачалоНедели, КонецНедели
4. MishinVl 6 21.06.21 09:26 Сейчас в теме
Дата = НачалоМесяца(ТекущаяДата());
	Пока Дата<=КонецМесяца(ТекущаяДата()) Цикл		
		НачалоНед=НачалоНедели(Дата);
		КонецНед=КонецНедели(Дата);

		Дата=Дата+7*86400;
	КонецЦикла;
5. NatalkaBal 28 21.06.21 09:34 Сейчас в теме
(4)
Дата = НачалоМесяца(ТекущаяДата());
Пока Дата<=КонецМесяца(ТекущаяДата()) Цикл
НачалоНед=НачалоНедели(Дата);
КонецНед=КонецНедели(Дата);

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


Не совсем то что нужно, так как период четко определен
8. user856012 13 21.06.21 09:50 Сейчас в теме
+(7) Или так:
   Пока КонецНедели < Объект.КонецПериода Цикл
        НачалоНедели = КонецНедели+24*60*60;
        КонецНедели  = Мин(НачалоНедели+24*60*60*7,Объект.КонецПериода);
        Сообщить(Строка(НачалоНедели) + " - " + Строка(КонецНедели));
   КонецЦикла;
9. Kolesonik 14 21.06.21 11:46 Сейчас в теме +0.8 $m
Попробуй вот это
&НаСервере
Функция РазбитьПериодНаПодпериоды(Знач ДатаНачала, Знач ДатаОкончания)
    
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("ДатаНачала");
    ТаблицаЗначений.Колонки.Добавить("ДатаОкончания");
    
    ПервыйОбход = Истина;
    
    Если Отчет.УровеньДетализации = "День" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецДня(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецДня(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоДня(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоДня(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецДня(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецДня(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    ИначеЕсли Отчет.УровеньДетализации = "Неделя" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецНедели(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецНедели(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоНедели(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоНедели(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецНедели(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецНедели(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;

        
    ИначеЕсли Отчет.УровеньДетализации = "Месяц" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецМесяца(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецМесяца(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоМесяца(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоМесяца(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецМесяца(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецМесяца(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    ИначеЕсли Отчет.УровеньДетализации = "Квартал" Тогда
        
        Пока ДатаНачала <= ДатаОкончания Цикл
            
            Если ПервыйОбход Тогда
                
                Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = ДатаНачала;
                    НоваяСтрока.ДатаОкончания    = КонецКвартала(ДатаНачала);
                КонецЕсли;
                
            Иначе
                
                Если КонецКвартала(ДатаНачала) >= ДатаОкончания Тогда
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоКвартала(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = ДатаОкончания;
                    
                    Прервать;
                Иначе
                    НоваяСтрока = ТаблицаЗначений.Добавить();
                    НоваяСтрока.ДатаНачала        = НачалоКвартала(ДатаНачала);
                    НоваяСтрока.ДатаОкончания    = КонецКвартала(ДатаНачала);
                КонецЕсли;
                
            КонецЕсли;
            
            ДатаНачала    = КонецКвартала(ДатаНачала)+1;
            ПервыйОбход    = Ложь;    
            
        КонецЦикла;
        
    КонецЕсли;
        
    
    Возврат ТаблицаЗначений;
    
КонецФункции
Показать
10. Kolesonik 14 21.06.21 11:47 Сейчас в теме
(9)уровень детализации через параметр передай
11. drkhaired 51 21.06.21 11:48 Сейчас в теме
Может в запросе выбрать все даты за период, сгруппировать по Год, Номер недели, Дата (минимум) и Дата (максимум)?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот