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

16.12.12

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

Был отчет, в котором к неким датам прибавлялось 15 дней функцией ДобавитьКДате(). Но вот понадобилось добавлять к дате не все дни, а только рабочие. Сделал запрос, может быть кому понадобится

 Собственно запрос получился такой: 

 ВЫБРАТЬ Даты.Дата,

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

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
	Даты.Дата

ИМЕЮЩИЕ
	МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря

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

Вот пример работы для одной даты 28.11.2012

       
Дата КоличествоРабочихДней ДатаКалендаря ДатаКалендаряДляГруппировки  
28.11.2012 1 28.11.2012 28.11.2012  
28.11.2012 2 29.11.2012 29.11.2012  
28.11.2012 3 30.11.2012 30.11.2012  
28.11.2012 4 03.12.2012 03.12.2012  
28.11.2012 5 04.12.2012 04.12.2012  
28.11.2012 6 05.12.2012 05.12.2012  
28.11.2012 7 06.12.2012 06.12.2012  
28.11.2012 8 07.12.2012 07.12.2012  
28.11.2012 9 10.12.2012 10.12.2012  
28.11.2012 10 11.12.2012 11.12.2012  
28.11.2012 11 12.12.2012 12.12.2012  
28.11.2012 12 13.12.2012 13.12.2012  
28.11.2012 13 14.12.2012 14.12.2012  
28.11.2012 14 17.12.2012 17.12.2012  
28.11.2012 15 18.12.2012 18.12.2012  
28.11.2012 16 19.12.2012 19.12.2012  
28.11.2012 17 20.12.2012 20.12.2012  
28.11.2012 18 21.12.2012 21.12.2012  
28.11.2012 19 24.12.2012 24.12.2012  
28.11.2012 20 25.12.2012 25.12.2012  
28.11.2012 21 26.12.2012 26.12.2012  
28.11.2012 22 27.12.2012 27.12.2012  

 

В конец запроса осталось добавить условие

