Имя: Пароль:
1C
 
Учебный код: количество дней до/ после дня рождения
0 KeyAsk
 
30.09.23
18:07
По заданию нужно написать код, который выдаёт результат количества дней до/ после дня рождения, если до/ после дня рождения менее 5 дней.
Прошу помочь идеями как сделать это с минимальными ресурсами и объёмом кода.
Видел несколько реализаций, но все они содержат ошибки:
- не обрабатывается корректно день рождения 29.02
- не верные результаты в количестве дней, когда день рождения и контрольная ("текущая") дата приходятся рядом со точкой перемены года
Вот так решил задачу. Кому пригодится - на здоровье.
Будет интересно посмотреть а можно ли её решить более эффективно и менее громоздким кодом? (с учётом сохранения всех нюансов функционала)

&НаКлиенте
    Асинх Процедура ПолучениеДанныхАсинх()
                                              
            Имя = Ждать ВвестиСтрокуАсинх(Имя, "Как твоё имя?");
            ДатаРождения = Ждать ВвестиДатуАсинх(ДатаРождения, "Укажи дату рождения?", ЧастиДаты.Дата);
            
            КонтрольнаяДата = ТекущаяДата();
            //Строка для тестирования
            //КонтрольнаяДата = '2023.12.31 21:23:10';
            
            ДатаРождения = КонецДня(ДатаРождения);
            Сегодня = КонецДня(КонтрольнаяДата);
            
            ГодСегодня = Год(ТекущаяДата());
            ДеньРождения = День(ДатаРождения);
            МесяцРождения = Месяц (ДатаРождения);
            //Упрощённый режим отработки високосного года
            Если МесяцРождения=2 И ДеньРождения=29 Тогда
                ДеньРождения = 28;
            КонецЕсли;
            
            
            ДеньРожденияСейчас = КонецДня(Дата(ГодСегодня, МесяцРождения, ДеньРождения));
            ДеньРожденияПредыдущий = КонецДня(Дата(ГодСегодня-1, МесяцРождения, ДеньРождения));
            ДеньРожденияСледующий = КонецДня(Дата(ГодСегодня+1, МесяцРождения, ДеньРождения));
            
            Дистанция = Мин(Sqrt(Pow(ДеньРожденияСейчас-Сегодня,2)), Sqrt(Pow(ДеньРожденияПредыдущий-Сегодня,2)),
                            Sqrt(Pow(ДеньРожденияСледующий-Сегодня,2)));
            Если Дистанция=Sqrt(Pow(ДеньРожденияСейчас-Сегодня,2)) Тогда
                РасчётнаяДата = ДеньРожденияСейчас;
                ИначеЕсли Дистанция=Sqrt(Pow(ДеньРожденияПредыдущий-Сегодня,2)) Тогда
                    РасчётнаяДата = ДеньРожденияПредыдущий;
                ИначеЕсли Дистанция=Sqrt(Pow(ДеньРожденияСледующий-Сегодня,2)) Тогда
                    РасчётнаяДата = ДеньРожденияСледующий;
            КонецЕсли;
                
            Сообщить("№15. Как тебя зовут:");
            Сообщить("Сегодня: "+КонтрольнаяДата+". Твой ближайший день рождения: "+РасчётнаяДата);
            
            Если (РасчётнаяДата-Сегодня <= 86400*5) И (РасчётнаяДата-Сегодня > 0) Тогда
                Сообщить("Хорошо проверсти день рождения, "+Имя+"!");
                ИначеЕсли (РасчётнаяДата-Сегодня >= -86400*5) И (РасчётнаяДата-Сегодня < 0) Тогда    
                    Сообщить("Хорошо ли прошёл день рождения, "+Имя+"?");
                ИначеЕсли РасчётнаяДата-Сегодня = 0 Тогда
                    Сообщить("С днём рождения, "+Имя+"!");
                Иначе Сообщить("Рад видеть, "+Имя+"!");
            КонецЕсли;
1 vde69
 
30.09.23
18:30
дней = мод(дата(началодня(текущаядата()-началодня(деньрождения))));
сообщить (дней);


ну а дальше условия наворачивай на количество этих самых дней....
2 АНДР
 
01.10.23
07:48
(1) Люди так долго не живут. :) Дней надо поделить на количество секунд в сутках.
P.S. Знак нужен для определения до или после. На -1 домножать при выводе в "отрицательной" ветке.
P.P.S. Второе начало дня - не нужно, состав даты - день.
3 Волшебник
 
01.10.23
07:54
ошибка в слове "проверсти"