|   |   | 
| 
 | Перенос даты с выходного на рабочую | ☑ | ||
|---|---|---|---|---|
| 0
    
        anikev 21.05.19✎ 15:46 | 
        Здравствуйте! Написал небольшой кусок кода, сразу оговорюсь что готов к критике, так как не совсем опытен в программировании. Этот код должен возвращать первый рабочий день, при условии если выпадает на праздничный/выходной. Проблема в том, что функция отрабатывает, все условия, находит рабочую дату, но после строки "возврат Дата " пехеходит в конец функции и опять возвращается на ВычислитьРабочийДень(Дата + (24*60*60)) и делает все в обратном порядке. Подскажите пожалуйста, как будет правильно? 
 Функция ВычислитьРабочийДень(Дата) Экспорт Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, | РегламентированныйПроизводственныйКалендарь.Год, | РегламентированныйПроизводственныйКалендарь.Пятидневка, | РегламентированныйПроизводственныйКалендарь.Шестидневка, | РегламентированныйПроизводственныйКалендарь.КалендарныеДни, | РегламентированныйПроизводственныйКалендарь.ВидДня | ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь | ГДЕ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = &ДатаКалендаря"; Запрос.УстановитьПараметр("ДатаКалендаря", Дата); //Дата РезультатЗапроса = Запрос.Выполнить().Выгрузить(); ВидДня = РезультатЗапроса[0].ВидДня ; //Для Каждого эл Из РезультатЗапроса Цикл // ВидДня = Эл.ВидДня // КонецЦикла; Если ВидДня <> Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда Сообщить("Дата " + Дата + " Выпадает на выходной/праздничный день! Ищем следующий рабочий"); ВычислитьРабочийДень(Дата + (24*60*60)) Иначе Возврат Дата; КонецЕсли;; Возврат Дата; КонецФункции; | |||
| 1
    
        kda26 21.05.19✎ 15:48 | 
        рекурсия?     | |||
| 2
    
        anikev 21.05.19✎ 15:49 | 
        (1) Совершенно верно     | |||
| 3
    
        sqr4 21.05.19✎ 15:49 | 
        в топку, делай все в запросе     | |||
| 4
    
        bootini 21.05.19✎ 15:50 | 
        Чтобы понять рекурсию, сперва нужно понять рекурсию. ))     | |||
| 5
    
        sqr4 21.05.19✎ 15:50 | 
        выбираешь все даты, которые больше или равны твоей с видом рабочий и затем группировка по минимуму     | |||
| 6
    
        anikev 21.05.19✎ 15:50 | 
        Я ее понимаю, и она отрабатывает ну почти как надо)     | |||
| 7
    
        bootini 21.05.19✎ 15:53 | 
        В запросе условие ДатаКалендаря <= &Дата и МАКСИМУМ по полю ДатаКалендаря и ну и ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий     | |||
| 8
    
        anikev 21.05.19✎ 15:54 | 
        Получилось вот так
 ВЫБРАТЬ Минимум (РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаКалендаря | |||
| 9
    
        Temai 21.05.19✎ 15:55 | 
        Может эта функция натолкнёт на мысль:
 Функция ЭтоРабочийДень(ПроверяемаяДата = Неопределено) Экспорт Если ПроверяемаяДата = Неопределено или ПроверяемаяДата = Дата(1,1,1) Тогда ПроверяемаяДата = ТекущаяДата(); КонецЕсли; НаборЗаписей = РегистрыСведений.РегламентированныйПроизводственныйКалендарь.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ДатаКалендаря.Установить(ПроверяемаяДата); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() > 0 Тогда ВидДня = НаборЗаписей[0].ВидДня; Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий или ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; Иначе Возврат Истина; КонецЕсли; КонецФункции | |||
| 10
    
        bootini 21.05.19✎ 15:56 | 
        (8) ну да я наоборот написал, найти ближайший прошедший рабочий день, а у тебя надо было последующий     | |||
| 11
    
        trooba 21.05.19✎ 15:58 | 
        ВЫБРАТЬ
 РегламентированныйПроизводственныйКалендарь.Дата КАК Дата ПОМЕСТИТЬ Вт_Дат ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.Дата >= &Дата И РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МИНИМУМ(Вт_Дат.Дата) КАК Дата ИЗ Вт_Дат КАК Вт_Дат | |||
| 12
    
        anikev 21.05.19✎ 16:07 | 
        (9) Изящно, но функция берет только текущую дату, сюда рекурсию так же я могу дописать?     | |||
| 13
    
        Йохохо 21.05.19✎ 16:09 | 
        (12) лучше утащи к себе рекурсивно предпраздичный     | |||
| 14
    
        anikev 21.05.19✎ 16:11 | 
        (13) немного перестал понимать)     | |||
| 15
    
        Temai 21.05.19✎ 16:13 | 
        (12) Конечно, вызывай её из другой процедуры     | |||
| 16
    
        Йохохо 21.05.19✎ 16:15 | 
        (14) ну Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный равно Рабочий, но не рекурсивно и не наоборот     | |||
| 17
    
        Йохохо 21.05.19✎ 16:18 | 
        во
 Запрос = Новый Запрос; Запрос.Текст = Запрос = Новый Запрос; | |||
| 18
    
        anikev 21.05.19✎ 16:23 | 
        (17) высший пилотаж какой-то     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |