Разрабатывая некий функционал в 1С, бывает, необходимо посчитать количество рабочих дней после какой-то даты.
В этой статье примеры кода и запросы в которых считается количество рабочих дней:
Код, при вычислении определяет только по дню недели, викидывая выходные. Праздники не учитывает!
В запросе, с использованием производственного календаря и учетом всех праздников:
Еще один вариант, в котором допустим, что:
1) Регистр сведений Календарь имеет структуру (Измерения=<ДатаКалендаря>, Ресурсы=<ВидДня>), а перечисление ВидыДня задано как <Рабочий, Предпразничный>и праздничные дни в календаре отсутствуют.
2) В документе Реализация заданы поля Дата и ОтсрочкаДней. Тогда:
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Появилась необходимость посчитать количество рабочих дней за период, но не с учетом всех праздников, а просто выкинув субботы и воскресенья. Решил обойтись без использования производственного календаря.
Если все же нужно вычислить рабочие дни без праздников и выходных, по данным производственного календаря, то функция ЧислоРабочихДней, которая есть в некоторых конфигурациях (воспользуйтесь глобальным поиском) очень сэкономит вам время.
Итак получился вот такой код, чисто арифметика без запросов к БД:
Постановка задачи:
Есть таблица, в которой указаны дата возникновения долга и допустимое количество дней просрочки в рабочих днях. Для простоты добавим сам документ в таблицу.
04.03.2015 | 90 | |
Док 2 | 04.03.2015 | 5 |
Док 3 | 04.03.2015 | 10 |
Док 4 | 05.03.2015 | 60 |
В результате должны получить таблицу вида
Дата возникновения долга | Кол-во дней отсрочки | Дата возникновения просроченного долга |
---|---|---|
Док 1 | 04.03.2015 | 90 |
Док 2 | 04.03.2015 | 5 |
Док 3 | 04.03.2015 | 10 |
Док 4 | 05.03.2015 | 60 |
Первоначально был сделан отчет на СКД, куда помещался внешний набор данных. Но, посидев-покурив, решили сварганить запрос. И вот о нем и расскажу вам.
Реализация:
Первоначальные данные получаются следующим куском кода
Само собой получим Регламентированный производственный календарь.
Здесь необходимо установить параметр "ВидДня" (значения перечисления Рабочий и Предпраздничный). Далее соединяем таблицу календаря саму с собой и получаем индекс даты (т.е. порядок следования записей) в нашей таблице
Тут соединим таблицу ВТ и ВТ_РеглКалендарьСИндексами для того, что бы узнать какой индекс будет у нашей даты возникновения долга. Дополнительно добавим индексацию по расчетному полю для дальнейших соединений.
Здесь приведу результаты промежуточной таблицы для наглядности.
04.03.2015 | 90 | 1 293 | |
Док 2 | 04.03.2015 | 5 | 1 293 |
Док 3 | 04.03.2015 | 10 | 1 293 |
Док 4 | 05.03.2015 | 60 | 1 294 |
Здесь колонка «Индекс даты долга» показывает индекс поля «Дата возникновения долга» в таблице ВТ_РеглКалендарьСИндексами.
Далее мы можем получить результат » Дата возникновения просроченного долга » для каждой даты долга с учетом дней просрочки. Для этого соединим две таблицы.
Здесь условие соединения означает, что мы хотим получить только ту дату из таблицы ВТ_РеглКалендарьСИндексами, у которой разница Индекса регламентированного календаря и Индекса даты долга будет равно именно количеству дней отсрочки.
Результирующая таблица выглядит следующим образом:
«>