← Назад к вопросам

Функция определения високосного года

1.3 Junior🔥 131 комментариев
#Стандарты разработки

Условие

Напишите функцию, которая определяет, является ли год високосным.

Правила определения високосного года:

  • Год кратен 4 — високосный
  • Год кратен 100 — не високосный
  • Год кратен 400 — високосный

Пример

Вход: 2024 Выход: Истина

Вход: 1900 Выход: Ложь

Вход: 2000 Выход: Истина

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Обзор задачи

Определение високосного года — это стандартная задача в разработке, которая часто встречается при работе с датами. В 1С это особенно важно при работе с расписаниями, начислениями и другими временными расчётами. Правила високоса имеют иерархическую структуру, которая требует корректного порядка проверок.

Математическая основа

Григорианский календарь использует следующие правила:

  • Базовое правило: год кратен 4 → високосный (366 дней)
  • Исключение: год кратен 100 → не високосный
  • Исключение из исключения: год кратен 400 → високосный

Порядок проверок критичен:

  1. Сначала проверяем 400 (самое специфичное правило)
  2. Затем проверяем 100
  3. Затем проверяем 4

Реализация 1: Простой вариант

Функция ЭтоВысокосныйГод(Год)
    Если Год % 400 = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    Если Год % 100 = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Если Год % 4 = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
КонецФункции

Реализация 2: Компактный вариант

Функция ЭтоВысокосныйГодКомпактный(Год)
    Возврат (Год % 400 = 0) ИЛИ ((Год % 4 = 0) И (Год % 100 <> 0));
КонецФункции

Этот вариант использует логику:

  • Либо год кратен 400 (первое условие)
  • Либо год кратен 4 И не кратен 100 (второе условие)

Реализация 3: С обработкой ошибок

Функция ЭтоВысокосныйГодСПроверками(Год)
    // Проверяем корректность входных данных
    Если ТипЗнч(Год) <> Тип("Число") Тогда
        ВызватьОшибку("Год должен быть числом");
    КонецЕсли;
    
    ЧислоГода = Число(Год);
    
    // Проверяем разумный диапазон (опционально)
    Если ЧислоГода < 1 ИЛИ ЧислоГода > 9999 Тогда
        ВызватьОшибку("Год должен быть в диапазоне от 1 до 9999");
    КонецЕсли;
    
    // Основная логика
    Если ЧислоГода % 400 = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    Если ЧислоГода % 100 = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Если ЧислоГода % 4 = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
КонецФункции

Реализация 4: С использованием функции из платформы 1С

Функция ЭтоВысокосныйГодЧерезДату(Год)
    // Создаём дату на последний день февраля
    Дата29Февраля = Дата(Год, 2, 29);
    
    // Если 29 февраля существует в этом году, то год високосный
    Если День(Дата29Февраля) = 29 Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
КонецФункции

Этот вариант элегантен, но менее эффективен, так как требует операции с датой.

Примеры тестирования

// Правильное использование
Сообщить(ЭтоВысокосныйГодКомпактный(2024)); // Истина (кратен 4, не кратен 100)
Сообщить(ЭтоВысокосныйГодКомпактный(1900)); // Ложь (кратен 100, не кратен 400)
Сообщить(ЭтоВысокосныйГодКомпактный(2000)); // Истина (кратен 400)
Сообщить(ЭтоВысокосныйГодКомпактный(2023)); // Ложь (не кратен 4)
Сообщить(ЭтоВысокосныйГодКомпактный(2028)); // Истина (кратен 4, не кратен 100)
Сообщить(ЭтоВысокосныйГодКомпактный(2100)); // Ложь (кратен 100, не кратен 400)
Сообщить(ЭтоВысокосныйГодКомпактный(2400)); // Истина (кратен 400)

Рекомендация

Для production-кода рекомендую использовать компактный вариант (реализация 2) так как он:

  • Эффективен и понятен
  • Охватывает все правила
  • Не требует дополнительных операций
  • Легко тестируется

Важные моменты

  1. Порядок логики — проверка 400 должна идти перед 100 и 4
  2. Оператор модуля — в 1С используется % для получения остатка от деления
  3. Типизация — входное значение должно быть числом
  4. Граничные случаи — правильно работать с годами, кратными 100 и 400