Перенос даты с выходного на рабочую

1. anikev 21.05.19 15:10 Сейчас в теме
Здравствуйте! Написал небольшой кусок кода, сразу оговорюсь что готов к критике, так как не совсем опытен в программировании. Этот код должен возвращать первый рабочий день, при условии если выпадает на праздничный/выходной. Проблема в том, что функция отрабатывает, все условия, находит рабочую дату, но после строки "возврат Дата " пехеходит в конец функции и опять возвращается на ВычислитьРабочийДень(Дата + (24*60*60)) и делает все в обратном порядке. Подскажите пожалуйста, как будет правильно?
Функция ВычислитьРабочийДень(Дата) Экспорт
	
	Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	 	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
|	 	РегламентированныйПроизводственныйКалендарь.Год,
|	 	РегламентированныйПроизводственныйКалендарь.Пятидневка,
|	 	РегламентированныйПроизводственныйКалендарь.Шестидневка,
|	 	РегламентированныйПроизводственныйКалендарь.КалендарныеДни,
|	 	РегламентированныйПроизводственныйКалендарь.ВидДня
|	 ИЗ
|	 	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|	 ГДЕ
|	 	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = &ДатаКалендаря";
Запрос.УстановитьПараметр("ДатаКалендаря",	Дата);	 //Дата
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
ВидДня = РезультатЗапроса[0].ВидДня ;
//Для Каждого эл Из РезультатЗапроса Цикл
//	  ВидДня = Эл.ВидДня
//  КонецЦикла;
Если  ВидДня <> Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда
	Сообщить("Дата " + Дата + " Выпадает на выходной/праздничный день! Ищем следующий рабочий");
	ВычислитьРабочийДень(Дата + (24*60*60))
  Иначе 
	  Возврат Дата;
	  КонецЕсли;;
Возврат Дата;		
КонецФункции;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user-z99999 67 21.05.19 15:17 Сейчас в теме
Примерный код
ВЫБРАТЬ
	МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
	И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &ДатаКалендаря 

Показать
3. anikev 21.05.19 15:24 Сейчас в теме
(2) я сейчас в консоли запроса попробовал, он выбирает множество значений, но мне нужно первое рабочее
И просто интересно почему из рекурсии не выходит
4. nvilku 21.05.19 16:13 Сейчас в теме
ВЫБРАТЬ
МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ДатаКалендаря
А нужны только рабочие дни или предпраздничные тоже?
Скиньте функцию из которой первоначально вызывается Функция ВычислитьРабочийДень(Дата)
5. anikev 21.05.19 16:35 Сейчас в теме
(4)
торой первоначально вызывается Функци

Да, предпраздничные тоже нужны, я просто не знал, что они тоже относятся к рабочим
вот код вызова
Процедура РассчитатьПланДатуПоставки() Экспорт 
	
	Если Не ЗначениеЗаполнено(ДатаВРаботе) Тогда 
		Возврат;
	КонецЕсли;
	
	МинСрокДоставки = Товары[0].СрокДоставки;
	Для Каждого Строка Из Товары Цикл 
		МинСрокДоставки = Мин(МинСрокДоставки, Строка.СрокДоставки);
	КонецЦикла;
	ПредварительнаяДата = ДатаВРаботе + ?(ЗначениеЗаполнено(МинСрокДоставки), МинСрокДоставки, 3)*24*60*60; 
	ПлановаяДатаОтгрузки = ВычислитьРабочийДень(ПредварительнаяДата);  //Это вызов самописанной функции
 
КонецПроцедуры
Показать
6. nvilku 22.05.19 10:06 Сейчас в теме
Функция ВычислитьРабочийДень(Дата)

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
| РегламентированныйПроизводственныйКалендарь.Год,
| РегламентированныйПроизводственныйКалендарь.Пятидневка,
| РегламентированныйПроизводственныйКалендарь.Шестидневка,
| РегламентированныйПроизводственныйКалендарь.КалендарныеДни,
| РегламентированныйПроизводственныйКалендарь.ВидДня
| ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
| ГДЕ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = &ДатаКалендаря";
Запрос.УстановитьПараметр("ДатаКалендаря", Дата); //Дата
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
ВидДня = РезультатЗапроса[0].ВидДня ;
//Для Каждого эл Из РезультатЗапроса Цикл
// ВидДня = Эл.ВидДня
// КонецЦикла;
Если ВидДня <> Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда
Сообщить("Дата " + Дата + " Выпадает на выходной/праздничный день! Ищем следующий рабочий");
Дата = Дата + (24*60*60);
ВычислитьРабочийДень(Дата)
Иначе
Возврат Дата;
КонецЕсли;;
Возврат Дата;
КонецФункции;
7. nvilku 22.05.19 10:07 Сейчас в теме
Попробуйте так, только еще добавьте условие на проверку на предпраздничный день
Оставьте свое сообщение

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