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

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

Как прибавить к дате один день в 1С

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

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

Главная сложность в том, что тип «Дата» в 1С хранит значение с точностью до секунды, и простое сложение с числом работает не так, как ожидают новички. Неправильный способ может сдвинуть время внутри даты, «потерять» границу периода или дать ошибку при пустом значении.

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

Функция ДобавитьКДате — основной способ

Встроенная функция ДобавитьКДате специально создана для арифметики с датами. Она принимает три параметра: исходную дату, тип добавляемого интервала и количество интервалов. Для прибавления одного дня вызов выглядит так:

НоваяДата = ДобавитьКДате(ИсходнаяДата, "День", 1);

Функция корректно обрабатывает переходы через конец месяца и конец года: если к 31 января прибавить день, получится 1 февраля, а к 31 декабря — 1 января следующего года. Високосные годы также учитываются автоматически, вручную ничего проверять не нужно.

В качестве типа интервала можно указывать «Секунда», «Минута», «Час», «День», «Неделя», «Месяц», «Квартал», «Полугодие», «Год». Это делает функцию универсальной: тем же вызовом решаются задачи прибавления месяца к дате оплаты или года к дате гарантии.

ДатаОплаты = ДобавитьКДате(Документ.Дата, "День", 14); // оплата через 14 дней

СледующийДень = ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1);

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

Встроенный язык позволяет складывать дату с числом — число интерпретируется как количество секунд. В одних сутках 86400 секунд (60 × 60 × 24), поэтому прибавить день можно так:

НоваяДата = ИсходнаяДата + 86400;

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

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

Сравнение способов

ДобавитьКДате

Подходит всегда, читаемый код, корректные переходы через месяцы и годы. Рекомендуемый вариант.

Дата + 86400

Короткая запись, встречается в типовом коде. Требует комментария и аккуратности с границами периодов.

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

Единственный вариант, когда дата вычисляется на стороне СУБД внутри запроса.

Прибавление дня в запросе

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

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(Заказы.ДатаОтгрузки, ДЕНЬ, 1) КАК ДатаСледующегоДня

ИЗ

Документ.ЗаказПокупателя КАК Заказы

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

Вычисление даты на стороне запроса полезно, когда результат нужен сразу в выборке: например, отобрать документы, у которых срок оплаты (дата плюс дни отсрочки) меньше текущей даты. Переносить такие вычисления в обход результата запроса неоправданно усложняет код.

Границы периодов: начало и конец дня

На практике «прибавить день» часто означает не сдвиг момента времени, а получение границы периода. Здесь важны функции НачалоДня и КонецДня, которые сбрасывают или устанавливают время.

НачалоЗавтра = НачалоДня(ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1));

КонецЗавтра = КонецДня(ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1));

КонецДня возвращает время 23:59:59. Если дата используется как правая граница периода в запросе с условием «меньше или равно», это корректно. Но если сравнение строгое («меньше»), документы в 23:59:59 выпадут из выборки. Надёжнее использовать начало следующего дня с условием «меньше» — такая конструкция не зависит от точности до секунд.

Для границ периодов в отчётах на СКД применяйте стандартные периоды и тип Граница с видом «Включая» — это снимает ручные вычисления и связанные с ними ошибки.

Порядок действий
  1. 1
    Определите, что нужно: сдвинуть момент времени или получить границу дня
  2. 2
    Для сдвига используйте ДобавитьКДате(Дата, "День", 1)
  3. 3
    Для границы оберните результат в НачалоДня() или КонецДня()
  4. 4
    Если дата из реквизита — проверьте, что она заполнена
  5. 5
    Выполните код в отладчике и сверьте результат с ожидаемым

Типичные ошибки и как их избежать

Самая распространённая ошибка — попытка написать Дата + 1, ожидая прибавления одного дня. На самом деле это прибавит одну секунду, и документ останется в той же дате. Ошибка коварна тем, что код выполняется без исключения, а неверный результат замечают поздно.

Вторая группа ошибок связана с пустыми датами. Если реквизит не заполнен, его значение — 01.01.0001 00:00:00, и прибавление дня даст 02.01.0001. Такая дата потом попадает в отчёты и печатные формы. Перед вычислением проверяйте заполненность через ЗначениеЗаполнено().

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

Типичные ошибки
01
Дата + 1 прибавляет секунду, а не день — результат остаётся в той же дате
02
Прибавление дня к пустой дате даёт 02.01.0001, которая попадает в отчёты
03
Кавычки вокруг ДЕНЬ в запросе вызывают ошибку синтаксиса
04
Сравнение «меньше или равно КонецДня» вместо «меньше начала следующего дня» теряет документы при нестандартной точности времени

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

После написания кода полезно проверить поведение на граничных датах: конец месяца, конец года, 28 февраля високосного года. Быстрее всего это сделать во внешней обработке или консоли кода, не запуская всю бизнес-логику.

Сообщить(ДобавитьКДате(Дата(2026, 1, 31), "День", 1));  // 01.02.2026

Сообщить(ДобавитьКДате(Дата(2026, 2, 28), "День", 1)); // 29.02.2026 — високосный год

Сообщить(ДобавитьКДате(Дата(2023, 12, 31), "День", 1)); // 01.01.2026

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

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

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

Переход через конец месяца
Норма

31.01 + 1 день = 01.02

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

Дата остаётся в январе или сбрасывается

Время внутри даты
Норма

Время сохранено или обнулено осознанно

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

Неожиданные 00:00:00 или 23:59:59

Пустая исходная дата
Норма

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

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

В данных появляется 02.01.0001

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

Чем отличается ДобавитьКДате от простого сложения Дата + 86400?

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

Как прибавить один рабочий день, а не календарный?

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

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

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

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

Скорее всего, в дате сохранилось время, а отчёт отбирает по границам с конкретным временем. Проверьте время внутри даты и при необходимости оберните результат в НачалоДня() или используйте для правой границы отбора начало следующего дня с условием «меньше».

Можно ли прибавить день к дате в форме без программирования?

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

Итог

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

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