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

21.06.18

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

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

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

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

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

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

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

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

 

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

См. также

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

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

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

10000 руб.

02.09.2020    127046    689    389    

738

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

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

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

11.04.2024    2402    andrey_sag    10    

29

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

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

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

13.02.2024    6099    KawaNoNeko    23    

26

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

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

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

1 стартмани

31.01.2024    2184    2    Yashazz    0    

31

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6777    32    mkalimulin    30    

53

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

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

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

14.12.2023    1936    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5685    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16716    skovpin_sa    14    

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


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