Как получить первый рабочий день?

1. PhoenixAOD 62 27.10.15 09:55 Сейчас в теме
Доброго времени суток Всем читающим! Уважаемые, возник такой вопрос, допиливаю ЗУП 3.0 для упр учета, и возникла такая ситуация, в компании используются аттестации, необходимо их назначать программно, но возникла такая ситуация, до прибавить то дни или месяцы не проблема, но дата аттестации может вытечь на выходной, и возник вопрос как можно получить первую рабочую дату после выходного или праздничного дня?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. oldfornit 27.10.15 09:59 Сейчас в теме
у нас используется следующий "костыль":

// 	Функция возвращает дату отстоящую на заданное количество рабочих дней от начальной в соответствии с  
//	регламентированным производственным календарем
// 
//	Параметры:
// 	ДатаНач      - начальная дата  
// 	ЧислоДней    - количество рабочих дней, на которое искомая дата должна отстоять от начальной
//
Функция ПолучитьРабочийДеньНедели(ДатаНач,ЧислоДней) Экспорт
			
	Запрос = Новый  Запрос;
	Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
	Запрос.УстановитьПараметр("ЧислоДней",           ЧислоДней);
	Запрос.УстановитьПараметр("РабочийДень",         Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
	Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
    
	Если ЧислоДней > 0 Тогда
		
        Запрос.Текст = "
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
        |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
        |ИЗ
        |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаНач
        |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
        |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
        |";
        
	Иначе
		
        ЧислоДней = -ЧислоДней;
        
        Запрос.Текст = "
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + "
        |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
        |ИЗ
        |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &ДатаНач
        |     И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
        |      ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень)
        |УПОРЯДОЧИТЬ ПО
        |    ДатаКалендаря УБЫВ
        |";
        
    КонецЕсли;
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Количество() > 0 Тогда
        Пока Выборка.Следующий() Цикл
            ТекДата = Выборка.ДатаКалендаря;
        КонецЦикла;
        Возврат ТекДата;
    КонецЕсли;
    
    Возврат Неопределено;
	         		
КонецФункции
Показать
Lapa009; avusachev; sillya7; odin-7610; dj_serega; +5 Ответить
3. dj_serega 391 27.10.15 10:02 Сейчас в теме
(2) oldfornit, так это ж вроде типовой костыль :)
4. PhoenixAOD 62 27.10.15 10:20 Сейчас в теме
(2) oldfornit, ну я примерно хочу сделать. но возникает вопрос, если дата переходит на следующий год, как тогда быть, производственный календарь то еще не заполнен.
5. dj_serega 391 27.10.15 10:31 Сейчас в теме
(4) PhoenixAOD, А что мешает заполнить? :)
6. PhoenixAOD 62 27.10.15 10:38 Сейчас в теме
(5) dj_serega, да ничего) просто ведь он заполняется обычно раз в год)))
7. PhoenixAOD 62 27.10.15 10:42 Сейчас в теме
Пока получилось вот так вот:
ВЫБРАТЬ
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
	ДанныеПроизводственногоКалендаря.Год,
	ВЫБОР
		КОГДА ДанныеПроизводственногоКалендаря.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
			ТОГДА 0
		ИНАЧЕ ДанныеПроизводственногоКалендаря.ВидДня
	КОНЕЦ КАК Поле1,
	ДанныеПроизводственногоКалендаря.ДатаПереноса,
	ДанныеПроизводственногоКалендаря.Дата
ПОМЕСТИТЬ Вт1
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
	И ДанныеПроизводственногоКалендаря.Дата >= &ДатаАтт
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
	Вт1.ПроизводственныйКалендарь,
	Вт1.Год,
	Вт1.Поле1,
	Вт1.ДатаПереноса,
	Вт1.Дата
ИЗ
	Вт1 КАК Вт1
ГДЕ
	Вт1.Поле1 <> 0
Показать


в итоге получаем необходимую дату.
9. dakork 33 01.02.17 15:21 Сейчас в теме
(7)
Немного доработал текст для бухгалтерии с учетом добавления упущенного вида дня: Предпраздничный

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	ВТ.Дата КАК Дата
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.ВидДня <> 0
Показать
10. PhoenixAOD 62 09.02.17 04:57 Сейчас в теме
(9)Но ведь предпраздничный день это рабочий день))
V.Stavinsky; +1 Ответить
11. dakork 33 10.03.17 13:21 Сейчас в теме
(10) В том то и дело. Мне нужно было получить и предпраздничные дни в том числе
8. odin-7610 09.01.17 13:03 Сейчас в теме
oldfornit спасибо, очень хорошая штука.
12. dakork 33 10.03.17 13:22 Сейчас в теме
В качестве дополнения, запрос для получения последнего рабочего дня предшествующего переданному в параметр:

ВЫБРАТЬ
	ВЫБОР
		КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
			ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
		ИНАЧЕ ВЫБОР
				КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
					ТОГДА ДанныеПроизводственногоКалендаря.ВидДня
				ИНАЧЕ 0
			КОНЕЦ
	КОНЕЦ КАК ВидДня,
	ДанныеПроизводственногоКалендаря.Дата КАК Дата
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
	И ДанныеПроизводственногоКалендаря.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&Дата, День, -15) И ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, -1)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	ВТ.Дата КАК Дата
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.ВидДня <> 0

УПОРЯДОЧИТЬ ПО
	ВТ.Дата УБЫВ
Показать
13. asae 15.03.21 14:03 Сейчас в теме
а почему так нельзя, как ниже ?

или это для 3.1 ;)

ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
14. dakork 33 26.04.21 12:27 Сейчас в теме
(13)
ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)


По вашему запросу:
Дата = 24.02.2021 Результат = 01.02.2021. - начало месяца
Дата = 15.03.2021 Результат = 01.03.2021. - начало месяца

По моему запросу:
Дата = 24.02.2021 Результат = 20.02.2021. - предыдущий рабочий день (суббота, предпраздничный)
Дата = 15.03.2021 Результат = 12.03.2021. - предыдущий рабочий день (пятница)
15. asae 05.05.21 16:11 Сейчас в теме
(14) сорян "чукча не читатель писатель" я плохо прочитал условие, нужен был именно первый рабочий день месяца, вот и ....

спасибо за решение помогло и в моем случаи.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот