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