1. 1C / Говнокод #25603

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    &НаКлиенте
    Процедура Расчитать(Команда)
    	ТекДата = ТекущаяДата();
    	ТекМесяц = Месяц(ТекДата);
    	МесяцРождения = Месяц(ДатаРождения);
    
    	
    	Если ТекМесяц=МесяцРождения Тогда       //День рождения сегодня или в этом месяце,
    	    Если День(ТекДата)=День(ДатаРождения) Тогда
    		
    			КоличествоДнейДоДР = 0;
    		ИначеЕсли День(ТекДата)<День(ДатаРождения)  Тогда 
    			КоличествоДнейДоДР = День(ДатаРождения)-День(ТекДата);
    		Иначе
    			
    			
    		  КоличествоДнейДоДР = День(КонецМесяца(ТекДата))-День(ТекДата);
    		 Дата = ДобавитьМесяц(ТекДата,1);
    		 Ограничитель = (12-ТекМесяц)+МесяцРождения;
    		 Для сч=1 По Ограничитель Цикл
    			Если сч=Ограничитель Тогда			
    			    КоличествоДнейДоДР = КоличествоДнейДоДР+День(ДатаРождения);
    			    продолжить;			
    			КонецЕсли; 
    
    			КоличествоДнейДоДР = КоличествоДнейДоДР+День(КонецМесяца(Дата)) ;
    			 Дата = ДобавитьМесяц(Дата,1);
    		 	
    		 
    		 КонецЦикла; 
    		
    		КонецЕсли; 
    		
    	
    	ИначеЕсли ТекМесяц<МесяцРождения Тогда   //День рождения еще не наступил,
    		 КоличествоДнейДоДР = День(КонецМесяца(ТекДата))-День(ТекДата);
    		 Дата = ДобавитьМесяц(ТекДата,1);
    		 Для сч= ТекМесяц+1 По МесяцРождения Цикл
    			
                            Если сч=МесяцРождения Тогда
    			   КоличествоДнейДоДР = КоличествоДнейДоДР+День(ДатаРождения);
    			   продолжить;
    			КонецЕсли; 
    
    			КоличествоДнейДоДР = КоличествоДнейДоДР+День(КонецМесяца(Дата)) ;
    			 Дата = ДобавитьМесяц(Дата,1);
    		 	
    		 
    		 КонецЦикла; 
    		
    		
    	ИначеЕсли ТекМесяц>МесяцРождения Тогда     //День рождения уже прошел.	
    		     КоличествоДнейДоДР = День(КонецМесяца(ТекДата))-День(ТекДата);
    		 Дата = ДобавитьМесяц(ТекДата,1);
    		 Ограничитель = (12-ТекМесяц)+МесяцРождения;
    		 Для сч= 1 По Ограничитель Цикл
    
    			Если сч=Ограничитель Тогда
    			  КоличествоДнейДоДР = КоличествоДнейДоДР+День(ДатаРождения);
    			  продолжить;
    			КонецЕсли;
     
    			КоличествоДнейДоДР = КоличествоДнейДоДР+День(КонецМесяца(Дата)) ;
    			 Дата = ДобавитьМесяц(Дата,1);
    		 	
    		 
    		 КонецЦикла; 
    	
    	 КонецЕсли; 
    	 
    	 Сообщение = Новый СообщениеПользователю;
    	 Сообщение.Текст = КоличествоДнейДоДР;
    	 Сообщение.Сообщить(); 
    		
    	// Вставить содержимое обработчика.
    КонецПроцедуры

    Задача рассчитать количество дней до дня рождения, вопрос в том что не много ли я использовал условий Если?

    Запостил: rusin_av, 16 Мая 2019

    Комментарии (33) RSS

    • Ничтожества! Ваша работа с датами лишь забавляет меня!
      То ли дело "Python":
      from datetime import datetime as dt
      
      def days_to_birthday(dob):
          now = dt.now()
          now = dt(now.year, now.month, now.day)
          next_birthday = dt(now.year, dob.month, dob.day)
          if now > next_birthday:
              next_birthday = dt(now.year + 1, dob.month, dob.day)
          return (next_birthday - now).days
      Ответить
      • показать все, что скрытоvanished
        Ответить
      • Внезапно.

        СекундыДень = 86400; // 60*60*24

        ТекДата = КонецДня(ТекущаяДата());
        ДеньРождения = Дата(Год(ТекДата), Месяц(ДатаРождения), День(ДатаРождения));
        Если ДеньРождения < ТекДата Тогда
        ДеньРождения = Дата(Год(ТекДата)+1, МесяцДР, ДеньДР);
        КонецЕсли;
        ЧислоДней = Окр((ДеньРождения - ТекДата)/СекундыДень);
        Ответить
        • > 86400 // 60*60*24
          Оптимизация!
          Ответить
          • Кстати, когда-то питон не умел константные выражения считать, там в баткоде были бы все эти инструкции. Как с 1С не знаю.
            Ответить
      • А если на чистом Python?
        Ответить
        • А этот что, грязный? datetime это часть стандартной библиотеки.
          Ответить
        • Легко:
          _DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
          
          _DAYS_BEFORE_MONTH = [-1]  # -1 is a placeholder for indexing purposes.
          dbm = 0
          for dim in _DAYS_IN_MONTH[1:]:
              _DAYS_BEFORE_MONTH.append(dbm)
              dbm += dim
          del dbm, dim
          
          def _is_leap(year):
              "year -> 1 if leap year, else 0."
              return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
          
          def _days_before_year(year):
              "year -> number of days before January 1st of year."
              y = year - 1
              return y*365 + y//4 - y//100 + y//400
          
          def _days_in_month(year, month):
              "year, month -> number of days in that month in that year."
              assert 1 <= month <= 12, month
              if month == 2 and _is_leap(year):
                  return 29
              return _DAYS_IN_MONTH[month]
          
          def _days_before_month(year, month):
              "year, month -> number of days in year preceding first day of month."
              assert 1 <= month <= 12, 'month must be in 1..12'
              return _DAYS_BEFORE_MONTH[month] + (month > 2 and _is_leap(year))
          
          def _ymd2ord(year, month, day):
              "year, month, day -> ordinal, considering 01-Jan-0001 as day 1."
              assert 1 <= month <= 12, 'month must be in 1..12'
              dim = _days_in_month(year, month)
              assert 1 <= day <= dim, ('day must be in 1..%d' % dim)
              return (_days_before_year(year) +
                      _days_before_month(year, month) +
                      day)
          
          def days_to_birthday(dob, now):
              next_birthday.day = dob.day
              next_birthday.month = dob.month
              next_birthday.year = now.year
              tmp = _ymd2ord(next_birthday.year, next_birthday.month, next_birthday.day) - _ymd2ord(now.year, now.month, now.day)
              if tmp < 0:
                  tmp = _ymd2ord(next_birthday.year+1, next_birthday.month, next_birthday.day) - _ymd2ord(now.year, now.month, now.day)
              return tmp
          Ответить
    • Нахуй тут вообще цикл?
      Ответить
    • функция день может возвращать первые две цифры из даты, исходя из этого выбрал цикл. Еще приходила мысль привести даты у началу дня, вычесть одну из другой, получу количество секунд, секунды разделю на 3600, и потом на 24.
      Ответить
    • #Шизофрения
      Ответить
    • > &НаКлиенте
      Вот поэтому я за 1С. Вот бы в "PHP" можно было так же:
      <?php
      &OnClient
      function client_main()
      {
      	$_DOCUMENT->onLoad(function()
      	{
      		alert('Hello, PHP!');
      	});
      }
      
      &OnServer
      function server_main()
      {
      	echo '<script type="text/php" src="/index.php" />'
      }
      Ответить
      • Ещё так делается в модах для «Minecraft»: методы, специфичные для одной стороны (рендеринг, например), помечаются декоратором «@client» или «@server». Именно поэтому я за «Minecraft».
        Ответить
      • Спой.
        Ответить
        • Петух, спой, погода.
          Ответить
          • Кок! Хребет Белый Спой, городской округ Кизел, Пермский край, Приволжский федеральный округ, 6818381, РФ. 4 градуса тепла. Незначительная облачность.
            Ответить
    • МоскальСкрипт
      Процедура Расчитать(Команда)
      	ТащМайор = Ать2();
      Ответить
    • &НаКлиенте
      Процедура ДатаРожденияПриИзменении(Элемент)
      
      	_ТекущаяДата = ТекущаяДата();
      	
      	_ГодТекущий = Год(_ТекущаяДата);
      
      	_МесяцФР = Месяц(ДатаРождения);
      	_ДеньФР = День(ДатаРождения);
      	
      	Если _МесяцФР = 2 И _ДеньФР = 29 И (_ГодТекущий % 4 > 0 ИЛИ _ГодТекущий % 100 = 0) Тогда
      		//Дата вискосного ДР в обычном году переносится на предыдущий день
      		_ДеньФР = 28;
      		////или на следующий?
      		//_МесяцФР = 3;
      		//_ДеньФР = 1;
      	КонецЕсли;
      	
      	_ДатаРожденияВТекущемГоду = Дата(_ГодТекущий, _МесяцФР, _ДеньФР);
      	
      	// 86400 = (24 * 60 * 60);
      	Если _ТекущаяДата < _ДатаРожденияВТекущемГоду Тогда
      		Сообщить("До дня рождения осталось " + Формат((_ДатаРожденияВТекущемГоду - _ТекущаяДата) / 86400, "ЧРГ=; ЧН=0; ЧФ='Ч д.'"));
      	Иначе
      		Сообщить("Со дня рождения прошло " + Формат((_ТекущаяДата - _ДатаРожденияВТекущемГоду) / 86400, "ЧРГ=; ЧН=0; ЧФ='Ч д.'"));
      	КонецЕсли;
      	
      КонецПроцедуры
      Ответить
      • В строка
        _ТекущаяДата = ТекущаяДата();
        изначально имела место конструкция
        _ТекущаяДата = НачалоДня(ТекущаяДата());
        , что являлось правильным, и было удалено по ошибке.
        Ответить

    Добавить комментарий