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
//Сообщить(Год_Даты+" "+Месяц_Даты);
КонецЦикла;
Иначе // Например: Сообщить("Данные отсутствуют!");
КонецЕсли;
КонецФункции
Функция ЗапросомРазбитьПериодНаПодпериоды(Знач НачДата, Знач КонДата)
// например НачДата 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
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник