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

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

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

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

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

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

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

Штатная функция встроенного языка ДобавитьКДате(Дата; ТипПериода; Количество) корректно обрабатывает переходы через конец месяца, високосные годы и границы года. Именно её рекомендуется использовать в прикладном коде.

bsl
ИсходнаяДата = ТекущаяДатаСеанса();
НоваяДата = ДобавитьКДате(ИсходнаяДата; "День"; 1);
// Для 31.01 получим 01.02, для 28.02 високосного года — 29.02

Второй параметр — строка с типом периода: "Секунда", "Минута", "Час", "День", "Неделя", "Месяц", "Квартал", "Год". Третий параметр может быть отрицательным — тогда функция вычитает период. Для вычитания одного дня: ДобавитьКДате(Дата; "День"; -1).

Функция сохраняет время внутри даты: если исходное значение было 15.03 14:30:00, результат будет 16.03 14:30:00. Если нужно начало следующего дня, оберните результат в НачалоДня().

Сложение с числом секунд

Тип «Дата» в 1С поддерживает арифметику: прибавление числа сдвигает дату на указанное количество секунд. В сутках 86400 секунд, поэтому вариант ИсходнаяДата + 86400 рабочий и встречается в типовых конфигурациях.

bsl
НоваяДата = ИсходнаяДата + 86400; // +1 день
ПредыдущийДень = ИсходнаяДата - 86400; // -1 день

Способ быстрый и короткий, но менее читаемый: при ревизии кода не всегда очевидно, что означает магическое число 86400. Если используете его, добавьте комментарий или вынесите значение в константу с говорящим именем, например СекундВДне.

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

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

bsl
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(Заказ.Дата, ДЕНЬ, 1) КАК ДатаОтгрузки
ИЗ
	Документ.ЗаказПокупателя КАК Заказ

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

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

Начало и конец следующего дня

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

  • НачалоДня(ДобавитьКДате(Дата; "День"; 1)) — завтра, 00:00:00;
  • КонецДня(ДобавитьКДате(Дата; "День"; 1)) — завтра, 23:59:59;
  • КонецДня(Дата) + 1 — тоже начало следующего дня (прибавляется одна секунда).

Такие конструкции типичны при формировании периодов отчётов и отборов документов «за завтра». Ошибка в одну секунду на границе периода приводит к тому, что документы на границе дня попадают не в тот отчёт.

Типичные ошибки
01
Дата + 1 вместо Дата + 86400 — сдвиг на одну секунду вместо дня
02
Использование КонецДня() как границы отбора — документы с граничной секундой теряются или дублируются
03
Прибавление дня к пустой дате (01.01.0001) — результат выглядит как мусор и ломает отборы
04
Вычисление даты в запросе там, где проще передать готовый параметр — лишняя нагрузка и сложность

Сравнение способов и выбор подходящего

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

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

Универсальный и читаемый вариант для любого кода; корректно работает с месяцами и годами. Рекомендуется по умолчанию.

Дата + 86400

Коротко и быстро, но только для дней и меньших единиц; для месяцев и лет не подходит из-за разной длительности.

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

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

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

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

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

Сдвиг на сутки
Норма

Время в новой дате совпадает с исходным, число увеличилось на 1

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

Время сдвинулось на секунды — значит, прибавляли число 1

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

31.01 + 1 день = 01.02

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

Получилось 32.01 или ошибка — использована ручная сборка даты

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

Перед расчётом есть проверка ЗначениеЗаполнено(Дата)

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

Расчёт выполняется над 01.01.0001 без контроля

Работа на форме и в выражениях СКД

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

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

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

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

Потому что арифметика с типом «Дата» в 1С оперирует секундами: целое число трактуется как количество секунд. Для сдвига на день прибавляйте 86400 или используйте ДобавитьКДате().

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

Либо ДобавитьКДате(Дата; "День"; -1), либо Дата - 86400. Оба варианта корректно обрабатывают переход через начало месяца.

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

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

Как получить начало завтрашнего дня?

НачалоДня(ДобавитьКДате(ТекущаяДатаСеанса(); "День"; 1)) или КонецДня(ТекущаяДатаСеанса()) + 1. Оба выражения дают завтрашнюю полночь 00:00:00.

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

Пустая дата — это 01.01.0001 00:00:00. Прибавление дня даст 02.01.0001, что в отборах и отчётах обычно означает ошибочные данные. Проверяйте дату через ЗначениеЗаполнено() до расчёта.

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

Да. В поле ввода даты нажмите клавишу «+» на цифровом блоке клавиатуры — дата увеличится на один день. Клавиша «−» уменьшит её на день.

Итог

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

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