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

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

Как в 1С увеличить дату на 1 день

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

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

Ключевой момент: в 1С дата хранится с точностью до секунды, и арифметика с датами построена именно на секундах. Поэтому «прибавить день» технически означает «прибавить 86 400 секунд» — количество секунд в сутках. Понимание этого принципа снимает большинство ошибок, включая знаменитую проблему с границей периода, когда документы за последний день «выпадают» из выборки.

Базовый способ: сложение даты с числом секунд

Самый простой и универсальный метод — сложение значения типа Дата с числом. Оператор «+» в этом случае интерпретирует число как количество секунд. Поскольку в сутках 24 часа × 60 минут × 60 секунд = 86 400 секунд, код выглядит так:

ИсходнаяДата = Дата("20260315");

НоваяДата = ИсходнаяДата + 86400; // 16.03.2026 0:00:00

Для читаемости кода часто записывают выражение через произведение, чтобы смысл был понятен без комментариев: ИсходнаяДата + 24 60 60. Результат идентичен, но при сопровождении конфигурации такая запись легче проверять. Некоторые разработчики выносят значение 86400 в именованную константу или функцию, например СекундВДне(), — это уместно в больших модулях, где сдвиги дат встречаются часто.

Если исходное значение было 15.03.2026 14:30:25, то после прибавления 86400 получится 16.03.2026 14:30:25, а не начало следующего дня. Если нужно именно начало суток, комбинируйте сложение с функциями НачалоДня() или КонецДня().

Прибавление дня с учётом начала и конца дня

На практике чаще всего нужен не просто сдвиг на 24 часа, а конкретная граница: начало завтрашнего дня или его конец. Для этого используются штатные функции работы с датами, которые применяются уже после сложения.

НачалоЗавтра = НачалоДня(ТекущаяДатаСеанса() + 86400); // завтра 0:00:00

КонецЗавтра = КонецДня(ТекущаяДатаСеанса() + 86400); // завтра 23:59:59

Функция КонецДня() возвращает время 23:59:59 указанной даты. Это стандартный способ задать правую границу периода при отборе документов. Альтернатива — вычислить начало следующего дня и отнять одну секунду: НачалоДня(Дата + 86400) - 1. Оба подхода дают одинаковый результат, выбор зависит от стиля кодирования, принятого в вашей конфигурации.

Почему нельзя просто прибавить день к границе периода

Частая ситуация: пользователь выбирает период отчёта «по 15 марта», а запрос строится с условием Дата <= &КонецПериода, где в параметр передана дата 15.03.2026 0:00:00. В результате документы за 15 марта не попадают в выборку, ведь их время больше полуночи. Правильное решение — передать в параметр КонецДня(ДатаОкончания), а не пытаться «прибавить день» к границе, что сместило бы период на лишние сутки.

Типичные ошибки
01
Сложение даты с числом 1 вместо 86400 — результат смещается на одну секунду, а не на сутки, и ошибка долго остаётся незамеченной
02
Использование конца дня 23:59:59 в условии запроса МЕЖДУ вместо начала следующего дня — при работе с границами и точностью регистров это даёт неоднозначные результаты
03
Прибавление дня к ТекущаяДата() на сервере без учёта часового пояса сеанса — пользователи в других регионах получают «вчерашнюю» или «завтрашнюю» дату

Увеличение даты на день в запросах

Когда сдвиг даты нужен прямо в тексте запроса, используется функция языка запросов ДОБАВИТЬКДАТЕ(Дата, Тип, Количество). Вторым параметром передаётся единица измерения — в нашем случае ключевое слово ДЕНЬ:

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(&ИсходнаяДата, ДЕНЬ, 1) КАК СледующийДень

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

Сравнение подходов в запросе и в коде

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

Сложение с 86400 в коде

Подходит для одиночных вычислений в модулях; просто и наглядно, но требует помнить про секунды

ДОБАВИТЬКДАТЕ в запросе

Оптимально при обработке множества дат в выборке; не требует выгрузки данных в код, но недоступно вне запроса

НачалоДня/КонецДня после сложения

Нужно, когда требуется граница суток, а не просто сдвиг на 24 часа; добавляет один вызов функции

Работа с датами через функции ДобавитьМесяц и смежные сценарии