И КОЛИЧЕСТВО(РАЗЛИЧНЫЕРегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней

и отобрать данные по нужному количеству рабочих дней в параметре "РабочихДней"

Ну и в конце полная верия запроса, если захочется опробовать в консоли запросов

ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;

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

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
	Даты.Дата

ИМЕЮЩИЕ
	МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
	И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней

 

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159451    874    399    

861

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

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

18.10.2024    9878    sergey279    18    

64

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

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

11.10.2024    5168    XilDen    36    

80

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

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

16.08.2024    7902    user1840182    5    

28

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

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

08.07.2024    2393    ivanov660    9    

22

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

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

15.05.2024    8684    implecs_team    6    

47

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

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

11.04.2024    3391    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. anig99 2852 17.12.12 11:05 Сейчас в теме
И в чём новизна? И здесь, и на других форумах тема широко обсуждалась... Данное решение - самое банальное.
2. INTECH1 381 17.12.12 11:10 Сейчас в теме
На новизну не претендовал, просто не нашел решение, когда понадобилось. Можно ссылку на обсуждение?
4. Zas1402 20.12.12 17:16 Сейчас в теме
На новизну не претендовал, просто не нашел решение, когда понадобилось.

Полезная тема.
5. Aesh 26.12.12 15:40 Сейчас в теме
В том-то и оно, что обсуждалось, типа "Кури ...". Тут парень конкретно написал. Я помню раньше еще писал, но потом какое-то время не работал с 1С, сейчас на свое взглянул (а там еще с планом счетов связано), аж паника продернула, вспоминал бы дня два! Спасибо, ооочень выручил, так бы все писали, а не "Кури..."
rett; Andreyyy; maxis33; +3 Ответить
6. Азбука Морзе 106 25.04.13 17:18 Сейчас в теме
Идея добавить к дате рабочие дни очень помогла при разработке отчетов, связанных с банковскими днями. Спасибо.
NazarovV; +1 Ответить
7. popro 20.06.13 16:59 Сейчас в теме
как правильно определить глубину дней чтобы не было слишком много или недостаточно?
8. INTECH1 381 20.06.13 17:08 Сейчас в теме
Ну здесь дело в праздниках, если взять, например, какое-нибудь 21.12.2012, то глубина 15 дней не достаточна из-за долгих январских праздников - вот только исходя из таких нюансов. Поэтому Глубина = 15 дней + Максимум количества праздников, вот как-то так
9. Yimaida 38 19.08.13 18:56 Сейчас в теме
Немного допилил запрос, чтобы можно было отнять дату. Автору +, единственное внятное рабочее решение, которое я нашел в инете по этой теме ("скопировал и работает").

ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;

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

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
	Даты.Дата

ИМЕЮЩИЕ
	ВЫБОР
		КОГДА &ОтнятьДни
			ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
		ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
	КОНЕЦ И
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней
Показать


или так

ВЫБРАТЬ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;

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

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
	Даты.Дата

ИМЕЮЩИЕ
	ВЫБОР
		КОГДА &РабочихДней < 0
			ТОГДА МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
		ИНАЧЕ МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
	КОНЕЦ И
	ВЫБОР
		КОГДА &РабочихДней < 0
			ТОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = -&РабочихДней
		ИНАЧЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = &РабочихДней
	КОНЕЦ
Показать
10. NAKIS 5 18.12.13 17:23 Сейчас в теме
новое решение или старое - но мне помогло. Автору спасибо огромное))))
11. ilonnaa 12.02.14 10:45 Сейчас в теме
Автору +, жаль для бух 3.0 не подходит)
12. INTECH1 381 12.02.14 11:58 Сейчас в теме
(11) ilonnaa, а что там не так, регистр календаря что-ли по-другому называется?
13. ilonnaa 12.02.14 21:17 Сейчас в теме
(12) Там регистр по другому называется, + производственный календарь это справочник) ну все получилось, чуть запрос переписав, выложить не могу сервер выключился что-то( завтра если не забуду.
14. qwertor 06.08.14 13:28 Сейчас в теме
оставлю для коллекции вариант для Бух.3
Функция  ОтсчитатьРабочиеДни(ДатаОтсчета,Отсрочка)
	
Запрос = Новый Запрос;
Запрос.Текст = "Select 
	|	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
	|	ДанныеПроизводственногоКалендаря.Дата,
	|	ДанныеПроизводственногоКалендаря.Год,
	|	ДанныеПроизводственногоКалендаря.ВидДня,
	|	ДанныеПроизводственногоКалендаря.ДатаПереноса
	|
	|into 
	| cal	
	|from 
	|	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
	|where 
	|   ДанныеПроизводственногоКалендаря.Дата between &ДатаОтсчета
	|  and DateAdd(&ДатаОтсчета, день, &Отсрочка*2 + 12)
	|;
	|	
	|Select  
	|min(дата) датаОтсрочки  
	|from(
	|Select 
	|
	|c1.дата дата,
	|
	|count(*) -1 РабочихДней
	|
	|from cal c1
	|left join   cal c2
	|on (c2.ВидДня = value(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) or c2.ВидДня = value(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
	|and c1.дата>=c2.дата
	|group by c1.дата
	|having count(*)= &Отсрочка+1
	|) tt
	|group by  РабочихДней";
попытка	
Запрос.УстановитьПараметр("ДатаОтсчета", ДатаОтсчета);
Запрос.УстановитьПараметр("Отсрочка", Отсрочка);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат[0].датаОтсрочки; 
исключение
конецпопытки;

конецФункции
Показать
user1878860; SnowflakeM; LomayaZakat; user696910_asupat; ankr; u_n_k_n_o_w_n; +6 Ответить
15. Obvious 06.08.14 13:46 Сейчас в теме
Идея ок. Но задачка редко стоит просто отсечь празники. Рекомендую брать с графиков работы. Так как бух вряд ли полезет править произв календарь (он заходит правит в графике. а произв календарь виржин) ИМХО
16. nik-boss 28.05.15 09:43 Сейчас в теме
Спасибо Вам большое! Очень помогло быстро сделать необходимый отчет!
17. Nikola1147 12.02.16 11:21 Сейчас в теме
ко второму соединению
полезно будет добавить условие типа (отмечено жирным)

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И (ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ДЕНЬ, &ГлубинаДней) > РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря)


иначе много доп сведений (дат) добавляется, которые не очень-то нужны,
разница в скорострельности ощутима на 3-х значениях В (&ВходящиеДаты)

Автору спасибо, очень помогло
u_n_k_n_o_w_n; +1 Ответить
18. AvalonE2008 101 10.01.17 12:10 Сейчас в теме
Решение действительно простое, но подойти с этой стороны не догадался.Спасибо
19. alexvbard 21 16.02.17 16:19 Сейчас в теме
Мне одному кажется что не совсем верно считается добавление количество рабочих дней?
Если по запросу установить входящую дату 22.02.2017 и попросить добавить к дате 2 рабочих дня то запрос выдает 27.02.2017.
Ну а должен наверно 28.02.2017
20. whoo 16.02.17 16:34 Сейчас в теме
(19) почему 28 то? 22 февраля 2017 (это среда) + два рабочих дня (четверг, пятница) = 22,23,24 февраля. 25 и 26 - выходные дни. Соответственно ближайший день 27 февраля выпадает. Откуда 28 должно быть?
21. alexvbard 21 18.02.17 14:07 Сейчас в теме
23,24,25,26 февраля - это выходные дни... Соответственно ближайшие два рабочих дня это 27 и 28 число. Тогда даже не 28 а 1 марта....
(20)
22. whoo 20.02.17 10:02 Сейчас в теме
23. INTECH1 381 20.02.17 12:33 Сейчас в теме
(21) в статье есть табличка как пример работы, в ней видно, что сама входящая дата (если это рабочий день) тоже входит в количество добавляемых рабочих дней.
24. alexvbard 21 20.02.17 20:27 Сейчас в теме
(23)
Понятно. В общем нужно поиграться чтобы получить нужный результат.
25. script 128 15.05.17 12:35 Сейчас в теме
В общем работает что-то нет так

08.02.2015 + 7 дней получаю 13.02.2015 хотя явно должно быть 16.02.2015 (это если учитывать начальную дату 08.02.2015)
но эта дата является выходным днем, поэтому учитывать ее нельзя, а в этом случае результатом должен быть 17.02.2015
но ни как не 13.02.2015.
Короче не работает.
26. sml 41 09.06.17 10:08 Сейчас в теме
а так будет оптимальнее (работает в 10 раз быстрее)
ВЫБРАТЬ
	ПК.Дата КАК Дата,
	ПК.ВидДня КАК ВидДня
ПОМЕСТИТЬ Рабочие
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ПК
ГДЕ
	ПК.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&тДата, МЕСЯЦ, -2) И ДОБАВИТЬКДАТЕ(&тДата, ДЕНЬ, 15)
	И ПК.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
;
ВЫБРАТЬ
	Даты.Дата,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.Дата)-1 КАК КоличествоРабочихДней,
	МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.Дата) КАК ДатаКалендаря,
	РегламентированныйПроизводственныйКалендарь1.Дата КАК ДатаКалендаряДляГруппировки
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Рабочие КАК Даты
		ПО (РегламентированныйПроизводственныйКалендарь.Дата Между Даты.Дата И ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, 20))
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь1
		ПО РегламентированныйПроизводственныйКалендарь.Дата <= РегламентированныйПроизводственныйКалендарь1.Дата
			И ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ, 20) > РегламентированныйПроизводственныйКалендарь1.Дата
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.апкОбщиеНастройки КАК ЧасыОплатыЗаявки
		ПО (ЧасыОплатыЗаявки.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.апкОбщиеНастройки.ЧасовОтСозданияЗаявкиДСДоВыполненияЗаказаРассылка))
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))

СГРУППИРОВАТЬ ПО
	РегламентированныйПроизводственныйКалендарь1.Дата,
	Даты.Дата,
	ЧасыОплатыЗаявки.Значение

ИМЕЮЩИЕ
	МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.Дата) = РегламентированныйПроизводственныйКалендарь1.Дата
	И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.Дата)-1 = ВЫРАЗИТЬ(ВЫРАЗИТЬ(ЧасыОплатыЗаявки.Значение КАК ЧИСЛО(10, 0))/24 КАК ЧИСЛО(10, 0))
Показать


добавил условие на соединение РегламентированныйПроизводственныйКалендарь1
27. CrazyHands 37 20.06.18 13:02 Сейчас в теме
Вот простое и рабочее решение:

ВЫБРАТЬ
	&ДатаККоторойНужноДобавитьДни КАК Дата,
	&КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;

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

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

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

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

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

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


А в параметр "&ДатаДляКалендаря" - что, за дату нужно поместить?
29. Prad2002 8 21.09.18 18:34 Сейчас в теме
(27) Не работает, если ДатаККоторойНужноДобавитьДни - выходной или праздничный лень
30. CrazyHands 37 24.09.18 07:01 Сейчас в теме
(29) Верно. Допилить не сложно для выходных и праздников.
38. marat.coolls 21.04.22 17:04 Сейчас в теме
31. digital_element 30.10.18 14:48 Сейчас в теме
Спасибо. Очень полезная статья!
32. 1Cynep4eJIoBek 26.09.19 12:40 Сейчас в теме
всё отлично работает пока не переносишь в СКД консоль, там валится с ошибкой

