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

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

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

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

Прибавить один день к дате в 1С можно двумя основными способами: через встроенную функцию ДобавитьКДате() и через простое арифметическое сложение с числом секунд. Оба варианта корректно работают, но отличаются читаемостью и поведением в нестандартных ситуациях — например, при переходе через конец месяца или при работе с пустой датой.

Частая ошибка начинающих разработчиков — попытка написать Дата + 1, ожидая прибавления одного дня. На самом деле единица в таком выражении означает одну секунду, потому что дата в 1С хранится с точностью до секунды, и арифметика выполняется именно в секундах. Результат такой ошибки заметен не сразу: документ проведётся, но дата останется практически той же.

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

Способ 1. Функция ДобавитьКДате — рекомендуемый вариант

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

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

Тип увеличения можно указывать по-разному: "День", "ДЕНЬ" — регистр значения не имеет. Кроме дней функция поддерживает секунды, минуты, часы, недели, месяцы, кварталы, полугодия и годы, что делает её универсальной для любых сдвигов дат.

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

Чтобы вычесть день, передайте отрицательное значение: ДобавитьКДате(ИсходнаяДата, "День", -1). Это удобно при расчёте дат оплаты, сроков доставки или периодов отчётности.

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

Способ 2. Сложение даты с числом секунд

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

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

Такой код работает быстро и корректно переходит через границы месяцев и лет — платформа выполняет арифметику на внутреннем представлении даты. Однако у подхода есть минусы. Во-первых, магическое число 86400 снижает читаемость: тому, кто будет сопровождать код, придётся пересчитывать значение в уме. Во-вторых, легко ошибиться в нулях и получить сдвиг на 2,4 часа вместо суток.

Если вы всё же используете этот способ, вводите именованную константу, например СекундВДне = 86400, и пишите ИсходнаяДата + СекундВДне. Это снимает обе проблемы: и читаемость, и риск опечатки.

Как прибавить день в запросе

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

ВЫБРАТЬ

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

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

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

Типичный сценарий — отбор документов «по дату включительно». Если пользователь вводит конец периода как дату без времени, её значение равно началу дня (00:00:00), и документы за этот день в выборку не попадут. Решение — прибавить день и сравнивать строго меньше:

ГДЕ

Документ.Дата >= &НачалоПериода

И Документ.Дата < ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1)

Альтернатива — функция КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), которая возвращает 23:59:59 указанной даты. Оба подхода корректны; вариант с добавлением дня и строгим неравенством чуть надёжнее, потому что не зависит от точности хранения времени.

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

ДобавитьКДате() в коде

Читаемо, безопасно на границах периодов. Подходит для любого кода на встроенном языке.

Дата + 86400

Быстро пишется, но требует константы-комментария. Не работает в запросах.

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

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

КОНЕЦПЕРИОДА() в запросе

Подходит для включения последнего дня в отбор, но не для произвольного сдвига.

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

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

ДобавитьКДате(Дата, "День", 1)

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

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

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

Самая распространённая ошибка — Дата + 1 вместо Дата + 86400 или ДобавитьКДате(). Внешне всё работает, но сдвига на день не происходит. Второй частый случай — работа с пустой датой: ДобавитьКДате('00010101', "День", 1) вернёт 02.01.0001, что почти наверняка не то, что ожидалось. Перед сдвигом проверяйте дату на заполненность функцией ЗначениеЗаполнено().

Третья группа ошибок связана с границей дня. Дата документа обычно содержит время, и простое сравнение Дата = НачалоДня(Дата) + 86400 может не сработать из-за состава значения. Для сравнений используйте НачалоДня() и КонецДня(), а не прямое равенство.

Типичные ошибки
01
Дата + 1 — прибавляет секунду, а не день; итоговая дата визуально не меняется
02
Сдвиг пустой даты без проверки — получается 02.01.0001 и попадает в отчёты
03
Сравнение дат с временем через равенство — условие не срабатывает из-за секунд
04
Кавычки вокруг типа периода в запросе: ДОБАВИТЬКДАТЕ(Дата, "ДЕНЬ", 1) — синтаксическая ошибка
05
Расчёт рабочих дней простым сдвигом — выходные и праздники не учитываются

Пошаговая проверка результата

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

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

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

15 марта + 1 день
Норма

16 марта того же года

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

Дата не изменилась или сдвинулась на секунды

31 января + 1 день
Норма

1 февраля

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

Несуществующая дата или ошибка выполнения

31 декабря + 1 день
Норма

1 января следующего года

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

Год не изменился

Пустая дата + 1 день
Норма

Ветка кода не выполняется, выводится предупреждение

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

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

Когда простого сдвига недостаточно

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

Аналогично обстоит дело со сдвигом на «один банковский день» или «один день по графику подразделения» — везде, где есть собственный календарь, простая арифметика заменяется запросом к регистру дат. Учитывайте это на этапе проектирования, чтобы не переписывать расчёты после первых выходных.

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

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

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

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

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

Используйте ДобавитьКДате(ТекущаяДата(), "День", 1). На клиенте функция ТекущаяДата() возвращает дату компьютера пользователя, на сервере — сервера; при разнице часовых поясов это может давать разные результаты. В серверном коде для единообразия часто берут ТекущаяДатаСеанса().

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

В подписке на событие или обработчике ПередЗаписью/ПриЗаписи обратитесь к реквизиту и запишите новое значение: Объект.ДатаОплаты = ДобавитьКДате(Объект.Дата, "День", 1). Саму дату документа так менять не следует — она определяет позицию документа во времени и в последовательностях.

Почему ДОБАВИТЬКДАТЕ в запросе выдаёт ошибку?

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

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

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

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

Получится 02.01.0001 00:00:00. Такая дата может попасть в отчёты и отборы и выглядеть как «мусор». Перед сдвигом всегда проверяйте значение через ЗначениеЗаполнено() и обрабатывайте пустую дату отдельной веткой логики.

Итог

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

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