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

21.06.18

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

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

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

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

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

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

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

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

 

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

См. также

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

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

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

10000 руб.

02.09.2020    129792    702    390    

752

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

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

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

15.05.2024    2999    implecs_team    4    

34

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

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

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

11.04.2024    2621    andrey_sag    10    

32

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

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

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

13.02.2024    6302    KawaNoNeko    23    

26

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

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

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

1 стартмани

31.01.2024    2291    2    Yashazz    0    

32

Запрос 1С copilot

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

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

15.01.2024    7120    40    mkalimulin    32    

53

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

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

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

14.12.2023    2015    vandalsvq    7    

29

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

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

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

1 стартмани

07.12.2023    3489    52    DrZombi    54    

21
Отзывы
3. CrazyHands 37 28.06.18 12:05 Сейчас в теме
(2) параметр "&ДатаККоторойНужноДобавитьДни" приведен как пример. Входящие даты могут быть разные и их может быть очень много.
jobkostya1c_ERP; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maxvcb 67 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 536 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 536 09.04.24 10:33 Сейчас в теме
(14) писал давно и для своих нужд выполнила свой код
17. ssn5810 80 14.04.24 10:37 Сейчас в теме
(15) Извиняюсь, все работает корректно.
16. ssn5810 80 09.04.24 15:16 Сейчас в теме
КАК Дата в первой и второй выборке...
Оставьте свое сообщение