1С 8.3 Разбить период по подпериодам (месяц, неделя, день, квартал) - Программист 1С Минск. Автоматизация бизнеса.

Популярные страницы:
Перейти к контенту

1С 8.3 Разбить период по подпериодам (месяц, неделя, день, квартал)

Данные > Примеры кода 1С > 1С 8.3 Дата и время
Перейти в основной раздел:
Аналоги типовой функции РазложитьНаПериоды (запросом или через цикл). Методы использовались для разбиения периода в нетиповых решениях. Делят любой период (между начальной и конечной датой) по нужным отрезкам: месяц, неделя, день, квартал. Для отчетов на СКД можно скачать Пример группировки по месяцам в СКД.
Разбить период на подпериоды (запросом) в 1С 8.3:
&НаСервере
Функция ЗапросомРазбитьПериодНаПодпериоды(Знач НачДата, Знач КонДата)

   // например НачДата 05.05.2021, КонДата 27.09.2021

   Запрос = Новый Запрос("ВЫБРАТЬ
                                         |    НАЧАЛОПЕРИОДА(&НачДата, МЕСЯЦ) КАК Период
                                         |ИТОГИ ПО
                                         |    Период ПЕРИОДАМИ(МЕСЯЦ, &НачДата, &КонДата)");

   Запрос.УстановитьПараметр("НачДата", НачДата);
   Запрос.УстановитьПараметр("КонДата", КонДата);

   РезультатЗапроса = Запрос.Выполнить();
   Если Не РезультатЗапроса.Пустой() Тогда // Такая проверка рекомендуется фирмой 1С
       Записи = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "ВСЕ");

       // Обход результата запроса по каждой записи в полученной выборке
       Пока Записи.Следующий() Цикл
           Сообщить(Записи.Период);
           //   01.05.2021 0:00:00
           //   01.06.2021 0:00:00
           //   01.07.2021 0:00:00
           //   01.08.2021 0:00:00
           //   01.09.2021 0:00:00

           //Год_Даты = СокрЛП(Год(Записи.Период)); // 2 021
           //Месяц_Даты = СокрЛП(Месяц(Записи.Период)); // 9
           //Сообщить(Год_Даты+" "+Месяц_Даты);
       КонецЦикла;

   Иначе // Например: Сообщить("Данные отсутствуют!");
   КонецЕсли;

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

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

   ПервыйОбходЦикла = Истина;
   Если УровеньДетализации = "День" Тогда

       Пока НачДата <= КонДата Цикл
           Если ПервыйОбходЦикла Тогда
               Если КонецДня(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонецДня(НачДата);
               КонецЕсли;
           Иначе
               Если КонецДня(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоДня(НачДата);
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоДня(НачДата);
                   НоваяСтрока.КонДата = КонецДня(НачДата);
               КонецЕсли;
           КонецЕсли;
           НачДата    = КонецДня(НачДата)+1;
           ПервыйОбходЦикла    = Ложь;
       КонецЦикла;

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

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

                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонецНедели(НачДата);
               КонецЕсли;
           Иначе
               Если КонецНедели(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоНедели(НачДата);
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоНедели(НачДата);
                   НоваяСтрока.КонДата = КонецНедели(НачДата);
               КонецЕсли;
           КонецЕсли;
           НачДата = КонецНедели(НачДата)+1;
           ПервыйОбходЦикла = Ложь;
       КонецЦикла;

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

       Пока НачДата <= КонДата Цикл
           Если ПервыйОбходЦикла Тогда
               Если КонецМесяца(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонецМесяца(НачДата);
               КонецЕсли;
           Иначе
               Если КонецМесяца(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоМесяца(НачДата);
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоМесяца(НачДата);
                   НоваяСтрока.КонДата = КонецМесяца(НачДата);
               КонецЕсли;
           КонецЕсли;
           НачДата = КонецМесяца(НачДата)+1;
           ПервыйОбходЦикла = Ложь;
       КонецЦикла;

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

       Пока НачДата <= КонДата Цикл
           Если ПервыйОбходЦикла Тогда
               Если КонецКвартала(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачДата;
                   НоваяСтрока.КонДата = КонецКвартала(НачДата);
               КонецЕсли;
           Иначе
               Если КонецКвартала(НачДата) >= КонДата Тогда
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоКвартала(НачДата);
                   НоваяСтрока.КонДата = КонДата;
                   Прервать;
               Иначе
                   НоваяСтрока = ТаблицаДат.Добавить();
                   НоваяСтрока.НачДата = НачалоКвартала(НачДата);
                   НоваяСтрока.КонДата = КонецКвартала(НачДата);
               КонецЕсли;
           КонецЕсли;
           НачДата = КонецКвартала(НачДата)+1;
           ПервыйОбходЦикла = Ложь;
       КонецЦикла;

   КонецЕсли;

   Возврат ТаблицаДат;

КонецФункции
Поиск кода
0
Комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 27.09.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому