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