Вычислить РАЗНОСТЬДАТ в рабочих днях

20.10.20

Разработка - Запросы

Вычисление количества рабочих днях между двумя датами в запросе.

В некоторых ситуациях бывает необходимо узнать, сколько рабочих дней прошло между двумя датами. Например, при анализе прохождения бизнес-процесса нам интересно, как долго пользователи занимались своими задачами. Если мы для этой цели напишем запрос с использованием стандартной функции РАЗНОСТЬДАТ, то получим количество календарных дней. Это может быть не очень информативно. Например, если пользователь потратил на решение задачи две недели в июле, это соответствует 10 рабочим дням, а в начале января это может быть всего пара рабочих дней.

Чтобы учесть количество только рабочих дней в интервале, необходимо обратиться к данным производственного календаря. В БСП они хранятся в соответствующем регистре сведений ДанныеПроизводственногоКалендаря. Ниже представлен запрос, который определяет время работы над задачей в рабочих днях для случая, когда используется один производственный календарь. Если их несколько, необходимо в запросе добавить условие на соединение таблиц, определяющее, какой календарь подходит для данной задачи.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ЗадачаИсполнителя.Ссылка КАК Задача,
	КОЛИЧЕСТВО(ДниВРаботе.Дата) КАК ВРаботе
ИЗ
	Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДниВРаботе
		ПО ДниВРаботе.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
			И ДниВРаботе.Дата >= НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.Дата, ДЕНЬ)
			И ДниВРаботе.Дата <= ВЫБОР
				КОГДА ЗадачаИсполнителя.Выполнена
					ТОГДА НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.ДатаИсполнения, ДЕНЬ)
				ИНАЧЕ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
			КОНЕЦ

СГРУППИРОВАТЬ ПО
	ЗадачаИсполнителя.Ссылка

 

СКД запрос РАЗНОСТЬДАТ производственный календарь рабочий день

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    131383    713    390    

761

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    3705    implecs_team    6    

37

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2667    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6353    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2332    2    Yashazz    0    

32

Запрос 1С copilot

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7258    45    mkalimulin    32    

54

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    2045    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3522    52    DrZombi    54    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Константин С. 668 20.10.20 14:38 Сейчас в теме
Ну или так
https://its.1c.ru/db/bsp303doc#content:2861:hdoc

используя БСП-ные функции


Результат = КалендарныеГрафики.РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания)


Результат = КалендарныеГрафики.РазностьДатПоКалендарю(ГрафикРаботы, ДатаНачала, ДатаОкончания, ВызыватьИсключение)
antonivan; +1 Ответить
2. antonivan 163 20.10.20 15:12 Сейчас в теме
(1) Это если в коде нужно, а не в запросе
9. TimurD 6 26.10.20 17:07 Сейчас в теме
(2) Если СКД, то можно как функцию вызвать и делов.
10. antonivan 163 26.10.20 17:52 Сейчас в теме
(9) Думаю, вызов функции для каждой строки может тормозить. Оптимальнее все-таки сразу в запросе
stopa85; RustIG; +2 Ответить
3. stas_ganiev 1786 21.10.20 12:02 Сейчас в теме
А как же те товарищи, которые работают по шестидневке? У них суббота рабочий день.
А еще, недавно в ЗУП добавили новый регистр, в котором хранятся нерабочие дни по федеральному приказу (привет, Ковид), их было бы неплохо учесть...
Артано; RustIG; +2 Ответить
4. antonivan 163 21.10.20 12:53 Сейчас в теме
(3) Тут уже индивидуально под каждую задачу. Если, допустим, у менеджеров шестидневка, то в соединении можно задать условие, при роли исполнителя "Менеджер" учитывать вид дня "Суббота". А ковидные дни и в стандартном производственном календаре числятся нерабочими.
5. triviumfan 94 26.10.20 09:56 Сейчас в теме
Производительность запроса оставляет желать лучшего.
6. ilya2184 62 26.10.20 16:16 Сейчас в теме
(5) Как, по Вашему, можно было бы улучшить?
ВидДня и Дата - в индексах - вроде нормально должно быть.
А группировка по задачам - никуда не денешься если много задач - будет тормозить, как вариант отобрать только нужные задачи - новый реквизит, для выполненных задач заполнять его и получать только для невыполненных.
7. ilya2184 62 26.10.20 16:21 Сейчас в теме
Отбор по календарю надо бы добавить: сейчас много календарей - у нас два календаря - один для банковских дней - для расчета сроков задолженности - как вы помните "пандемия" не повод не платить по счетам, а другой - для рабочих - работать нельзя.
8. SlavaKron 26.10.20 16:37 Сейчас в теме
Мне кажется слабым местом это условие связи:
ДниВРаботе.Дата <= ВЫБОР
	КОГДА ЗадачаИсполнителя.Выполнена
		ТОГДА НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.ДатаИсполнения, ДЕНЬ)
	ИНАЧЕ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
	КОНЕЦ

Дату начала и окончания периода следует вычислять для задач отдельно, а не для каждой связи.
ВЫБРАТЬ
	ЗадачаИсполнителя.Ссылка КАК Ссылка,
	НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.Дата, ДЕНЬ) КАК ДатаНачала,
	ВЫБОР
		КОГДА ЗадачаИсполнителя.Выполнена
			ТОГДА НАЧАЛОПЕРИОДА(ЗадачаИсполнителя.ДатаИсполнения, ДЕНЬ)
		ИНАЧЕ &НачалоТекущейДаты
	КОНЕЦ КАК ДатаОкончания
ПОМЕСТИТЬ Задачи
ИЗ
	Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	Задачи.Ссылка КАК Задача,
	КОЛИЧЕСТВО(*) КАК ВРаботе
ИЗ
	Задачи КАК Задачи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДниВРаботе
		ПО (ДниВРаботе.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)))
			И Задачи.ДатаНачала <= ДниВРаботе.Дата
			И Задачи.ДатаОкончания >= ДниВРаботе.Дата

СГРУППИРОВАТЬ ПО
	Задачи.Ссылка
Показать
Aleskey_K; +1 Ответить
12. antonivan 163 26.10.20 17:58 Сейчас в теме
(8) Согласен, если сначала выбрать во временную таблицу задачи (и желательно наложить отборы) получится быстрее
11. buganov 201 26.10.20 17:58 Сейчас в теме
ИНАЧЕ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)

Почему бы сразу не передавать начало дня текущей даты, зачем ее вычислять в запросе?
RustIG; antonivan; +2 1 Ответить
13. FatPanzer 26.10.20 18:00 Сейчас в теме
(11) Защита от дурака, я так понимаю... Приведение к работоспособному варианту.
insurgut; stas_ganiev; +2 Ответить
14. Dem1urg 388 28.10.20 18:42 Сейчас в теме
А есть решение запросом задачи по добавлению к дате заданного количества рабочих дней?
15. FatPanzer 28.10.20 18:45 Сейчас в теме
(14) Когда-то делал даже почасовой расчёт с учётом часовых поясов...
16. antonivan 163 28.10.20 19:31 Сейчас в теме
(14) Мне такого делать не приходилось. Навскидку думаю, можно было бы для интервала дат, использующихся в запросе создать временную таблицу, в которой пронумеровать рабочие дни, а потом делать соединение с этой таблицей по количеству дней, которое надо добавить. Типа СОЕДИНЕНИЕ ПО ВТ.НомерДня = &КоличествоДнейКотороеНадоДобавить - НомерИсходногоДня.
При этом сначала получить для нужных дат НомерИсходногоДня соединением ВТ.Дата = ДатаИсходногоДня.
17. Simonov_NPM 30.10.20 05:08 Сейчас в теме
Запрос для определения рабочего дня следующего за выходным для УПП
ВЫБРАТЬ
	ВложенныйЗапрос.ДеньКалендаря,
	ВложенныйЗапрос.РабочийДень
ПОМЕСТИТЬ ВТ_СледующийабочийДень
ИЗ
	(ВЫБРАТЬ
		ВсеДниКалендаря.ДатаКалендаря КАК ДеньКалендаря,
		МИНИМУМ(РабочиеДниКалендаря.ДатаКалендаря) КАК РабочийДень
	ИЗ
		РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ВсеДниКалендаря
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РабочиеДниКалендаря
			ПО (РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
					ИЛИ РабочиеДниКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
				И (ДОБАВИТЬКДАТЕ(ВсеДниКалендаря.ДатаКалендаря, ДЕНЬ, &КоличествоДней) <= РабочиеДниКалендаря.ДатаКалендаря)
	ГДЕ
		ВсеДниКалендаря.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
	
	СГРУППИРОВАТЬ ПО
		ВсеДниКалендаря.ДатаКалендаря) КАК ВложенныйЗапрос
;
Показать
trest30; KonsaltBaltic; Dem1urg; +3 Ответить
18. qazaz2 17 28.11.21 11:31 Сейчас в теме
Автору спс, сам бы ни за что не допер!
Оставьте свое сообщение