В некоторых ситуациях бывает необходимо узнать, сколько рабочих дней прошло между двумя датами. Например, при анализе прохождения бизнес-процесса нам интересно, как долго пользователи занимались своими задачами. Если мы для этой цели напишем запрос с использованием стандартной функции РАЗНОСТЬДАТ, то получим количество календарных дней. Это может быть не очень информативно. Например, если пользователь потратил на решение задачи две недели в июле, это соответствует 10 рабочим дням, а в начале января это может быть всего пара рабочих дней.
Чтобы учесть количество только рабочих дней в интервале, необходимо обратиться к данным производственного календаря. В БСП они хранятся в соответствующем регистре сведений ДанныеПроизводственногоКалендаря. Ниже представлен запрос, который определяет время работы над задачей в рабочих днях для случая, когда используется один производственный календарь. Если их несколько, необходимо в запросе добавить условие на соединение таблиц, определяющее, какой календарь подходит для данной задачи.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗадачаИсполнителя.Ссылка КАК Задача,
КОЛИЧЕСТВО(ДниВРаботе.Дата) КАК ВРаботе
ИЗ
Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДниВРаботе
ПО ДниВРаботе.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
И ДниВРаботе.Дата >= НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.Дата, ДЕНЬ)
И ДниВРаботе.Дата <= ВЫБОР
КОГДА ЗадачаИсполнителя.Выполнена
ТОГДА НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.ДатаИсполнения, ДЕНЬ)
ИНАЧЕ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
КОНЕЦ
СГРУППИРОВАТЬ ПО
ЗадачаИсполнителя.Ссылка