Бухгалтерия / Говнокод #25603 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 rusin_av, (Updated )

Комментарии (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
    Ответить
    • Тебе хорошо рассуждать, ты Rooster.
      Ответить
    • Внезапно.

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

      ТекДата = КонецДня(ТекущаяДата());
      ДеньРождения = Дата(Год(ТекДата), Месяц(ДатаРождения), День(ДатаРождения));
      Если ДеньРождения < ТекДата Тогда
      ДеньРождения = Дата(Год(ТекДата)+1, МесяцДР, ДеньДР);
      КонецЕсли;
      ЧислоДней = Окр((ДеньРождения - ТекДата)/СекундыДень);
      Ответить
        • Кстати, когда-то питон не умел константные выражения считать, там в баткоде были бы все эти инструкции. Как с 1С не знаю.
          Ответить
      • А этот что, грязный? 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 И _ДеньФР = 29 И (_ГодТекущий % 4 > 0 ИЛИ _ГодТекущий % 100 = 0) Тогда
    		//Дата вискосного ДР в обычном году переносится на предыдущий день
    		_ДеньФР = 28;
    		////или на следующий?
    		//_МесяцФР = 3;
    		//_ДеньФР = 1;
    	КонецЕсли;
    	
    	_ДатаРожденияВТекущемГоду = Дата(_ГодТекущий, _МесяцФР, _ДеньФР);
    	
    	// 86400 = (24 * 60 * 60);
    	Если _ТекущаяДата < _ДатаРожденияВТекущемГоду Тогда
    		Сообщить("До дня рождения осталось " + Формат((_ДатаРожденияВТекущемГоду - _ТекущаяДата) / 86400, "ЧРГ=; ЧН=0; ЧФ='Ч д.'"));
    	Иначе
    		Сообщить("Со дня рождения прошло " + Формат((_ТекущаяДата - _ДатаРожденияВТекущемГоду) / 86400, "ЧРГ=; ЧН=0; ЧФ='Ч д.'"));
    	КонецЕсли;
    	
    КонецПроцедуры
    Ответить
    • В строка
      _ТекущаяДата = ТекущаяДата();
      изначально имела место конструкция
      _ТекущаяДата = НачалоДня(ТекущаяДата());
      , что являлось правильным, и было удалено по ошибке.
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8