Отдельной функции «ДобавитьДень» во встроенном языке нет, но есть ДобавитьМесяц(Дата, ЧислоМесяцев), которая корректно обрабатывает переходы через конец месяца. Для суточных сдвигов она не применяется — здесь остаётся сложение с секундами. Зато полезно знать её поведение, когда логика расширяется: например, расчёт «срок оплаты — 30 дней» корректнее реализовать как ДатаСчёта + 30 * 86400, а не через месяцы, если по договору имеются в виду именно календарные дни.

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

Проверка результата и отладка

После вычисления даты полезно убедиться, что результат соответствует ожиданиям. Самый быстрый способ — вывести значение через Сообщить() или посмотреть его в отладчике. Обратите внимание на формат: по умолчанию дата выводится в кратком виде, и время может быть скрыто. Чтобы увидеть секунды, используйте функцию Формат(НоваяДата, "ДЛФ=DT") или явный шаблон Формат(НоваяДата, "ДФ='dd.MM.yyyy HH:mm:ss'").

Порядок действий
  1. 1
    Определите, что именно нужно: сдвиг на 24 часа или граница следующего дня
  2. 2
    Прибавьте 86400 секунд к исходной дате (или используйте ДОБАВИТЬКДАТЕ в запросе)
  3. 3
    При необходимости примените НачалоДня() или КонецДня() к результату
  4. 4
    Выведите результат с форматом, показывающим время, и проверьте часы, минуты и секунды
  5. 5
    Проверьте граничные случаи: конец месяца, конец года, високосный февраль

Граничные случаи проверяются автоматически самой платформой: прибавление 86400 к 31.01.2026 даст 01.02.2026, а к 28.02.2026 в високосном году — 29.02.2026. Платформа корректно обрабатывает календарную арифметику, поэтому писать собственные проверки на количество дней в месяце не нужно — это было бы источником ошибок, а не защитой.

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

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

Разность новой и исходной даты
Норма

Ровно 86400 секунд

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

Другое число — значит, где-то добавлен лишний сдвиг или применён не тот коэффициент

Время в результирующей дате
Норма

Совпадает с исходным временем или равно 0:00:00 / 23:59:59, если применялись функции границ

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

Неожиданное время — например, 0:00:01 вместо начала дня

Попадание документов в период
Норма

Документы за последний день периода входят в выборку

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

Документы последнего дня отсутствуют — правая граница задана без КонецДня

Особенности: часовые пояса и дата сеанса

В клиент-серверных и мобильных внедрениях важно, откуда берётся исходная дата. Функция ТекущаяДата() на сервере возвращает время сервера, а на клиенте — время компьютера пользователя. Если пользователи работают в разных часовых поясах, «завтра» для них наступает в разные моменты, и прибавление дня к серверной дате может дать неожиданный результат в локальном контексте пользователя.

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

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

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

Почему нельзя прибавить к дате просто число 1?

Потому что при сложении даты с числом единицей измерения является секунда, а не день. Выражение Дата + 1 сдвинет значение на одну секунду. Для суточного сдвига нужно прибавить 86400 — число секунд в сутках.

Как вычесть один день из даты?

Тем же способом со знаком минус: НоваяДата = ИсходнаяДата - 86400. В запросе используйте ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, -1) — отрицательное количество работает корректно.

Как прибавить день к дате в СКД или настройках отчёта?

В схеме компоновки данных доступна та же функция языка выражений ДОБАВИТЬКДАТЕ с параметром ДЕНЬ. Если дата задаётся параметром, вычислите её в коде до формирования отчёта и передайте уже готовое значение — это проще и надёжнее.

Что вернёт КонецДня и почему не 24:00:00?

Функция КонецДня возвращает 23:59:59 указанной даты — последнюю секунду суток. Значения 24:00:00 в типе Дата не существует: полночь следующего дня — это уже 0:00:00 новой даты. Поэтому граница «до конца дня» всегда задаётся как 23:59:59.

Как прибавить день к пустой дате?

Пустая дата в 1С — это 01.01.0001 0:00:00. Прибавление 86400 даст 02.01.0001, что почти наверняка не то, что нужно. Перед вычислениями проверяйте заполненность даты через ЗначениеЗаполнено(Дата) и обрабатывайте пустые значения отдельно.

Работает ли сложение с секундами в мобильной платформе и внешних компонентах?

Да, арифметика дат через секунды — часть встроенного языка и работает одинаково на всех клиентах и в мобильной платформе. А вот доступность функций типа ТекущаяДатаСеанса зависит от контекста исполнения, поэтому проверяйте синтакс-помощник для конкретного режима.

Итог

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

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