Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

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

Перенос даты с выходного на рабочую
Я
   anikev
 
21.05.19 - 15:46
Здравствуйте! Написал небольшой кусок кода, сразу оговорюсь что готов к критике, так как не совсем опытен в программировании. Этот код должен возвращать первый рабочий день, при условии если выпадает на праздничный/выходной. Проблема в том, что функция отрабатывает, все условия, находит рабочую дату, но после строки "возврат Дата " пехеходит в конец функции и опять возвращается на ВычислитьРабочийДень(Дата + (24*60*60)) и делает все в обратном порядке. Подскажите пожалуйста, как будет правильно?

Функция ВычислитьРабочийДень(Дата) Экспорт
    
    Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|         РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
|         РегламентированныйПроизводственныйКалендарь.Год,
|         РегламентированныйПроизводственныйКалендарь.Пятидневка,
|         РегламентированныйПроизводственныйКалендарь.Шестидневка,
|         РегламентированныйПроизводственныйКалендарь.КалендарныеДни,
|         РегламентированныйПроизводственныйКалендарь.ВидДня
|     ИЗ
|         РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|     ГДЕ
|         РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = &ДатаКалендаря";
Запрос.УстановитьПараметр("ДатаКалендаря",    Дата);     //Дата
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
ВидДня = РезультатЗапроса[0].ВидДня ;
//Для Каждого эл Из РезультатЗапроса Цикл
//      ВидДня = Эл.ВидДня
//  КонецЦикла;
Если  ВидДня <> Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда
    Сообщить("Дата " + Дата + " Выпадает на выходной/праздничный день! Ищем следующий рабочий");
    ВычислитьРабочийДень(Дата + (24*60*60))
  Иначе
      Возврат Дата;
      КонецЕсли;;
Возврат Дата;        
КонецФункции;
 
 
   kda26
 
1 - 21.05.19 - 15:48
рекурсия?
   anikev
 
2 - 21.05.19 - 15:49
(1) Совершенно верно
   sqr4
 
3 - 21.05.19 - 15:49
в топку, делай все в запросе
   bootini
 
4 - 21.05.19 - 15:50
Чтобы понять рекурсию, сперва нужно понять рекурсию. ))
   sqr4
 
5 - 21.05.19 - 15:50
выбираешь все даты, которые больше или равны твоей с видом рабочий и затем группировка по минимуму
   anikev
 
6 - 21.05.19 - 15:50
Я ее понимаю, и она отрабатывает ну почти как надо)
   bootini
 
7 - 21.05.19 - 15:53
В запросе условие ДатаКалендаря <= &Дата и МАКСИМУМ по полю ДатаКалендаря и ну и ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий
   anikev
 
8 - 21.05.19 - 15:54
Получилось вот так

ВЫБРАТЬ
    Минимум (РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
        И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаКалендаря
   Temai
 
9 - 21.05.19 - 15:55
Может эта функция натолкнёт на мысль:

Функция ЭтоРабочийДень(ПроверяемаяДата = Неопределено) Экспорт
    Если ПроверяемаяДата = Неопределено или ПроверяемаяДата = Дата(1,1,1) Тогда
        ПроверяемаяДата = ТекущаяДата();
    КонецЕсли;
    НаборЗаписей = РегистрыСведений.РегламентированныйПроизводственныйКалендарь.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ДатаКалендаря.Установить(ПроверяемаяДата);
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() > 0 Тогда
        ВидДня = НаборЗаписей[0].ВидДня;
        Если ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий или ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    Иначе
        Возврат Истина;
    КонецЕсли;
    
КонецФункции
   bootini
 
10 - 21.05.19 - 15:56
(8) ну да я наоборот написал, найти ближайший прошедший рабочий день, а у тебя надо было последующий
   trooba
 
11 - 21.05.19 - 15:58
ВЫБРАТЬ
    
    РегламентированныйПроизводственныйКалендарь.Дата КАК Дата
    
ПОМЕСТИТЬ Вт_Дат
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.Дата >= &Дата
    И РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    МИНИМУМ(Вт_Дат.Дата) КАК Дата
ИЗ
    Вт_Дат КАК Вт_Дат
   anikev
 
12 - 21.05.19 - 16:07
(9) Изящно, но функция берет только текущую дату, сюда рекурсию так же я могу дописать?
   Йохохо
 
13 - 21.05.19 - 16:09
(12) лучше утащи к себе рекурсивно предпраздичный
   anikev
 
14 - 21.05.19 - 16:11
(13) немного перестал понимать)
   Temai
 
15 - 21.05.19 - 16:13
(12) Конечно, вызывай её из другой процедуры
   Йохохо
 
16 - 21.05.19 - 16:15
(14) ну Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный равно Рабочий, но не рекурсивно и не наоборот
   Йохохо
 
17 - 21.05.19 - 16:18
во
Запрос = Новый Запрос;
Запрос.Текст = Запрос = Новый Запрос;
   anikev
 
18 - 21.05.19 - 16:23
(17) высший пилотаж какой-то

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.