Разработка и Конфигурация · 8 мин
Как прибавить к дате один день в 1С
Как прибавить один день к дате в 1С: функция ДобавитьКДате, арифметика с секундами, работа в запросах, типовые ошибки и проверка результата.
Задача прибавить к дате один день возникает в 1С постоянно: при расчёте сроков оплаты, формировании периодов отчётов, планировании доставки, установке дат документов. Встроенный язык платформы предлагает несколько способов решения, и у каждого есть свои условия применения и подводные камни.
Главная сложность в том, что тип «Дата» в 1С хранит значение с точностью до секунды, и простое сложение с числом работает не так, как ожидают новички. Неправильный способ может сдвинуть время внутри даты, «потерять» границу периода или дать ошибку при пустом значении.
Ниже разобраны рабочие способы: функция ДобавитьКДате, арифметика через секунды, прибавление дня в запросе, а также проверка результата и типичные ошибки.
Функция ДобавитьКДате — основной способ
Встроенная функция ДобавитьКДате специально создана для арифметики с датами. Она принимает три параметра: исходную дату, тип добавляемого интервала и количество интервалов. Для прибавления одного дня вызов выглядит так:
НоваяДата = ДобавитьКДате(ИсходнаяДата, "День", 1);
Функция корректно обрабатывает переходы через конец месяца и конец года: если к 31 января прибавить день, получится 1 февраля, а к 31 декабря — 1 января следующего года. Високосные годы также учитываются автоматически, вручную ничего проверять не нужно.
В качестве типа интервала можно указывать «Секунда», «Минута», «Час», «День», «Неделя», «Месяц», «Квартал», «Полугодие», «Год». Это делает функцию универсальной: тем же вызовом решаются задачи прибавления месяца к дате оплаты или года к дате гарантии.
ДатаОплаты = ДобавитьКДате(Документ.Дата, "День", 14); // оплата через 14 дней
СледующийДень = ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1);
Прибавление дня через секунды
Встроенный язык позволяет складывать дату с числом — число интерпретируется как количество секунд. В одних сутках 86400 секунд (60 × 60 × 24), поэтому прибавить день можно так:
НоваяДата = ИсходнаяДата + 86400;
Этот приём короче и часто встречается в старом коде и типовых конфигурациях. Он работает быстро и даёт тот же результат, что и ДобавитьКДате, поскольку в 1С нет переходов на летнее время внутри значения даты — сутки всегда равны 86400 секундам.
Недостаток способа — читаемость: число 86400 без комментария понимается хуже, чем явный вызов функции. Кроме того, при вычислении конца периода легко ошибиться: конец вчерашнего дня — это не «начало сегодня минус день», а «начало сегодня минус 1 секунда».
Сравнение способов
Подходит всегда, читаемый код, корректные переходы через месяцы и годы. Рекомендуемый вариант.
Короткая запись, встречается в типовом коде. Требует комментария и аккуратности с границами периодов.
Единственный вариант, когда дата вычисляется на стороне СУБД внутри запроса.
Прибавление дня в запросе
В языке запросов 1С арифметика с числами для дат недоступна — там используется собственная функция ДОБАВИТЬКДАТЕ. Синтаксис похож на встроенный язык, но параметры идут в другом порядке: сначала дата, затем тип интервала (без кавычек), затем количество.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Заказы.ДатаОтгрузки, ДЕНЬ, 1) КАК ДатаСледующегоДня
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Тип интервала в запросе пишется без кавычек: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД. Это частая ошибка переноса кода из модуля в запрос — строка «День» в кавычках вызовет ошибку синтаксиса.
Вычисление даты на стороне запроса полезно, когда результат нужен сразу в выборке: например, отобрать документы, у которых срок оплаты (дата плюс дни отсрочки) меньше текущей даты. Переносить такие вычисления в обход результата запроса неоправданно усложняет код.
Границы периодов: начало и конец дня
На практике «прибавить день» часто означает не сдвиг момента времени, а получение границы периода. Здесь важны функции НачалоДня и КонецДня, которые сбрасывают или устанавливают время.
НачалоЗавтра = НачалоДня(ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1));
КонецЗавтра = КонецДня(ДобавитьКДате(ТекущаяДатаСеанса(), "День", 1));
КонецДня возвращает время 23:59:59. Если дата используется как правая граница периода в запросе с условием «меньше или равно», это корректно. Но если сравнение строгое («меньше»), документы в 23:59:59 выпадут из выборки. Надёжнее использовать начало следующего дня с условием «меньше» — такая конструкция не зависит от точности до секунд.
Для границ периодов в отчётах на СКД применяйте стандартные периоды и тип Граница с видом «Включая» — это снимает ручные вычисления и связанные с ними ошибки.
- 1Определите, что нужно: сдвинуть момент времени или получить границу дня
- 2Для сдвига используйте ДобавитьКДате(Дата, "День", 1)
- 3Для границы оберните результат в НачалоДня() или КонецДня()
- 4Если дата из реквизита — проверьте, что она заполнена
- 5Выполните код в отладчике и сверьте результат с ожидаемым
Типичные ошибки и как их избежать
Самая распространённая ошибка — попытка написать Дата + 1, ожидая прибавления одного дня. На самом деле это прибавит одну секунду, и документ останется в той же дате. Ошибка коварна тем, что код выполняется без исключения, а неверный результат замечают поздно.
Вторая группа ошибок связана с пустыми датами. Если реквизит не заполнен, его значение — 01.01.0001 00:00:00, и прибавление дня даст 02.01.0001. Такая дата потом попадает в отчёты и печатные формы. Перед вычислением проверяйте заполненность через ЗначениеЗаполнено().
Третья ошибка — использование ТекущаяДата() в серверном коде вместо ТекущаяДатаСеанса(). На сервере первая функция может быть недоступна или дать не то значение, которое ожидает пользователь в своём часовом поясе. Для бизнес-логики всегда берите дату сеанса.
Проверка результата
После написания кода полезно проверить поведение на граничных датах: конец месяца, конец года, 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 — это секунда, а не день, проверяйте заполненность исходной даты и осознанно работайте со временем внутри неё.