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

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

Как из даты получить дни в 1С

Как из даты получить дни в 1С: функции День(), ДеньГода(), ДеньНедели(), разность дат в запросе, вычисление количества дней между датами с примерами кода.

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

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

Ниже разобраны все основные сценарии с готовыми фрагментами кода, которые можно переносить в свои модули с минимальной адаптацией. Примеры одинаково работают в управляемых и обычных формах, на клиенте и на сервере, если не указано иное.

Получение номера дня месяца функцией День()

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

ДатаДокумента = Дата(2026, 3, 15);

НомерДня = День(ДатаДокумента); // результат: 15

Функция корректно обрабатывает концы месяцев и високосные годы: для 29 февраля она вернёт 29, для 31 декабря — 31. Никаких дополнительных проверок писать не нужно.

Если день нужен в строковом виде с лидирующим нулём (например, для формирования номера документа или имени файла), используйте функцию Формат():

СтрокаДня = Формат(ДатаДокумента, "ДФ=dd"); // "05" для 5 марта

Обратите внимание: Формат() возвращает строку, а не число. Если результат потом участвует в арифметике, преобразуйте его обратно через Число(), иначе получите ошибку сложения строки с числом.

День недели и день года

Определение дня недели

Функция ДеньНедели() возвращает число от 1 до 7, где 1 — понедельник, 7 — воскресенье. Это соответствует российской привычке считать неделю с понедельника, но отличается от некоторых зарубежных систем, где неделя начинается с воскресенья.

Если ДеньНедели(ТекущаяДата()) >= 6 Тогда

Сообщить("Это выходной день");

КонецЕсли;

Такая проверка часто используется при расчёте сроков оплаты, дат доставки, планировании задач. Если нужно название дня недели строкой, применяйте Формат(Дата, "ДФ=dddd") — вернётся «понедельник», «вторник» и т.д. с учётом региональных настроек.

Порядковый день в году

Функция ДеньГода() возвращает порядковый номер дня с начала года — от 1 до 365 (или 366 в високосном году). Она удобна для расчётов, привязанных к годовым циклам: нормы выработки, графики ТО, сезонные коэффициенты.

НомерДняВГоду = ДеньГода(Дата(2026, 12, 31)); // 366 для високосного года

Количество дней между двумя датами

Вычитание двух дат во встроенном языке даёт результат в секундах, а не в днях. Это частая причина ошибок у начинающих разработчиков. Чтобы получить дни, результат делят на число секунд в сутках — 86400.

РазностьВСекундах = ДатаОкончания - ДатаНачала;

КоличествоДней = Цел(РазностьВСекундах / 86400);

Здесь есть тонкость: если в датах задано время, разность может быть не кратна суткам. Например, между 10:00 понедельника и 18:00 вторника — 1,33 суток. Функция Цел() отбросит дробную часть, что не всегда желательно. Если нужно считать именно календарные дни без привязки ко времени, предварительно обрежьте время функцией НачалоДня():

КоличествоДней = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / 86400;

Такой вариант даёт целое число календарных дней и не зависит от времени внутри дат. Именно его стоит использовать при расчёте просрочки платежей, сроков хранения, длительности отпусков.

Типичные ошибки
01
Деление разности дат на 86400 без учёта времени: при наличии времени в датах получается дробный результат или смещение на сутки
02
Использование Окр() вместо Цел() при подсчёте просрочки: округление в большую сторону завышает число дней
03
Сравнение дат с временем через равенство: 01.03.2026 00:00:00 не равно 01.03.2026 15:30:00, хотя календарный день один

РАЗНОСТЬДАТ в языке запросов

Когда дни нужно вычислить для большого набора данных — например, просрочку по тысяче документов, — делать это в цикле после выборки нерационально. В языке запросов есть функция РАЗНОСТЬДАТ, выполняющая расчёт на стороне СУБД.

ВЫБРАТЬ

Счет.Ссылка КАК Счет,

РАЗНОСТЬДАТ(Счет.Дата, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочено

ИЗ

Документ.СчетНаОплатуПокупателю КАК Счет

ГДЕ

НЕ Счет.Оплачен

Первые два параметра — начальная и конечная даты, третий — единица измерения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Результат — целое число полных единиц между датами.

В том же запросе можно извлечь и составные части даты: функции ДЕНЬ(Дата), МЕСЯЦ(Дата), ГОД(Дата), ДЕНЬНЕДЕЛИ(Дата), ДЕНЬГОДА(Дата) работают аналогично встроенному языку. Это удобно для группировок в отчётах, например «по дням недели» или «по числам месяца».

bsl
РазностьВДнях = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;

Число дней в месяце и добавление дней к дате

Сколько дней в заданном месяце

Готовой функции «количество дней в месяце» в языке нет, но она легко получается через конец месяца:

ДнейВМесяце = День(КонецМесяца(ПроизвольнаяДата));

Функция КонецМесяца() возвращает последний момент месяца (23:59:59 последнего дня), а День() извлекает из него номер последнего дня — это и есть число дней в месяце с учётом високосных лет.

Прибавление и вычитание дней

Прибавить фиксированное число дней можно простым сложением с секундами: НоваяДата = Дата + 7 * 86400. Однако для сдвига на месяцы и годы такой способ не подходит из-за разной длины месяцев. Универсальный инструмент — функция ДобавитьМесяц() для месячных сдвигов, а для дней — сложение секунд.

В запросах для сдвига дат используется функция ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 5), которая корректно работает и с днями, и с месяцами, и с годами. Для вычитания передавайте отрицательное число.

Сравнение вариантов

Вычитание дат и деление на 86400

Подходит для единичных расчётов в коде. Требует контроля времени в датах, иначе результат дробный

РАЗНОСТЬДАТ в запросе

Оптимально для массовых выборок и отчётов. Расчёт на стороне СУБД, но недоступно вне запроса

Формат() с шаблоном ДФ

Подходит для вывода дня строкой в печатные формы и имена файлов. Не пригоден для арифметики

Проверка результата и граничные случаи

После внедрения расчёта дней проверьте его на граничных значениях: переход через месяц и год, високосный февраль, даты с ненулевым временем, пустая дата. Пустая дата в 1С — это Дата(1,1,1), и День() от неё вернёт 1, что может исказить расчёты. Перед вычислениями полезно проверять заполненность: Если ЗначениеЗаполнено(ДатаНачала) Тогда ....

Отдельный риск — даты, приходящие извне: из Excel, веб-сервисов, обменов. Они могут быть в текстовом виде в неожиданном формате (американский MM/DD/YYYY вместо DD/MM/YYYY). Преобразование такой строки без контроля формата даёт перевёрнутые день и месяц, и ошибка всплывёт только на датах после 12-го числа.

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

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

Разность дат на границе месяца
Норма

Между 31.01 и 01.02 ровно 1 день

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

Получается 0 или 2 — проверьте время в датах и деление на 86400

Високосный февраль
Норма

Между 28.02 и 01.03 високосного года 2 дня

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

Результат 1 день — вероятно, даты собраны строкой без учёта года

Пустая дата в расчёте
Норма

Есть проверка ЗначениеЗаполнено, расчёт пропускается

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

Разность показывает огромные числа — участвует дата 01.01.0001

Итог

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

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

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

Как получить день недели словом, а не числом?

Используйте Формат(Дата, "ДФ=dddd") — вернётся полное название дня («среда»), а с шаблоном "ДФ=ddd" — сокращённое («ср»). Регистр и язык зависят от региональных настроек сеанса.

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

Потому что вычитание дат возвращает секунды, а не дни. Разделите результат на 86400, чтобы получить дни. Число 31536000 — это как раз год в секундах.

Как посчитать только рабочие дни между датами?

Встроенной функции нет. Стандартный подход — использовать регистр сведений с производственным календарём (в типовых конфигурациях он есть) и посчитать записи с признаком рабочего дня в нужном интервале запросом.

Чем отличается РАЗНОСТЬДАТ от вычитания дат в коде?

РАЗНОСТЬДАТ выполняется на стороне СУБД внутри запроса и сразу возвращает целое число в указанных единицах. Вычитание в коде даёт секунды и требует ручного пересчёта, но доступно в любом месте модуля без запроса.

Как прибавить к дате 30 дней?

Простым сложением: НоваяДата = ИсходнаяДата + 30 * 86400. В запросе — ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 30). Оба способа корректно переходят через границы месяцев и лет.

Функция День() возвращает 1 для пустого реквизита — это ошибка?

Нет. Пустая дата в 1С — это 01.01.0001, и День() честно возвращает 1. Перед расчётом проверяйте реквизит функцией ЗначениеЗаполнено(), чтобы не считать дни от начала летоисчисления.