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

21.06.18

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

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

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

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

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

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

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

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

 

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

См. также

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

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

15500 руб.

02.09.2020    184687    1029    403    

967

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2198    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

03.12.2024    5731    artemusII    11    

23

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

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

18.10.2024    13137    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

11.10.2024    8218    XilDen    36    

90

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

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3191    PROSTO-1C    0    

23

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

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

16.08.2024    10799    user1840182    5    

29
Отзывы
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
ДанныеПроизводственногоКалендаря.Дата КАК ТребуемаяДата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь.Код = "РФ"
И ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
И ДанныеПроизводственногоКалендаря.Дата > &ТекущаяДата

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


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