Функция определения високосного года
Условие
Напишите функцию, которая определяет, является ли год високосным.
Правила определения високосного года:
- Год кратен 4 — високосный
- Год кратен 100 — не високосный
- Год кратен 400 — високосный
Пример
Вход: 2024 Выход: Истина
Вход: 1900 Выход: Ложь
Вход: 2000 Выход: Истина
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Обзор задачи
Определение високосного года — это стандартная задача в разработке, которая часто встречается при работе с датами. В 1С это особенно важно при работе с расписаниями, начислениями и другими временными расчётами. Правила високоса имеют иерархическую структуру, которая требует корректного порядка проверок.
Математическая основа
Григорианский календарь использует следующие правила:
- Базовое правило: год кратен 4 → високосный (366 дней)
- Исключение: год кратен 100 → не високосный
- Исключение из исключения: год кратен 400 → високосный
Порядок проверок критичен:
- Сначала проверяем 400 (самое специфичное правило)
- Затем проверяем 100
- Затем проверяем 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) так как он:
- Эффективен и понятен
- Охватывает все правила
- Не требует дополнительных операций
- Легко тестируется
Важные моменты
- Порядок логики — проверка 400 должна идти перед 100 и 4
- Оператор модуля — в 1С используется
%для получения остатка от деления - Типизация — входное значение должно быть числом
- Граничные случаи — правильно работать с годами, кратными 100 и 400