Добавить к дате рабочие дни (Запрос)

21.06.18

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

Возникла задача добавить рабочие дни к дате в запросе. Нашел кучу различных вариантов. Все варианты оказались требовательны к ресурсам. Предлагаю вашему вниманию очень простое решение. Основная идея в том, чтобы рассчитывать индекс даты к которой необходимо добавить рабочие дни, и, выполняя разницу между индексом предполагаемой рабочей даты и индексом текущей даты, искать количество дней, которое мы изначально хотели добавить. Но есть один нюанс: прибавить рабочие дни можно только к рабочим дням. Ну это не проблема, доработать очень просто. Для моей задачи такого решения было достаточно.
ВЫБРАТЬ
    &ДатаККоторойНужноДобавитьДни КАК Дата,
    &КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ДанныеКалендаря.Дата
ПОМЕСТИТЬ втДанныеКалендаря
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
ГДЕ
    ДанныеКалендаря.ПроизводственныйКалендарь.Код = "РФ"
    И (ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
            ИЛИ ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
    И ДанныеКалендаря.Дата >= &ДатаДляКалендаря
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ДанныеКалендаря1.Дата,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.Дата) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
    втДанныеКалендаря КАК ДанныеКалендаря1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
        ПО ДанныеКалендаря1.Дата >= ДанныеКалендаря2.Дата

СГРУППИРОВАТЬ ПО
    ДанныеКалендаря1.Дата

ИНДЕКСИРОВАТЬ ПО
    Индекс
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТ.Дата,
    ВТ.КоличествоДней,
    ДанныеКалендаря.Индекс КАК Индекс
ПОМЕСТИТЬ втДатыСИндексами
ИЗ
    втДаты КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
        ПО ВТ.Дата = ДанныеКалендаря.Дата
;

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

 

рабочие дни запрос

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159652    875    399    

862

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9937    sergey279    18    

64

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5198    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    7930    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2403    ivanov660    9    

22

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

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

15.05.2024    8720    implecs_team    6    

47

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

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

11.04.2024    3392    andrey_sag    10    

36
Отзывы
3. CrazyHands 37 28.06.18 12:05 Сейчас в теме
(2) параметр "&ДатаККоторойНужноДобавитьДни" приведен как пример. Входящие даты могут быть разные и их может быть очень много.
jobkostya1c_ERP; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maxvcb 68 23.06.18 17:22 Сейчас в теме
2. Maxx2008 27.06.18 10:21 Сейчас в теме
ДанныеКалендаря.Дата >= &ДатаДляКалендаря


На сколько я понял, эта строка нужна, чтоб не выбирать лишнее из производственного календаря???
Но ведь есть параметр "&ДатаККоторойНужноДобавитьДни", почему его нельзя использовать???
3. CrazyHands 37 28.06.18 12:05 Сейчас в теме
(2) параметр "&ДатаККоторойНужноДобавитьДни" приведен как пример. Входящие даты могут быть разные и их может быть очень много.
jobkostya1c_ERP; +1 Ответить
4. exclusive 07.03.19 19:04 Сейчас в теме
А вот так не проще?
ВЫБРАТЬ МАКСИМУМ(ТребуемаяДата)
ИЗ (
ВЫБРАТЬ ПЕРВЫЕ 5
ДанныеПроизводственногоКалендаря.Дата КАК ТребуемаяДата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь.Код = "РФ"
И ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
И ДанныеПроизводственногоКалендаря.Дата > &ТекущаяДата

УПОРЯДОЧИТЬ ПО
Дата
) КАК РабочиеДаты
5. user696910_asupat 21.08.20 09:05 Сейчас в теме
в случае если ДатаККоторойНужноДобавитьДни указан праздничный день (например, 1 мая), то ДатаПослеДобавленияДней пусто. Как это решить?
6. user696910_asupat 21.08.20 09:38 Сейчас в теме
оказывается это уже обсуждалось здесь
https://forum.infostart.ru/forum9/topic76440/
7. Severwolf 38 02.08.21 12:50 Сейчас в теме
Тоже возникла необходимость добавить рабочие дни к дате, столько всего написали, а не проще через функцию, меньше ресурсов, и передать уже результат в запрос.
//Добавить два рабочих дня к последней дате -------Начало
	СледующийДень = Объект.ДатаОкончание + 86400;
	НеобходимоеКоличествоРабочихДня = 2;
	НикопленноеКоличествоРабочихДней = 0;
	Для i = 1 по 365 Цикл
		СледующийДеньРабочий = СледующийДень;
		НаборЗаписей = РегистрыСведений.ДанныеПроизводственногоКалендаря.СоздатьНаборЗаписей();
	    НаборЗаписей.Отбор.Дата.Установить(СледующийДеньРабочий);
	    НаборЗаписей.Прочитать();
		Если НаборЗаписей.Количество() > 0 Тогда
			ВидДня = НаборЗаписей[0].ВидДня;
	        Если ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий или ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный Тогда
	            СледующийДень = СледующийДеньРабочий + 86400;
				НикопленноеКоличествоРабочихДней = НикопленноеКоличествоРабочихДней+1;
				Если НикопленноеКоличествоРабочихДней = НеобходимоеКоличествоРабочихДня Тогда
					ДваРабочихДняСРасчетнойДаты = СледующийДеньРабочий;
					//Сообщить(ДваРабочихДняСРасчетнойДаты);
					Прервать;
				КонецЕсли;
			Иначе
				СледующийДень = СледующийДеньРабочий + 86400;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	//Добавить два рабочих дня к последней дате -------Конец
Показать
8. marat.coolls 21.04.22 15:28 Сейчас в теме
"ДатаДляКалендаря" Что это за параметр. Никаких объяснений? Типа, попробуй догадайся?
11. starovton 11 28.11.22 15:20 Сейчас в теме
(8) Чтобы ограничить количество записей выбранных из Календаря
9. marat.coolls 21.04.22 17:03 Сейчас в теме
Вопрос, как же доработать этот запрос, чтобы учитывал и выходные дни?
10. KovaraKing 02.06.22 13:15 Сейчас в теме
(9) Замените строчку "ДанныеКалендаря.Индекс КАК Индекс" на "ЕСТЬNULL(ДанныеКалендаря.Индекс, 1) КАК Индекс"
12. starovton 11 28.11.22 15:22 Сейчас в теме
ВЫБРАТЬ
	&ДатаККоторойНужноДобавитьДни КАК Дата,
	&КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.Дата КАК Дата,
	ВТ.КоличествоДней КАК КоличествоДней,
	ЕСТЬNULL(ДанныеКалендаря.Индекс, 1) КАК Индекс
ПОМЕСТИТЬ втДатыСИндексами
ИЗ
	втДаты КАК ВТ
		ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря
		ПО ВТ.Дата = ДанныеКалендаря.Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Даты.Дата КАК Дата,
	ДанныеКалендаря.Дата КАК ДатаПослеДобавленияДней
ИЗ
	втДатыСИндексами КАК Даты
		ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря
		ПО (ДанныеКалендаря.Индекс - Даты.Индекс = Даты.КоличествоДней)
Показать
jobkostya1c_ERP; +1 Ответить
13. maksa2005 550 27.06.23 10:13 Сейчас в теме
Сделал так, малоли кому-то пригодиться
К примеру
Дата1 = 01.06.2023
ВсегоДней = 30
Рассчетная дата = 14.07.2023
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ "+ВсегоДней+"
	                      |	ДанныеПроизводственногоКалендаря.Дата КАК Дата
	                      |ПОМЕСТИТЬ ВТ
	                      |ИЗ
	                      |	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
	                      |ГДЕ
	                      |	ДанныеПроизводственногоКалендаря.ВидДня В(&ВидДня)
	                      |	И ДанныеПроизводственногоКалендаря.Дата > &ДатаСтарта
	                      |;
	                      |
	                      |////////////////////////////////////////////////////////////­////////////////////
	                      |ВЫБРАТЬ
	                      |	МАКСИМУМ(ВТ.Дата) КАК Дата
	                      |ИЗ
	                      |	ВТ КАК ВТ"); 
	Запрос.УстановитьПараметр("ДатаСтарта",Дата1);   
	МассивВидДня = Новый Массив;      
	
	МассивВидДня.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);    
	МассивВидДня.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
	Запрос.УстановитьПараметр("ВидДня",МассивВидДня);  
	Выборка = запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Дата;
	КонецЕсли;
	Возврат Дата1;
Показать
14. ssn5810 80 09.04.24 07:47 Сейчас в теме
(13)
Дата1 = 01.06.2023
ВсегоДней = 30
Рассчетная дата = 14.07.2023


Хрень !!! Вместо 30 дней несколько месяцев прибавляет !!!!
Прикрепленные файлы:
15. maksa2005 550 09.04.24 10:33 Сейчас в теме
(14) писал давно и для своих нужд выполнила свой код
17. ssn5810 80 14.04.24 10:37 Сейчас в теме
(15) Извиняюсь, все работает корректно.
16. ssn5810 80 09.04.24 15:16 Сейчас в теме
КАК Дата в первой и второй выборке...
Оставьте свое сообщение