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

1. 61 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 384 27.10.15 10:02 Сейчас в теме
(2) oldfornit, так это ж вроде типовой костыль :)
4. PhoenixAOD 61 27.10.15 10:20 Сейчас в теме
(2) oldfornit, ну я примерно хочу сделать. но возникает вопрос, если дата переходит на следующий год, как тогда быть, производственный календарь то еще не заполнен.
5. dj_serega 384 27.10.15 10:31 Сейчас в теме
(4) PhoenixAOD, А что мешает заполнить? :)
6. PhoenixAOD 61 27.10.15 10:38 Сейчас в теме
(5) dj_serega, да ничего) просто ведь он заполняется обычно раз в год)))
7. PhoenixAOD 61 27.10.15 10:42 Сейчас в теме
Пока получилось вот так вот:
ВЫБРАТЬ
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
	ДанныеПроизводственногоКалендаря.Год,
	ВЫБОР
		КОГДА ДанныеПроизводственногоКалендаря.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
			ТОГДА 0
		ИНАЧЕ ДанныеПроизводственногоКалендаря.ВидДня
	КОНЕЦ КАК Поле1,
	ДанныеПроизводственногоКалендаря.ДатаПереноса,
	ДанныеПроизводственногоКалендаря.Дата
ПОМЕСТИТЬ Вт1
ИЗ
	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
	ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь
	И ДанныеПроизводственногоКалендаря.Дата >= &ДатаАтт
;

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


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

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

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

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

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

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

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

ВЫБРАТЬ
МИНИМУМ(ДанныеПроизводственногоКалендаря.Дата) КАК Дата
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
ДанныеПроизводственногоКалендаря.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
14. dakork 25 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) сорян "чукча не читатель писатель" я плохо прочитал условие, нужен был именно первый рабочий день месяца, вот и ....

спасибо за решение помогло и в моем случаи.
Оставьте свое сообщение
Вакансии
Консультант-аналитик 1С
Нижний Новгород
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Нижний Новгород
зарплата от 100 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата до 150 000 руб.
Полный день

Разработчик 1С
Санкт-Петербург
зарплата от 130 000 руб. до 170 000 руб.
Временный (на проект)

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству