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