Разработка и Конфигурация · 9 мин
Как узнать количество дней в месяце в 1С
Как в 1С узнать количество дней в месяце: функция КонецМесяца, встроенные методы языка, запросы и готовые примеры кода для разных задач.
Задача определить количество дней в месяце возникает в 1С регулярно: при расчёте зарплаты пропорционально отработанным дням, при формировании графиков планирования, при проверке корректности введённых дат и при построении отчётов за произвольный период. Встроенного оператора «ДнейВМесяце» в языке 1С нет, но получить нужное значение можно несколькими штатными способами — через функции работы с датами, через запрос или через календарные регистры.
Правильный выбор способа зависит от контекста: пишете ли вы код в модуле, строите запрос к базе или настраиваете отчёт на СКД. Ниже разобраны все рабочие варианты с готовыми примерами кода, особенностями високосных лет и типичными ошибками, которые приводят к неверным расчётам.
Почему в 1С нет отдельной функции «ДнейВМесяце»
Разработчики платформы не стали добавлять специализированную функцию, потому что механизм работы с датами в 1С построен на комбинации простых операций: получение начала и конца периода, извлечение частей даты (день, месяц, год), добавление и вычитание интервалов. Из этих «кирпичиков» собирается любой календарный расчёт, включая число дней в месяце.
Это даёт гибкость: тот же приём позволяет получить количество дней в квартале, в году или между двумя произвольными датами. Минус один — новичку неочевидно, какую комбинацию применить, поэтому ниже приведены готовые конструкции для каждого случая.
Способ 1. Функция КонецМесяца в коде модуля
Самый короткий и общепринятый вариант — взять день от конца месяца. Функция КонецМесяца(Дата) возвращает последнюю секунду последнего дня месяца, а функция День() извлекает из этой даты порядковый номер дня, который и равен количеству дней в месяце.
Функция ДнейВМесяце(Дата)
Возврат День(КонецМесяца(Дата));
КонецФункции
// Примеры:
// ДнейВМесяце('20260215') — вернёт 29 (февраль високосного года)
// ДнейВМесяце('20230215') — вернёт 28
// ДнейВМесяце('20230410') — вернёт 30 (апрель)Обратите внимание, что функция корректно обрабатывает високосные годы: для февраля 2026 года она вернёт 29, а для февраля 2023-го — 28. Никаких дополнительных проверок на високосность писать не нужно, платформа делает это сама.
В качестве параметра можно передавать любое значение типа Дата, включая ТекущаяДата(), реквизиты документов и переменные. Если дата не заполнена (пустое значение '00010101'), функция вернёт 31 — день конца января года 1. При необходимости добавьте проверку на заполненность.
Способ 2. Расчёт через разницу дат
Альтернативный подход — вычислить разность между первым днём следующего месяца и первым днём текущего. В 1С разность двух дат даёт результат в секундах, поэтому итог нужно разделить на 86400 (число секунд в сутках).
Процедура ПримерРазностиДат()
Дата = ТекущаяДата();
НачалоТекущего = НачалоМесяца(Дата);
НачалоСледующего = НачалоМесяца(ДобавитьМесяц(Дата, 1));
ДнейВМесяце = (НачалоСледующего - НачалоТекущего) / 86400;
КонецПроцедурыЭтот способ длиннее, но полезен в двух ситуациях: когда вам одновременно нужны границы периода для других расчётов (например, для отбора документов), и когда вы считаете длину произвольного интервала, а не только календарного месяца. Тот же приём работает для квартала, недели или любого периода между двумя датами.
Учтите ограничение: арифметика дат в 1С оперирует секундами, поэтому при делении всегда используйте 86400, а не приблизительные значения. Ошибка в константе даст дробный результат и исказит последующие расчёты.
Способ 3. Количество дней в запросе
Когда число дней нужно прямо в запросе — например, для расчёта среднедневных показателей в отчёте — используется аналогичная конструкция на языке запросов: ДЕНЬ(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)).
Функция КОНЕЦПЕРИОДА в запросах полностью аналогична КонецМесяца в коде, но принимает два параметра: дату и тип периода (МЕСЯЦ, КВАРТАЛ, ГОД и другие). Это удобно, если в одном запросе нужно посчитать дни для разных периодов — достаточно поменять второй параметр.
В отчётах на СКД эту же конструкцию можно вписать в вычисляемое поле набора данных. Тогда количество дней будет рассчитываться на уровне запроса и доступно для группировок и итогов без дополнительного кода.
Способ 4. Данные производственного календаря
Описанные выше способы возвращают календарное число дней. Но в зарплатных и кадровых задачах часто нужны не календарные, а рабочие дни по производственному календарю. Для этого в типовых конфигурациях (1С:ЗУП, 1С:Бухгалтерия) используется регистр сведений с данными календарей.
Запрос к такому регистру фильтруется по нужному месяцу и виду календаря, а затем суммируются дни с нужным признаком (рабочий, предпраздничный, выходной). Точное имя регистра зависит от конфигурации, поэтому перед написанием кода откройте дерево метаданных и найдите регистры, связанные с графиками работы или календарями.
Как проверить результат и избежать ошибок
Простейшая проверка — прогнать функцию по контрольным значениям: январь должен дать 31, апрель — 30, февраль невисокосного года — 28, високосного — 29. Если хотя бы одно значение не совпало, в коде ошибка в логике, а не в данных.
Как проверить результат
Возвращается 29
Возвращается 28 — проверьте, не обрезана ли дата до начала месяца
Код явно обрабатывает пустое значение
Функция молча возвращает 31, что искажает расчёты
Результат целый: 28, 29, 30 или 31
Дробное число — значит, деление выполнено не на 86400
Отдельная ловушка — смешение типов. Если в функцию передать строку с датой вместо значения типа Дата, платформа выдаст ошибку преобразования. Всегда приводите входные данные к типу Дата явно, особенно когда значение приходит из формы, файла обмена или внешнего источника.
Какой способ выбрать под свою задачу
Как выбрать действие
Для разовой проверки в пользовательском режиме писать код не обязательно: количество дней видно в любом календарном элементе формы или в стандартном диалоге выбора периода. Программные способы нужны там, где расчёт выполняется автоматически — в проведении документов, регламентных заданиях и отчётах.
Что важно запомнить
Стандартный приём для определения числа дней в месяце в 1С — День(КонецМесяца(Дата)) в коде и ДЕНЬ(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)) в запросах. Оба варианта автоматически учитывают високосные годы. Рабочие дни считаются только по производственному календарю, а не арифметикой дат.
Частые вопросы
Как узнать количество дней в текущем месяце без указания конкретной даты?
Передайте в конструкцию функцию ТекущаяДата(): День(КонецМесяца(ТекущаяДата())). Выражение вернёт число дней того месяца, в котором выполняется код. Учтите, что на сервере используется серверное время, которое может отличаться от времени клиента.
Учитывает ли КонецМесяца високосный год?
Да, полностью автоматически. Для февраля високосного года функция вернёт 29-е число, для невисокосного — 28-е. Писать собственную проверку делимости года на 4 не требуется, а самодельная логика високосности часто ошибается на годах, кратных 100.
Как посчитать количество дней между двумя произвольными датами?
Вычтите одну дату из другой и разделите результат на 86400: (Дата2 - Дата1) / 86400. Разность дат в 1С выражается в секундах. Если нужно включить в подсчёт обе граничные даты, прибавьте к результату единицу.
Можно ли получить число дней в месяце без программирования?
Да, если речь о разовой проверке: откройте любой документ с полем даты, нажмите кнопку выбора даты — откроется календарь, где видна длина месяца. Для автоматических расчётов в документах и отчётах без кода или выражения в запросе не обойтись.
Чем отличается КонецМесяца от КонецДня при расчётах?
КонецМесяца возвращает 23:59:59 последнего дня месяца, КонецДня — 23:59:59 конкретной даты. Для подсчёта дней в месяце нужна именно КонецМесяца. КонецДня применяется, когда нужно включить в отбор все документы конкретного дня до конца суток.
Как получить число дней в квартале или году?
Тем же приёмом через разность: (НачалоКвартала(ДобавитьМесяц(Дата, 3)) - НачалоКвартала(Дата)) / 86400 для квартала или (НачалоГода(ДобавитьМесяц(Дата, 12)) - НачалоГода(Дата)) / 86400 для года. В запросе используется КОНЕЦПЕРИОДА с параметром КВАРТАЛ или ГОД.