Разработка и Конфигурация · 9 мин
Как в 1С к дате прибавить день
Как в 1С прибавить день к дате: простое сложение с секундами, функция ДобавитьМесяц, работа с датами в запросах. Примеры кода, ошибки и проверка результата.
Встроенный язык 1С не имеет отдельной функции «прибавить день», но задача решается двумя стандартными приёмами: арифметическим сложением даты с количеством секунд и функцией ДобавитьМесяц для календарных сдвигов. Выбор зависит от того, что именно нужно — суточный сдвиг по времени или переход на следующий календарный день с учётом конца месяца.
Тип «Дата» в 1С хранится с точностью до секунды, поэтому любое сложение выполняется в секундах: один день — это 86400 секунд. Выражение Дата + 86400 сдвигает значение ровно на сутки вперёд. Этот способ прост, но требует внимательности при работе с границами месяцев и с датами без времени.
Ниже разобраны оба подхода с примерами кода, работа с датами в запросах, типичные ошибки и способы проверить результат. Материал применим к платформе 8.3 как в управляемых, так и в обычных формах.
Сложение даты с числом секунд
Самый прямой способ — прибавить к дате число секунд. Один день равен 86400 секундам (24 × 60 × 60). Платформа автоматически пересчитывает переход через границу суток, месяца и года, поэтому дополнительная логика не нужна.
ИсходнаяДата = ТекущаяДата();
НоваяДата = ИсходнаяДата + 86400; // плюс один день
// Прибавить неделю
НоваяДата = ИсходнаяДата + 7 * 86400;
// Вычесть день
ПредыдущийДень = ИсходнаяДата - 86400;
Чтобы код читался лучше, количество секунд часто выносят в переменную или константу. Это особенно удобно, когда сдвиг вычисляется от пользовательского параметра — например, срока оплаты в днях.
СекундВДне = 86400;
СрокОплатыДней = 10;
ДатаОплаты = ДатаДокумента + СрокОплатыДней * СекундВДне;
Важно помнить: сложение сдвигает дату ровно на указанное число секунд, включая время. Если исходная дата содержит время 15:30:00, то результат тоже будет содержать 15:30:00 следующих суток. Когда время не нужно, его следует отсечь функцией НачалоДня или КонецДня.
Функция ДобавитьМесяц для календарных сдвигов
Функция ДобавитьМесяц(Дата, КоличествоМесяцев) сдвигает дату на целое число месяцев с корректной обработкой разной длины месяцев. Напрямую дни она не прибавляет, но она незаменима, когда бизнес-логика требует «тот же день через месяц», чего сложение секунд не гарантирует.
ДатаНачала = '20260131';
ДатаЧерезМесяц = ДобавитьМесяц(ДатаНачала, 1); // 29.02.2026 — платформа скорректирует на последний день месяца
Если 31 января прибавить 31 день секундами, получится 2 или 3 марта в зависимости от года. ДобавитьМесяц же вернёт последний день февраля. Для договоров, подписок и графиков платежей обычно требуется именно календарное поведение.
Комбинация ДобавитьМесяц и сложения секунд покрывает почти все сценарии: сначала сдвигают месяцы и годы календарно, затем дотягивают остаток днями. Отдельной функции «ДобавитьДень» в языке нет, и писать её самостоятельно обычно не нужно.
Сравнение вариантов
Подходит для точного суточного сдвига и произвольного числа дней. Не учитывает календарную логику «тот же день месяца».
Подходит для сдвигов на месяцы и годы с корректной обработкой конца месяца. Дни напрямую не прибавляет.
Подходит, когда расчёт нужен на стороне СУБД в выборке. Работает только в тексте запроса, не в коде модулей.
Прибавление дней в запросах
В языке запросов 1С арифметика с секундами недоступна. Вместо неё используется функция ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество), где тип периода задаётся ключевым словом: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Заказы.ДатаОтгрузки, ДЕНЬ, 3) КАК КрайнийСрок
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Количество может быть отрицательным — тогда функция вычитает период. Параметр можно передавать и через параметр запроса, что удобно для отчётов с настраиваемым горизонтом планирования.
Также в запросах доступны функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, которые часто сочетают с ДОБАВИТЬКДАТЕ: например, чтобы получить конец следующего дня — КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 1), ДЕНЬ). Это типовой приём для отбора документов «за завтра включительно».
НоваяДата = НачалоДня(ИсходнаяДата) + 86400; // начало завтрашнего дняРабота с началом и концом дня
Когда документ или отбор должен оперировать целыми сутками, время в дате становится помехой. Функции НачалоДня и КонецДня приводят дату к 00:00:00 или 23:59:59 соответственно, после чего сдвиг выполняют сложением.
ЗавтраНачало = НачалоДня(ТекущаяДата()) + 86400; // завтра 00:00:00
ЗавтраКонец = КонецДня(ТекущаяДата() + 86400); // завтра 23:59:59
ВчераНачало = НачалоДня(ТекущаяДата() - 86400); // вчера 00:00:00
Такой приём критичен для отборов в динамических списках и отчётах. Если сравнивать дату документа с «голой» датой без времени, документы за текущий день после полуночи могут выпасть из выборки или, наоборот, попасть лишние.
Для границ периодов в запросах вместо КонецДня часто используют виртуальную границу через объект Граница с видом «Включая», но в прикладном коде пары НачалоДня/КонецДня достаточно.
- 1Определите, нужен суточный сдвиг по времени или календарный переход на следующий день
- 2Для суточного сдвига прибавьте к дате 86400 секунд, для календарного — отсеките время через НачалоДня и прибавьте день
- 3В запросе используйте ДОБАВИТЬКДАТЕ с типом периода ДЕНЬ
- 4Проверьте результат на граничных датах: конец месяца, конец года, високосный февраль
- 5Убедитесь, что время в результирующей дате соответствует ожиданиям отбора
Типичные ошибки и как их избежать
Главная ошибка — запись вида Дата + 1. Она синтаксически корректна, но прибавляет одну секунду. Внешне код работает, ошибка всплывает только на контрольных проверках данных, когда сроки оказываются сдвинуты на сутки меньше ожидаемого.
Вторая группа ошибок связана со временем. Если прибавить день к дате документа со временем 14:22 и использовать результат как границу отбора «по дату», часть документов следующего дня до 14:22 попадёт в выборку ошибочно. Всегда осознанно решайте, нужно ли сохранять время.
Третья ошибка — попытка использовать сложение секунд для месячных и годовых сдвигов. Месяц не равен 30 дням: для договорных сроков и периодических расчётов применяйте ДобавитьМесяц, иначе при длинном горизонте набежит расхождение в несколько дней.
Проверка результата и граничные случаи
Проверять вычисления дат стоит на границах периодов: 31 января, 28–29 февраля, 31 декабря. Именно там расходятся суточный и календарный подходы. Быстрый способ — вывести результат через Сообщить или в отладчике и сверить с календарём.
ДатаТест = '20261231';
Сообщить(ДатаТест + 86400); // 01.01.2026 0:00:00 — переход через год корректен
Отдельно проверяйте сценарии с пустой датой. Пустая дата в 1С — это '00010101', и прибавление дня даст 02.01.0001, что почти наверняка не то, что нужно. Перед вычислением проверяйте заполненность через ЗначениеЗаполнено.
В распределённых системах и при веб-доступе учитывайте часовой пояс сеанса: ТекущаяДата() возвращает время сервера или сеанса, которое может отличаться от локального времени пользователя. Для критичных расчётов используйте ТекущаяДатаСеанса и явно документируйте, в каком поясе ведётся учёт.
Как проверить результат
День увеличился на 1, время сохранилось или отсечено по замыслу
Изменились только секунды или сбросилось время, которое должно было остаться
31.01 + 1 день = 01.02, год и месяц пересчитаны платформой
Получена несуществующая дата или сброс на начало месяца
31.12 + 1 день = 01.01 следующего года
Год не изменился или дата стала пустой
Перед расчётом выполнена проверка ЗначениеЗаполнено
В результате дата января года 1 — признак незаполненного источника
Частые вопросы
Почему Дата + 1 не прибавляет день?
Потому что в арифметике дат 1С единица — это секунда. Выражение Дата + 1 сдвигает значение на одну секунду. Для прибавления суток используйте Дата + 86400 либо ДОБАВИТЬКДАТЕ с типом ДЕНЬ в запросах.
Как прибавить к дате месяц, а не 30 дней?
Используйте функцию ДобавитьМесяц(Дата, 1). Она корректно обрабатывает разную длину месяцев: к 31 января вернёт последний день февраля, а не начало марта, как дало бы сложение секунд.
Как получить начало завтрашнего дня?
Выражение НачалоДня(ТекущаяДата()) + 86400 вернёт завтрашнюю дату со временем 00:00:00. Сначала отсекается время текущей даты, затем прибавляются сутки.
Можно ли прибавить день к дате прямо в запросе?
Да, функцией ДОБАВИТЬКДАТЕ(ПолеДаты, ДЕНЬ, 1). Количество может быть отрицательным для вычитания и может передаваться параметром запроса.
Что произойдёт при прибавлении дня к пустой дате?
Пустая дата равна 01.01.0001, поэтому результатом будет 02.01.0001. Такое значение почти всегда является ошибкой — проверяйте исходную дату функцией ЗначениеЗаполнено перед расчётом.
Учитывает ли сложение секунд переход на летнее время?
Платформа хранит дату как абсолютное значение, а перевод часов в большинстве регионов применения 1С отменён, поэтому на практике проблема не возникает. При работе через часовые пояса сеанса ориентируйтесь на ТекущаяДатаСеанса и единый пояс учёта.
Что важно запомнить
День к дате в 1С прибавляют сложением с 86400 секундами, в запросах — функцией ДОБАВИТЬКДАТЕ с типом ДЕНЬ. Для месячных и годовых сдвигов используйте ДобавитьМесяц. Всегда контролируйте время в дате и проверяйте расчёт на границах месяца и года.