1. PhoenixAOD 57 27.10.15 09:55 Сейчас в теме

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

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

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

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


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

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

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

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

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

УПОРЯДОЧИТЬ ПО
	ВТ.Дата УБЫВ
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Ведущий инженер - программист 1С
Москва
зарплата от 200 000 руб.
Полный день

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

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

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

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству