К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как узнать количество дней в году в 1С

Как узнать количество дней в году в 1С: функция ДеньГода, запросы, разница дат, учёт високосных лет. Примеры кода на встроенном языке и в запросах.

Задача определить количество дней в году возникает в 1С чаще, чем кажется: при расчёте процентов по договорам, норм выработки, среднедневного заработка, планировании производственных календарей и проверке корректности периодов. Встроенного метода «ДнейВГоду» в платформе нет, поэтому разработчики используют несколько обходных приёмов — через функцию ДеньГода, разность дат или запрос к регистру календарей.

Ключевой нюанс — високосный год. В обычном году 365 дней, в високосном — 366. Если жёстко зашить число 365 в формулу расчёта процентов или среднего заработка, в високосном году накопится ошибка, которая исказит суммы по всем сотрудникам или договорам. Поэтому количество дней нужно вычислять для конкретного года, а не подставлять константу.

Ниже разобраны рабочие способы: на встроенном языке, в запросах, через производственный календарь, а также типичные ошибки и способы проверки результата.

Способ 1: функция ДеньГода от последнего дня года

Функция ДеньГода(<Дата>) возвращает порядковый номер дня с начала года. Если передать ей 31 декабря, результатом будет как раз общее количество дней в этом году — 365 или 366. Это самая короткая и надёжная конструкция на встроенном языке.

Год = 2026;

КоличествоДней = ДеньГода(Дата(Год, 12, 31));

// Для 2026 года вернёт 366, для 2026 — 365

Если год нужно взять из произвольной даты (например, из реквизита документа), сначала извлеките год функцией Год(), а затем соберите дату 31 декабря:

ПроизвольнаяДата = ТекущаяДатаСеанса();

ГодДаты = Год(ПроизвольнаяДата);

ДнейВГоду = ДеньГода(Дата(ГодДаты, 12, 31));

Обратите внимание: конструктор Дата(Год, Месяц, День) принимает числовые литералы. Если передать строку, получите ошибку преобразования. При получении года из пользовательского ввода сначала приведите значение к числу.

bsl
Функция КоличествоДнейВГоду(Год) Экспорт
	Возврат ДеньГода(Дата(Год, 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. 1
    Определите начало года: НАЧАЛОПЕРИОДА(ПолеДаты, ГОД)
  2. 2
    Вычислите начало следующего года: ДОБАВИТЬКДАТЕ(НачалоГода, ГОД, 1)
  3. 3
    Возьмите РАЗНОСТЬДАТ между ними с единицей ДЕНЬ
  4. 4
    Проверьте результат на контрольном високосном и обычном году

Проверка на високосный год без вычисления дней

Иногда нужно не само количество дней, а только признак високосности — например, чтобы выбрать делитель 365 или 366 в формуле процентов. Проверка сводится к тому же приёму: если ДеньГода(Дата(Год, 12, 31)) = 366, год високосный.

Функция ЭтоВисокосныйГод(Год) Экспорт

Возврат ДеньГода(Дата(Год, 12, 31)) = 366;

КонецФункции

Можно реализовать и классическое арифметическое правило: год високосный, если делится на 4, но не делится на 100, либо делится на 400. Однако в 1С этот путь не даёт преимуществ — платформа сама корректно работает с календарём, и проверка через ДеньГода короче и понятнее при чтении кода.

Количество рабочих дней через производственный календарь

Во всех перечисленных способах речь идёт о календарных днях. Но в кадровых и расчётных задачах чаще нужны рабочие дни по производственному календарю — их количество зависит от переносов праздников и каждый год разное. Здесь арифметика дат не поможет.

В типовых конфигурациях (1С:ЗУП, 1С:Бухгалтерия, ERP) графики работы хранятся в справочнике «Графики работы сотрудников» (или «Производственные календари»), а сами данные — в регистрах сведений, например «Данные графика работы сотрудников». Чтобы узнать число рабочих дней за год, выполните запрос к такому регистру с отбором по графику и периоду и посчитайте количество строк с рабочими днями (или сумму ресурса «ЧасыРаботы»/«Дней», в зависимости от структуры конфигурации).

Если ведёте собственный регистр календаря, структура запроса проста: отбор по году и виду дня «Рабочий», итог — КОЛИЧЕСТВО(*) или СУММА по признаку рабочего дня. Перед началом года убедитесь, что календарь заполнен на весь период — незаполненные месяцы дадут заниженный результат без какого-либо предупреждения.

Типичные ошибки и как их проверить

Самая частая ошибка — константа 365 в формулах. Она незаметна три года из четырёх, но в високосном году даёт систематическую погрешность в расчёте процентов, пеней и среднедневных величин. Вторая ошибка — забытое деление на 86400 при разности дат на встроенном языке. Третья — использование КонецГода() без учёта того, что функция возвращает 31 декабря 23:59:59, и при неаккуратном сравнении границ периода последний день «выпадает» или «дублируется».

Также встречается путаница между ТекущаяДата() на клиенте и ТекущаяДатаСеанса() на сервере: если клиент и сервер в разных часовых поясах, год на границе суток 31 декабря/1 января может определиться по-разному. Для серверных расчётов всегда используйте дату сеанса.

Типичные ошибки
01
Зашитая константа 365 — в високосном году искажает проценты и среднедневные суммы
02
Пропущенное деление на 86400 после вычитания дат — результат в секундах выглядит как огромное число
03
Использование клиентской ТекущаяДата() в серверном коде — на стыке лет год может определиться неверно
04
Расчёт рабочих дней арифметикой календарных дат — игнорирует праздники и переносы

Проверка результата проста: прогоните функцию на заведомо известных годах. Обычный год должен дать 365, високосный — 366. Для запросов к производственному календарю сверьте итог с официальным производственным календарём на соответствующий год: число рабочих дней в нём публикуется и легко сверяется вручную.

Контрольные точки

Как проверить результат

Функция для обычного года
Норма

Возвращает 365

Тревожный признак

Любое другое число или дробная часть

Функция для високосного года
Норма

Возвращает 366

Тревожный признак

365 — значит, логика не учитывает 29 февраля

Разность дат на встроенном языке
Норма

Целое число дней после деления на 86400

Тревожный признак

Число порядка миллионов — забыто деление

Рабочие дни из календаря
Норма

Совпадает с официальным производственным календарём

Тревожный признак

Результат занижен — график не заполнен на весь год

Какой способ выбрать

Для разового вычисления в коде достаточно ДеньГода(Дата(Год, 12, 31)) — это одна строка, читаемая и безопасная. Для отчётов и выборок используйте РАЗНОСТЬДАТ в запросе, чтобы не выгружать данные для обхода в коде. Если нужны рабочие дни — только запрос к данным графика работы, никакой арифметики.

Маршрут решения

Как выбрать действие

Нужно число календарных дней года в кодеИспользуйте ДеньГода(Дата(Год, 12, 31))
Расчёт выполняется в запросе или СКДПримените РАЗНОСТЬДАТ с единицей ДЕНЬ между началами соседних годов
Нужны рабочие дни для зарплаты или нормы времениДелайте запрос к регистру данных графика работы, предварительно проверив его заполнение
Нужен только признак високосностиСравните ДеньГода от 31 декабря с 366
Итог

Что важно запомнить

Количество дней в году в 1С вычисляется, а не задаётся константой: ДеньГода от 31 декабря даёт 365 или 366, в запросах работает РАЗНОСТЬДАТ, а рабочие дни берутся только из производственного календаря. Всегда проверяйте функцию на обычном и високосном годах.

Частые вопросы

Есть ли в 1С готовая функция «ДнейВГоду»?

Нет, встроенной функции с таким именем в платформе нет. Стандартный приём — ДеньГода(Дата(Год, 12, 31)), который возвращает порядковый номер последнего дня года, то есть искомое количество дней.

Как учесть високосный год в расчёте процентов по договору?

Определяйте делитель динамически для каждого года, на который приходится период расчёта: 365 или 366 через ДеньГода. Если период захватывает два года, корректнее считать дни по факту в каждом году, а не применять один делитель ко всему сроку.

Почему разность дат даёт огромное число вместо дней?

Вычитание дат на встроенном языке возвращает секунды, а не дни. Разделите результат на 86400. В запросах вместо вычитания используйте РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) — там единица измерения задаётся явно.

Как узнать количество рабочих дней в году в 1С:ЗУП?

Запросом к регистру сведений с данными графика работы: отбор по нужному графику и году, итог — количество строк с рабочими днями. Перед расчётом убедитесь, что график заполнен на весь год, иначе итог будет занижен без предупреждений.

Чем отличается КонецГода от Дата(Год, 12, 31)?

КонецГода возвращает 31 декабря 23:59:59, а конструктор Дата(Год, 12, 31) — начало этого дня, 00:00:00. Для ДеньГода разницы нет, но при сравнении границ периодов время имеет значение: смешивание подходов приводит к потере или дублированию последнего дня.

Можно ли вычислить дни в году на клиенте тонкого клиента?

Да, ДеньГода и арифметика дат доступны на клиенте. Но исходную дату для серверных расчётов берите через ТекущаяДатаСеанса(), чтобы избежать расхождений часовых поясов между клиентом и сервером на стыке дат.