База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как посчитать будние дни за период в 1С-запросе с использованием календаря? › Ответ в теме: Как посчитать будние дни за период в 1С-запросе с использованием календаря?
В 1С в запросе нет встроенной функции для подсчёта будних дней, но можно использовать регламентированный производственный календарь (РегистрСведений.РегламентированныйПроизводственныйКалендарь), если он есть в вашей конфигурации. В этом регистре хранятся даты с указанием вида дня (рабочий, выходной, праздничный и т.п.).
Пример запроса, который считает количество будних дней (рабочих и предпраздничных) за период:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Календарь.ДатаКалендаря) КАК КоличествоБуднихДней |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь |ГДЕ | Календарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаКонца | И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.КоличествоБуднихДней; Иначе Возврат 0; КонецЕсли; |
Где:
— ДатаНачала и ДатаКонца — параметры с датами начала и конца периода.
— ВидДня — поле, указывающее тип дня (рабочий, выходной, предпраздничный и т.п.).
— В запросе считаются только дни с типом «Рабочий» и «Предпраздничный» (т.е. будние).
Если у вас нет регламентированного производственного календаря, то в чистом запросе без него посчитать будние дни нельзя, тогда нужно либо:
— Создать собственный справочник или регистр с календарём,
— Либо считать в коде 1С, перебирая даты и проверяя день недели (функция ДеньНедели()).
Пример подсчёта будних дней в коде 1С без запроса:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Функция КоличествоБуднихДней(ДатаНачала, ДатаКонца) Количество = 0; ТекущаяДата = ДатаНачала; Пока ТекущаяДата <= ДатаКонца Цикл ДеньНедели = ДеньНедели(ТекущаяДата, 2); // 2 - понедельник=1, воскресенье=7 Если ДеньНедели >= 1 И ДеньНедели <= 5 Тогда Количество = Количество + 1; КонецЕсли; ТекущаяДата = ТекущаяДата + 1; КонецЦикла; Возврат Количество; КонецФункции |
Если нужно именно в запросе — используйте регламентированный календарь, как в примере выше.
https://helpf.pro/faq/view/1421.html (работа с датами и периодами в 1С)