{ВнешняяОбработка.ирОбщий.МодульОбъекта(22178)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных "НаборДанных1"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(53, 72)}: Поле не входит в группу "РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря"
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = <<?>>РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря И
Показать


поправил вот так МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = МАКСИМУМ(РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря) И

т.к. ДатаКалендаря совпадает с ДатаКалендаряДляГруппировки в последующем СКД использую ДатаКалендаряДляГруппировки

а вообще автор красавчик сэкономил мне кучу времени и нервов
33. forbuk 23.01.20 22:47 Сейчас в теме
34. rett 10.12.20 10:39 Сейчас в теме
Красиво, спасибо. Съэкономил кучу времени, бро.
35. zhkonst 15.12.20 08:35 Сейчас в теме
Недавно тоже решал такую задачу - добавить к текущей дате количество рабочих дней. Не совсем запросом, но вдруг кому пригодится, вариант простой. Выбрал из производственного календаря только рабочие дни, отсортировал их по возрастанию и выгрузил в таблицу. Номер строки таблицы - и есть количество рабочих дней от текущей даты до даты в этой строке:
&НаСервереБезКонтекста
Функция ПолучитьДатуЧерезКоличествоРабочихДней(КоличествоДней)

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

	Возврат(ТаблицаКалендарь[КоличествоДней].Дата);

КонецФункции

Показать
user1878860; +1 Ответить
36. user1010280 28.04.21 04:09 Сейчас в теме
37. ivanovkpd 19.05.21 16:08 Сейчас в теме
ВЫБРАТЬ ПЕРВЫЕ 10
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь КАК ПроизводственныйКалендарь,
	ДанныеПроизводственногоКалендаря.Дата КАК Дата,
	ДанныеПроизводственногоКалендаря.Год КАК Год,
	ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня,
	ДанныеПроизводственногоКалендаря.ДатаПереноса КАК ДатаПереноса
ПОМЕСТИТЬ вт_дни
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПроизводственныеКалендари КАК ПроизводственныеКалендари
		ПО (ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = ПроизводственныеКалендари.Ссылка)
ГДЕ
	ДанныеПроизводственногоКалендаря.Дата > &Дата
	И ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.предпраздничный))
	И ПроизводственныеКалендари.Наименование = "Российская Федерация"

УПОРЯДОЧИТЬ ПО
	Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
	МАКСИМУМ(вт_дни.Дата) КАК Дата
ИЗ
	вт_дни КАК вт_дни
Показать


Самую первую "10" в запросе заменяем на кол-во прибавляемых дней
user1878860; +1 Ответить
Оставьте свое сообщение