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

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

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

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

Задача прибавить к дате день встречается в 1С 8 постоянно: при расчёте сроков оплаты, дат отгрузки, окончания договоров, формировании периодов отчётов. Встроенный язык платформы предлагает несколько способов решения, и у каждого есть свои особенности, о которых нужно знать, чтобы не получить ошибку или неверный результат.

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

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

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

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

Пример прибавления одного дня:

НоваяДата = ДобавитьКДате(ТекущаяДата(), "ДЕНЬ", 1);

// или с произвольной датой

ДатаОтгрузки = ДобавитьКДате(ДатаЗаказа, "ДЕНЬ", 3);

Функция возвращает новое значение типа «Дата» и не изменяет исходную переменную — результат нужно присвоить. Чтобы вычесть день, передайте отрицательное число: ДобавитьКДате(Дата, "ДЕНЬ", -1).

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

Прибавление дня через арифметику с секундами

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

НоваяДата = Дата + 86400; // плюс один день

// или читаемее:

СекундВДне = 24 60 60;

НоваяДата = Дата + СекундВДне;

Этот способ короче и часто встречается в старом коде, но у него есть ограничение: он работает только с секундами, минутами, часами и днями. Прибавить так месяц невозможно, потому что длительность месяца в секундах непостоянна.

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

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

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

Дата + 86400

Подходит только для дней и меньших единиц. Короче, но менее читаемо и не работает с месяцами.

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

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

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

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

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 1) КАК ДатаОтгрузки

ИЗ

Документ.ЗаказПокупателя КАК Заказы

Функцию можно применять и в условиях отбора. Например, выбрать документы за день, следующий за указанной датой:

ГДЕ

Заказы.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 1)

И КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 1), ДЕНЬ)

Обратите внимание: в запросах тип интервала пишется как ключевое слово (ДЕНЬ), а не строка. Если написать "ДЕНЬ" в кавычках, конструктор запроса выдаст ошибку.

Типичные ошибки
01
Прибавление числа 1 к дате вместо 86400 — результат сдвинется всего на одну секунду, а не на день
02
Кавычки вокруг ДЕНЬ в тексте запроса — запрос не выполнится, так как там нужно ключевое слово
03
Отсутствие присваивания результата ДобавитьКДате — исходная дата не изменится
04
Сложение секунд для месяцев и лет — неверный результат из-за разной длительности месяцев

Прибавление дня к дате документа и в реквизитах

Типовой сценарий — рассчитать дату оплаты или отгрузки на основании даты документа. В модуле объекта или формы это делается через ту же функцию:

// В модуле объекта документа

ДатаОплаты = ДобавитьКДате(Дата, "ДЕНЬ", СрокОплатыДней);

Если срок хранится в реквизите (например, «СрокОплаты» в договоре), подставьте его третьим параметром. Перед расчётом полезно проверить, что реквизит заполнен, иначе при пустом значении платформа вернёт дату без изменений или вы получите неочевидный результат.

При работе с датой документа помните: Дата документа содержит и время. Если для расчёта важно начало дня, предварительно отбросьте время функцией НачалоДня(Дата), иначе прибавленный день сохранит исходное время.

Порядок действий для расчёта даты оплаты
  1. 1
    Получите исходную дату: реквизит документа или ТекущаяДата()
  2. 2
    При необходимости приведите её к началу дня: НачалоДня(Дата)
  3. 3
    Вызовите ДобавитьКДате с типом интервала ДЕНЬ и нужным количеством дней
  4. 4
    Присвойте результат целевой переменной или реквизиту
  5. 5
    Проверьте результат через Сообщить() или отладчик

Проверка результата и отладка

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

Сообщить(Формат(НоваяДата, "ДЛФ=D"));

Проверяйте граничные случаи: переход через конец месяца, конец года, високосный февраль. Например, прибавление дня к 31 января должно дать 1 февраля, а к 28 февраля високосного года — 29 февраля. Функция ДобавитьКДате обрабатывает эти переходы корректно, но если вы используете арифметику секунд, убедитесь, что не смешали её с логикой «конца месяца».

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

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

Значение после ДобавитьКДате
Норма

Дата увеличилась ровно на заданное число дней

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

Дата не изменилась — результат не присвоен переменной

Время в новой дате
Норма

Время соответствует ожиданию (сохранено или обнулено через НачалоДня)

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

Неожиданное время мешает сравнению дат в условиях

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

31.01 + 1 день = 01.02

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

Получилась несуществующая или сдвинутая дата — проверьте способ расчёта

Особые случаи: рабочие дни и границы периодов

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

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

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

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

Потому что число при сложении с датой трактуется как секунды. Дата + 1 сдвигает значение на одну секунду. Чтобы прибавить день, используйте Дата + 86400 или функцию ДобавитьКДате(Дата, "ДЕНЬ", 1).

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

Передайте отрицательное количество: ДобавитьКДате(Дата, "ДЕНЬ", -1). При арифметическом способе вычтите секунды: Дата - 86400.

Как прибавить день к дате в СКД или вычисляемом поле?

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

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

Оберните результат в НачалоДня: НачалоДня(ДобавитьКДате(Дата, "ДЕНЬ", 1)). Получите следующий день с временем 00:00:00.

Работает ли ДобавитьКДате с пустой датой?

Функция выполнится, но результат будет вычисляться от пустого значения даты (01.01.0001), что почти всегда не то, что нужно. Перед расчётом проверяйте заполненность через ЗначениеЗаполнено(Дата).

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

Штатной простой функции нет. В типовых конфигурациях используйте производственный календарь и готовые функции общих модулей календарных графиков; в самописной конфигурации потребуется собственный регистр с графиком работы и перебор дней.

Итог

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

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