Как определить високосный год в 1с
День добрый. Я новичек в 1С, поэтому прошу о помощи. Имеется задача, половина которой уже реализована. На данный момент таблица внутри формы заполняется написанными мною значениями, но требуется совершить следующие усовершенствования:
"Теперь система должна заполнять данные о длительности месяцев произвольного года. Для этого определите переменную "Год", изначально присвойте ей значение 2012. Проверьте, что алгоритмы будут работать и при других значениях переменной "Год"".
Большое спасибо заранее, надеюсь кто нибудь подскажет путь. Код уже имеющейся части задания прикладываю:
Определение количества дней недели в году
Всем категорический привет и наилучшие пожелания в наступающем 2018. Имею вопрос: как.
Составьте программу для определения количества дней в году, введённом с клавиатуры
Составьте программу для определения количества дней в году, введённом с клавиатуры.
Программа для подсчета количества полных дней
Напишите программу для подсчета количества полных дней, прошедших с начала года, если сейчас год Y.
Исходный код шифрования текста универсальным алгоритмом
Private Sub zasS_S_Rand(ByRef textIsxod As String, ByRef textRez As String, ByRef ChifrVxod As.
Решение
bastardbeach, суть в том, чтобы определить високосный ли год и сколько будет дней в феврале. А тут алгоритм от языка программирования не зависит:
Проверям делится ли год на 4. Если нет, то год уже невисокосный.
Если год делится на 4, то проверям делится ли он на 100. Если нет, то год однозначно високосный.
Если год делится на 100, но при этом не делится на 400, то год невисокосный.
А реализация - зависит
Я бы, например, рекомендовала, давать пользователю вводить значение года, а не прописывать его в коде:
Хочу обратить ваше внимание, что количество дней вы задаете строкой, а не числом.
Плюс: считается, что нехорошо задавать в коде фиксированно значение - любое: строковое, числовое) Если это учебная задача и в рамках нее это нормально, то вопросов нет. Но если "система" может что-то посчитать сама - то лучше давать ей эту возможность.
Т.е. к вашей задаче хочется более "изящного" решения вместо построчного задания количества дней в каждом месяце.
Можно с использованием функций КонецПериода() в цикле обхода месяцев года и получения номера последнего дня месяца функцией День().
Добавлено через 10 минут
bastardbeach, я вот о чем - как можно сократить процедуру ПолучитьКоличествоДнейНаСервере() (все остальное - без изменений). Здесь даже опускается алгоритм расчета високосного года
Как известно «Лень – двигатель прогресса». В своей работе однажды я столкнулся задачей, когда нужно было составить таблицу расчёта процентов по договору займа, где за базу должно было быть фактическое количество дней в году. Неудобство составляло то, что нужно было не забыть про високосные года и разделять дни, которые относятся к високосному году и дни не високосных лет. Была написана простенькая формула, но позже я выяснил, что расчётом високосных лет не всё так просто.
Описание проблемы
Мне захотелось улучшить формулу. В интернете я нашёл много текстов программ, где вычислялось количество високосных или невисокосных лет и дней в периоде. Но, к сожалению, мен не устраивал тот факт, что скорость работы данных функций зависела от количества лет в периоде. А хотелось, чтобы независимо от того, сколько лет в периоде, функция работала также быстро. Но в ходе разработки мне пришлось ограничить допустимый период работы функции.
Причина 1
Большинство стран живут по Григорианскому календарю, правила високосных лет для которого были определены ещё 1582 году римским папой Григорием XIII:
1. Год, номер которого кратен 400, - високосный;
2. Остальные годы, номер которых кратен 100, - невисокосные (например, годы 1700, 1800, 1900, 2100, 2200,2300)
3. Остальные годы, номер которых кратен 4, - високосные.
Также существует неоднозначность в мнениях определения високосных лет таких как 2900, 3200, 4000, поэтому я решил ограничить функцию максимальной датой 01.01.2900.
Причина 2
Пользовательская функция в Excel создаётся на языке VBA (Visual Basic for Applications). Несмотря на то, что интерпретатор данного языка встроен в MS Office, я обнаружил некоторые отличия в работе с датами.
Excel поддерживает две системы дат, так называемые системы 1900 и 1904. По умолчанию используется система 1900. Это означает, что число 1 введённое в ячейку соответствует 01 января 1900 года, 2 – 2 января и так далее.
В VBA есть функция CDate(expression), которая приводит к типу Date введённое значение. И если этой функции передать число 1, то она вернёт переменную типа Date с датой 31 декабря 1899 года. А вот для числа 60 функция CDate вернёт 28.02.1900, а то же значение введённое в ячейку будет отображать 29.02.1900 (хотя, конечно, 1900 год високосным не является). Далее, начиная с 01 марта 1900 года значения дат выравниваются.
Такое поведение Excel, давно известно компании Microsoft и было принято решение оставить как есть, нужно просто учитывать его. Поэтому и появилось второе ограничение минимальной даты периода 01 марта 1900 года.
Алгоритм решения
Для того, чтобы скорость вычисления количества (не)високосных не зависела от количества дней между датами мне нужно было разработать некую формулу или алгоритм, где не было бы никаких циклов.
Так как все делители, с помощью которых мы можем определить високосность года кратны 4, то я решил разбить все годы на блоки по 4 (квартеты) начиная с 1 года. То есть 1-й блок начинается с 1 года и заканчивается 4, 2-й блок с 5 по 8 и так далее.
В каждом блоке год будет иметь свой индекс от 1 до 4 (например, 2021 год это 506-й блок, индекс в блоке 1)
Теперь мы можем разделить вычисление на 3 блока:
В зависимости от года параметров и индексов квартетов формула расчёта количества дней високосного года будет следующей:
Если год начальной и конечной даты равны и год високосный:
Если год начальной даты невисокосный, а конечной високосный и индексы квартета начальной даты и конечной равны, то:
Если год начальной даты високосный, а конечной нет, то:
Ну и наконец, если год начальной даты невисокосный и конечной тоже, индексы квартетов разные и в текущем индексе квартета есть високосный год, то в 1-м квартете количество дней високосного года лежащего внутри периода будет 366 (так как невисокосные года квартета с 1 по 3, а вторая дата лежит в одном из следующих квартетов).
Выше указанная логика расчёта количества дней високосных лет для первого квартета реализована следующей функцией на VBA:
Функция високосных дней для первого квартета
Если разница индексов квартетов начальной и конечной даты >0, то рассчитывается 3-й блок формулы "Количество високосных дней в последнем квартете".
Здесь формула только одна, где при условии, что год конечной даты високосный:
Функция високосных дней для последнего квартета
Если разница индексов квартетов начальной и конечной даты >1, то рассчитывается 2-й блок формулы "Количество високосных дней в промежуточных квартетах".
При этом К полных столетий – означает разность индексов столетий между датами. Например 1999 – индекс столетия 19, а 2001 – 20, таким образом разность столетий 1.
Аналогично и 400-летий.
Функция для расчёта високосных дней в промежуточных квартетах
Реализация функций
Функция вычисления високосных дней для периода:
В приведённом выше коде мы сначала приводим значения параметров count_first_day и count_last_day к значению 1 или 0. Затем мы объявляем переменные типа Date для даты начала и окончания периода и задаём значения. Далее следует проверка параметров на ограничения.
По умолчанию функция не учитывает первый день периода, но учитывает последний день периода, но с помощью необязательных параметров указанных абзацем выше можно изменить это поведение. В строках 23-24 мы корректируем результат функции в зависимости от параметров.
Далее идёт сложение результатов промежуточных функций, которые были выше описаны.
Заключение
Таким образом мы получили формулы расчёта количества дней високосных и невисокосных лет в заданном периоде, скорость которой не зависит от количества дней в периоде. Единственный минус это то, что формула способна корректно работать только в рамках одной тысячи лет (2900 - 1900). Думаю, что до 2900 года у нас есть ещё время усовершенствовать такую функцию.
Ниже ссылка на гитхаб, где выложена полная реализация функций подсчёта високосных и невисокосных дней в периоде на VBA предназначенная для работы в Excel. Вы легко сможете портировать эту функцию на Ваш любимый язык и пользоваться в своих проектах.
Гитхаб
Источники и дополнительные ссылки
Статья из журнала "Главная книга" "Считаем проценты по займу: день первый, день последний"
В 1С значение типа «Дата» – это календарная дата григорианского календаря (с 01 января 0001 года по 31 декабря 3999 год) и время с точностью до 0,1 миллисекунды. Разработчику неизбежно приходится сталкиваться с данным типом, поэтому в этой статье предлагаю ознакомиться с его основными функциями и принципами работы.
«Дата» в модулях 1С
Как инициализировать дату
С помощью литерала встроенного языка
С помощью функции 1С Дата()
Как указать пустую дату
Функции для работы с датой
Получить текущую дату
Получить отдельные части даты
Следует заметить, что пробел в номере года вставляется при установках по умолчанию (подразумевается, что не установлен признак группировки в региональных установках).
Определить дату и время начала некоторого периода из даты
Для решения таких задач существует набор функций НачалоГода(), НачалоКвартала(), НачалоМесяца(), НачалоНедели(), НачалоДня(), НачалоЧаса(), НачалоМинуты(). В параметр задаётся значение даты начало периода, которого необходимо определить.
Определить дату и время конца некоторого периода из даты
Для получения конца периода из даты, можно использовать специальные функции НачалоГода(), НачалоКвартала(), НачалоМесяца(), НачалоНедели(), НачалоДня(), НачалоЧаса(), НачалоМинуты(). Параметр принимает значение «нашей даты», аналогично, как и в функции Начало…().
Определить номер недели или дня в году
Определить номер дня в неделе
Как отнять или прибавить к дате в 1С год, месяц, день, час, минуту, секунду
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Чтобы прибавить, вычесть месяц или год правильно использовать функцию ДобавитьМесяц(, ). Если параметру задать отрицательное значение, то число месяцев отнимается.
Формат даты в 1С
Функция Формат(, ). В параметре перечисляются параметры форматирования через символ «;». Возвращаемый тип строка.
Для задания параметра можно воспользоваться «конструктором форматной строки». При написании кода вызвать его не составляет труда. Необходимо только нажать правую кнопку «мыши» и из контекстного меню выбрать одноимённый конструктор.
На вкладке «Дата» задаём нужный нам формат.
Как вызвать диалоговое окно для ввода даты
Не модальный режим:
«Дата» в запросах 1С
Инициализация даты в запросах
Функция ДАТАВРЕМЯ()
Стоит отметить, что параметры данной функции принимают только литералы в отличие от схожей на неё функции для работы с датой в модулях Дата(). Например запись с передачей в функцию полей выборки из временной таблицы ДАТАВРЕМЯ(вт.Год, вт.Месяц, вт.День) выдаст ошибку.
Пустая дата
Текущая дата и работа с условием по дате в запросе
Так же не стоит забывать, что передать в запрос дату можно с помощью параметра. Для указания текущей даты это единственный вариант.
Получить отдельные части даты. Функции: ГОД, КВАРТАЛ, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА
В запросе получить отдельные части даты возможно с помощью одноимённых функций ГОД(), КВАРТАЛ(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА().
Получить начало, конец некоторого периода
Существует две функции для решения таких задач. Соответственно НАЧАЛОПЕРИОДА(, ) и КОНЕЦПЕРИОДА(, ).
Где в параметр указывается «наша дата», а в параметр задаётся значение периода (Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута).
Аналогично и для функции КОНЕЦПЕРИОДА().
Добавить сдвиг к дате
Для решения таких задач пригодится функция ДОБАВИТЬКДАТЕ(, , ). В параметр задаётся «наша дата», в параметр временной интервал (Год, Полугодие, Месяц и т.д.).
Использование функции РАЗНОСТЬДАТ()
Office 365 ProPlus переименован в Майкрософт 365 корпоративные приложения. Для получения дополнительной информации об этом изменении прочитайте этот блог.
Аннотация
В этой статье описывается, как определить, является ли год в дате, используемой в документе Microsoft Excel, високосным.
Дополнительная информация
Система дат, используемая Excel, основана на григорианском календаре, впервые установленном в 1582 году папой римским Григорием XIII. Этот календарь был разработан для исправления ошибок, привнесенных менее точным юлианским календарем.
В григорианском календаре обычный год состоит из 365 дней. Поскольку фактическая продолжительность звездного года (период обращения Земли вокруг Солнца) составляет 365.2425 дней, «високосный год» в 366 дней используется один раз каждые четыре года для устранения ошибки, вызванной тремя обычными (но короткими) годами. Любой год, который делится на 4 без остатка, является високосным годом: например, 1988, 1992 и 1996 годы являются високосными годами.
Тем не менее, есть еще небольшая ошибка, которая должна быть учтена. Чтобы устранить эту ошибку, григорианский календарь предусматривает, что год, который делится без остатка на 100 (например, 1900) является високосным годом только в том случае, если он также без остатка делится на 400.
По этой причине следующие годы не являются високосными:
1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600
Это потому, что они делятся без остатка на 100, но не на 400.
Следующие годы – високосные: 1600, 2000, 2400
Это потому, что они делятся без остатка на 100 и 400.
Поскольку версии Microsoft Excel, более ранние, чем Excel 97, обрабатывают только годы с 1900 по 2078 год, только для 1900 года действует правило исключения 100/400 високосных лет в Microsoft Excel. Однако для совместимости с другими программами Microsoft Excel рассматривает 1900 год как високосный.
Как определить, является ли год високосным
Чтобы определить, является ли год високосным, выполните следующие действия:
- Если год делится на 4 без остатка, перейдите на шаг 2. В противном случае перейдите к выполнению действия 5.
- Если год делится на 100 без остатка, перейдите на шаг 3. В противном случае перейдите к выполнению действия 4.
- Если год делится на 400 без остатка, перейдите на шаг 4. В противном случае перейдите к выполнению действия 5.
- Год високосный (366 дней).
- Год не високосный год (365 дней).
Формула, чтобы определить, является ли год високосным
Используйте следующую формулу, чтобы определить, является ли номер года, который вводится в ячейку (в данном примере, ячейка A1), високосным годом:
Интересную проблему обнаружила сегодня в ТиС на основе 9.2. Выгружаю итоги по регистру после временного расчета (конфигурация самописная) на НАЧАЛО периода (1 марта 2008 года), по одному из измерений выводится страшное фуфло, причем ТОЛЬКО по ОДНОМУ значению этого измерения. В итогах на КОНЕЦ периода (29.02.08) все работает правильно. Эффект наблюдается ТОЛЬКО 29.02.08 и 1.03.08. Может, у кого-то из умных людей есть соображения на этот счет ? Обратите внимание, что 1 марта суббота, так что в этот день в фирме документы не создавались, и конец дня 29.02 соответствует началу дня 01.03.
PS. Жалоба на регистр "Касса" - примерно такой же, как и в типовой (с добавленным измерением).
Вывод на экран монитора словами "День, Месяц, Високосный/Не високосный год"
Добрый день Появилась такая вот краказябра Когда ввожу любое число для переменной d, вместо.
Проверить, является ли заданный год високосным и вывести следующий високосный год
В первую строку выведите YES, если данный год является високосным и NO, если не является. Во второй.
Создайте класс «Дата» со свойствами год, високосный год, месяц, день месяца и день недели
Создайте класс «Дата» со свойствами год, високосный год, месяц, день месяца и день недели. .
Фуфло только по одному регистру? Мне кажется, "дело вовсе не в бобине". Попробуйте сделать пересчет итогов. Дело в том, что 1С хранит данные на начало периода. Все остальные - расчетные (кроме актуальных). Данные на 1 марта берутся напрямую, данные на 29 февраля получаются путем расчета: итог на 1 февраля и все движения за фераль.
Високосный год
Трабл с кодом, ничего не могу понять. Посмотрите, пожалуйста. Вот, что выдает компилятор Line 7.
Високосный год
Нужно написать программу, которая позволит вывести на экран данные о первом високосном годе от.
Високосный год
Год считается високосным, если число, образованное из двух его последних цифр, делится на 4 без.
високосный год
Написать программу, в которой с клавиатуры вводятся два целых числа: D (день) и M (месяц).
Читайте также: