Разработка и Конфигурация · 10 мин
Как узнать количество дней в году в 1С
Как узнать количество дней в году в 1С: функция ДеньГода, запросы, разница дат, учёт високосных лет. Примеры кода на встроенном языке и в запросах.
Задача определить количество дней в году возникает в 1С чаще, чем кажется: при расчёте процентов по договорам, норм выработки, среднедневного заработка, планировании производственных календарей и проверке корректности периодов. Встроенного метода «ДнейВГоду» в платформе нет, поэтому разработчики используют несколько обходных приёмов — через функцию ДеньГода, разность дат или запрос к регистру календарей.
Ключевой нюанс — високосный год. В обычном году 365 дней, в високосном — 366. Если жёстко зашить число 365 в формулу расчёта процентов или среднего заработка, в високосном году накопится ошибка, которая исказит суммы по всем сотрудникам или договорам. Поэтому количество дней нужно вычислять для конкретного года, а не подставлять константу.
Ниже разобраны рабочие способы: на встроенном языке, в запросах, через производственный календарь, а также типичные ошибки и способы проверки результата.
Способ 1: функция ДеньГода от последнего дня года
Функция ДеньГода(<Дата>) возвращает порядковый номер дня с начала года. Если передать ей 31 декабря, результатом будет как раз общее количество дней в этом году — 365 или 366. Это самая короткая и надёжная конструкция на встроенном языке.
Год = 2026;
КоличествоДней = ДеньГода(Дата(Год, 12, 31));
// Для 2026 года вернёт 366, для 2026 — 365
Если год нужно взять из произвольной даты (например, из реквизита документа), сначала извлеките год функцией Год(), а затем соберите дату 31 декабря:
ПроизвольнаяДата = ТекущаяДатаСеанса();
ГодДаты = Год(ПроизвольнаяДата);
ДнейВГоду = ДеньГода(Дата(ГодДаты, 12, 31));
Обратите внимание: конструктор Дата(Год, Месяц, День) принимает числовые литералы. Если передать строку, получите ошибку преобразования. При получении года из пользовательского ввода сначала приведите значение к числу.
Функция КоличествоДнейВГоду(Год) Экспорт
Возврат ДеньГода(Дата(Год, 12, 31));
КонецФункцииСпособ 2: разность дат первых чисел января
Второй подход — вычесть из 1 января следующего года 1 января текущего. Разность дат в 1С даёт результат в секундах, поэтому его нужно разделить на количество секунд в сутках — 86400.
НачалоГода = Дата(Год, 1, 1);
НачалоСледующегоГода = Дата(Год + 1, 1, 1);
ДнейВГоду = (НачалоСледующегоГода - НачалоГода) / 86400;
Этот способ удобен, когда в коде уже есть границы периода и не хочется собирать дополнительную дату. Он также наглядно показывает логику: год — это интервал между двумя первыми января.
Ограничение: результат вычитания дат — число секунд, и при больших интервалах легко забыть про деление. Если забыть разделить на 86400, получите огромное число (для обычного года — 31 536 000), которое при дальнейших расчётах даст бессмысленные суммы. Всегда проверяйте порядок величины результата.
Способ 3: количество дней в запросе
Когда расчёт нужен прямо в запросе — например, для отчёта по начислениям с разбивкой по годам — используйте функцию языка запросов РАЗНОСТЬДАТ. Она сразу возвращает разность в указанной единице, в том числе в днях.
ВЫБРАТЬ
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2026, 1, 1), ДАТАВРЕМЯ(2026, 1, 1), ДЕНЬ) КАК ДнейВГоду
В отличие от вычитания на встроенном языке, РАЗНОСТЬДАТ не требует деления на секунды — единица измерения задаётся третьим параметром (ДЕНЬ, МЕСЯЦ, ГОД и др.). Это удобно и менее подвержено ошибкам.
Если год нужно вычислить из поля данных, дату-границу можно построить через ДОБАВИТЬКДАТЕ: взять начало года функцией НАЧАЛОПЕРИОДА(ПолеДаты, ГОД) и прибавить один год. Разность между этими точками в днях и даст количество дней в году конкретной записи.
- 1Определите начало года: НАЧАЛОПЕРИОДА(ПолеДаты, ГОД)
- 2Вычислите начало следующего года: ДОБАВИТЬКДАТЕ(НачалоГода, ГОД, 1)
- 3Возьмите РАЗНОСТЬДАТ между ними с единицей ДЕНЬ
- 4Проверьте результат на контрольном високосном и обычном году
Проверка на високосный год без вычисления дней
Иногда нужно не само количество дней, а только признак високосности — например, чтобы выбрать делитель 365 или 366 в формуле процентов. Проверка сводится к тому же приёму: если ДеньГода(Дата(Год, 12, 31)) = 366, год високосный.
Функция ЭтоВисокосныйГод(Год) Экспорт
Возврат ДеньГода(Дата(Год, 12, 31)) = 366;
КонецФункции
Можно реализовать и классическое арифметическое правило: год високосный, если делится на 4, но не делится на 100, либо делится на 400. Однако в 1С этот путь не даёт преимуществ — платформа сама корректно работает с календарём, и проверка через ДеньГода короче и понятнее при чтении кода.
Количество рабочих дней через производственный календарь
Во всех перечисленных способах речь идёт о календарных днях. Но в кадровых и расчётных задачах чаще нужны рабочие дни по производственному календарю — их количество зависит от переносов праздников и каждый год разное. Здесь арифметика дат не поможет.
В типовых конфигурациях (1С:ЗУП, 1С:Бухгалтерия, ERP) графики работы хранятся в справочнике «Графики работы сотрудников» (или «Производственные календари»), а сами данные — в регистрах сведений, например «Данные графика работы сотрудников». Чтобы узнать число рабочих дней за год, выполните запрос к такому регистру с отбором по графику и периоду и посчитайте количество строк с рабочими днями (или сумму ресурса «ЧасыРаботы»/«Дней», в зависимости от структуры конфигурации).
Если ведёте собственный регистр календаря, структура запроса проста: отбор по году и виду дня «Рабочий», итог — КОЛИЧЕСТВО(*) или СУММА по признаку рабочего дня. Перед началом года убедитесь, что календарь заполнен на весь период — незаполненные месяцы дадут заниженный результат без какого-либо предупреждения.
Типичные ошибки и как их проверить
Самая частая ошибка — константа 365 в формулах. Она незаметна три года из четырёх, но в високосном году даёт систематическую погрешность в расчёте процентов, пеней и среднедневных величин. Вторая ошибка — забытое деление на 86400 при разности дат на встроенном языке. Третья — использование КонецГода() без учёта того, что функция возвращает 31 декабря 23:59:59, и при неаккуратном сравнении границ периода последний день «выпадает» или «дублируется».
Также встречается путаница между ТекущаяДата() на клиенте и ТекущаяДатаСеанса() на сервере: если клиент и сервер в разных часовых поясах, год на границе суток 31 декабря/1 января может определиться по-разному. Для серверных расчётов всегда используйте дату сеанса.
Проверка результата проста: прогоните функцию на заведомо известных годах. Обычный год должен дать 365, високосный — 366. Для запросов к производственному календарю сверьте итог с официальным производственным календарём на соответствующий год: число рабочих дней в нём публикуется и легко сверяется вручную.
Как проверить результат
Возвращает 365
Любое другое число или дробная часть
Возвращает 366
365 — значит, логика не учитывает 29 февраля
Целое число дней после деления на 86400
Число порядка миллионов — забыто деление
Совпадает с официальным производственным календарём
Результат занижен — график не заполнен на весь год
Какой способ выбрать
Для разового вычисления в коде достаточно ДеньГода(Дата(Год, 12, 31)) — это одна строка, читаемая и безопасная. Для отчётов и выборок используйте РАЗНОСТЬДАТ в запросе, чтобы не выгружать данные для обхода в коде. Если нужны рабочие дни — только запрос к данным графика работы, никакой арифметики.
Как выбрать действие
Что важно запомнить
Количество дней в году в 1С вычисляется, а не задаётся константой: ДеньГода от 31 декабря даёт 365 или 366, в запросах работает РАЗНОСТЬДАТ, а рабочие дни берутся только из производственного календаря. Всегда проверяйте функцию на обычном и високосном годах.
Частые вопросы
Есть ли в 1С готовая функция «ДнейВГоду»?
Нет, встроенной функции с таким именем в платформе нет. Стандартный приём — ДеньГода(Дата(Год, 12, 31)), который возвращает порядковый номер последнего дня года, то есть искомое количество дней.
Как учесть високосный год в расчёте процентов по договору?
Определяйте делитель динамически для каждого года, на который приходится период расчёта: 365 или 366 через ДеньГода. Если период захватывает два года, корректнее считать дни по факту в каждом году, а не применять один делитель ко всему сроку.
Почему разность дат даёт огромное число вместо дней?
Вычитание дат на встроенном языке возвращает секунды, а не дни. Разделите результат на 86400. В запросах вместо вычитания используйте РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) — там единица измерения задаётся явно.
Как узнать количество рабочих дней в году в 1С:ЗУП?
Запросом к регистру сведений с данными графика работы: отбор по нужному графику и году, итог — количество строк с рабочими днями. Перед расчётом убедитесь, что график заполнен на весь год, иначе итог будет занижен без предупреждений.
Чем отличается КонецГода от Дата(Год, 12, 31)?
КонецГода возвращает 31 декабря 23:59:59, а конструктор Дата(Год, 12, 31) — начало этого дня, 00:00:00. Для ДеньГода разницы нет, но при сравнении границ периодов время имеет значение: смешивание подходов приводит к потере или дублированию последнего дня.
Можно ли вычислить дни в году на клиенте тонкого клиента?
Да, ДеньГода и арифметика дат доступны на клиенте. Но исходную дату для серверных расчётов берите через ТекущаяДатаСеанса(), чтобы избежать расхождений часовых поясов между клиентом и сервером на стыке дат.