Разработка и Конфигурация · 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 марта не попадают в выборку, ведь их время больше полуночи. Правильное решение — передать в параметр КонецДня(ДатаОкончания), а не пытаться «прибавить день» к границе, что сместило бы период на лишние сутки.
Увеличение даты на день в запросах
Когда сдвиг даты нужен прямо в тексте запроса, используется функция языка запросов ДОБАВИТЬКДАТЕ(Дата, Тип, Количество). Вторым параметром передаётся единица измерения — в нашем случае ключевое слово ДЕНЬ:
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&ИсходнаяДата, ДЕНЬ, 1) КАК СледующийДень
Функция удобна тем, что поддерживает и другие единицы: СЕКУНДА, МИНУТА, ЧАС, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Количество может быть отрицательным, что позволяет тем же вызовом вычитать дни. Учтите, что ДОБАВИТЬКДАТЕ работает на уровне СУБД, и при массовых вычислениях в больших выборках это корректнее, чем вытаскивать даты в код и обрабатывать их циклом.
Сравнение подходов в запросе и в коде
Сравнение вариантов
Подходит для одиночных вычислений в модулях; просто и наглядно, но требует помнить про секунды
Оптимально при обработке множества дат в выборке; не требует выгрузки данных в код, но недоступно вне запроса
Нужно, когда требуется граница суток, а не просто сдвиг на 24 часа; добавляет один вызов функции
Работа с датами через функции ДобавитьМесяц и смежные сценарии
Отдельной функции «ДобавитьДень» во встроенном языке нет, но есть ДобавитьМесяц(Дата, ЧислоМесяцев), которая корректно обрабатывает переходы через конец месяца. Для суточных сдвигов она не применяется — здесь остаётся сложение с секундами. Зато полезно знать её поведение, когда логика расширяется: например, расчёт «срок оплаты — 30 дней» корректнее реализовать как ДатаСчёта + 30 * 86400, а не через месяцы, если по договору имеются в виду именно календарные дни.
Для рабочих дней арифметика секунд не подходит вовсе: «следующий рабочий день» зависит от производственного календаря. В типовых конфигурациях для этого используются регистры календарных графиков и специальные функции общих модулей. Если ваша задача — сдвиг даты с учётом выходных и праздников, ищите в конфигурации механизмы работы с графиками работы, а не прибавляйте дни вручную.
Проверка результата и отладка
После вычисления даты полезно убедиться, что результат соответствует ожиданиям. Самый быстрый способ — вывести значение через Сообщить() или посмотреть его в отладчике. Обратите внимание на формат: по умолчанию дата выводится в кратком виде, и время может быть скрыто. Чтобы увидеть секунды, используйте функцию Формат(НоваяДата, "ДЛФ=DT") или явный шаблон Формат(НоваяДата, "ДФ='dd.MM.yyyy HH:mm:ss'").
- 1Определите, что именно нужно: сдвиг на 24 часа или граница следующего дня
- 2Прибавьте 86400 секунд к исходной дате (или используйте ДОБАВИТЬКДАТЕ в запросе)
- 3При необходимости примените НачалоДня() или КонецДня() к результату
- 4Выведите результат с форматом, показывающим время, и проверьте часы, минуты и секунды
- 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). Для границ периодов комбинируйте сложение с НачалоДня() и КонецДня(), следите за временем в результате и учитывайте часовой пояс сеанса в распределённых внедрениях.