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

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

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

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


в итоге получаем необходимую дату.
8. Антон (odin-7610) 09.01.17 13:03 Сейчас в теме
oldfornit спасибо, очень хорошая штука.
9. Da Kork (dakork) 8 01.02.17 15:21 Сейчас в теме
(7)
Немного доработал текст для бухгалтерии с учетом добавления упущенного вида дня: Предпраздничный

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

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

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

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

УПОРЯДОЧИТЬ ПО
	ВТ.Дата УБЫВ
...Показать Скрыть
Оставьте свое сообщение