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

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

Как прибавить к дате число в 1С

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

Во встроенном языке 1С дата хранится с точностью до секунды, поэтому прямое сложение Дата + Число прибавляет не дни, а секунды. Это самая частая причина ошибок у начинающих разработчиков: выражение ТекущаяДата() + 1 сдвигает дату всего на одну секунду, а не на один день, как ожидается.

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

Ниже разобраны все рабочие способы прибавить число к дате в 1С: от простого сложения секунд до сдвига на месяцы и годы с учётом особенностей календаря.

Как устроен тип «Дата» в 1С и почему число — это секунды

Значение типа «Дата» в 1С содержит календарную дату и время с точностью до секунды. Арифметическая операция сложения определена как смещение по шкале времени: прибавляемое число интерпретируется как количество секунд. Поэтому Дата + 3600 — это плюс один час, а Дата + 86400 — плюс одни сутки (24 × 60 × 60 = 86400).

Вычитание двух дат работает симметрично: результатом Дата2 - Дата1 будет число — разница в секундах. Чтобы получить разницу в днях, результат делят на 86400. При этом стоит помнить, что деление может дать дробное число, если время в датах отличается.

Простое сложение: прибавить секунды, часы и дни

Если нужно сместить дату на фиксированный интервал внутри суток или на целое число суток, достаточно обычного сложения. Примеры:

НоваяДата = ИсходнаяДата + 1;        // +1 секунда

НоваяДата = ИсходнаяДата + 3600; // +1 час

НоваяДата = ИсходнаяДата + 86400; // +1 день

НоваяДата = ИсходнаяДата + 7 * 86400; // +7 дней (неделя)

Способ удобен своей краткостью и работает в любой версии платформы. Однако у него есть ограничение: сложение секунд не учитывает календарную логику. Прибавить таким способом «один месяц» невозможно, потому что месяцы имеют разную длину — от 28 до 31 дня.

Типичные ошибки
01
Написать Дата + 1 и ожидать прибавления дня — на самом деле добавится одна секунда, и документ «не найдётся» в отборе за следующий день.
02
Вычислять месяц как 30 * 86400 — при переходе через февраль или месяцы с 31 днём дата сместится на неверное число.
03
Игнорировать время в дате: сложение 86400 к дате 15:30 даст следующий день в 15:30, а не начало дня, что ломает сравнение с границами периода.

Функция ДобавитьКДате: календарные периоды без сюрпризов

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

НоваяДата = ДобавитьКДате(ИсходнаяДата, "ДЕНЬ", 5);    // +5 дней

НоваяДата = ДобавитьКДате(ИсходнаяДата, "МЕСЯЦ", 2); // +2 месяца

НоваяДата = ДобавитьКДате(ИсходнаяДата, "ГОД", -1); // минус 1 год

Ключевое преимущество функции — корректная обработка границ календаря. При прибавлении месяца к 31 января результатом будет последний день февраля, а не несуществующая дата «31 февраля». Аналогично учитываются високосные годы при сдвиге на годы от 29 февраля.

Метод ДобавитьМесяц: когда нужен только сдвиг по месяцам

Функция ДобавитьМесяц(ИсходнаяДата, ЧислоМесяцев) — специализированный инструмент для смещения на целое количество месяцев. Она появилась в платформе раньше, чем универсальная ДобавитьКДате, и до сих пор широко используется в типовом коде.

ДатаОтгрузки = ДобавитьМесяц(ДатаЗаказа, 1);   // через месяц

ДатаНачала = ДобавитьМесяц(ДатаОтчета, -3); // три месяца назад

Функция так же корректно обрабатывает конец месяца: ДобавитьМесяц('20260131', 1) вернёт последний день февраля, а не ошибку. Если задача сводится именно к месяцам, этот вариант читается проще, чем ДобавитьКДате со строковым параметром.

Прибавление числа к дате в запросе

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

ВЫБРАТЬ

Заказы.Ссылка,

ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 3) КАК ДатаПлановойОтгрузки

ИЗ

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

ГДЕ

ДОБАВИТЬКДАТЕ(Заказы.Дата, МЕСЯЦ, 1) > &ТекущаяДата

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

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

Дата + Число

Подходит для секунд, часов и целых суток. Быстро и кратко, но не работает с месяцами и годами.

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

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

ДобавитьМесяц()

Узкий, но читаемый вариант для сдвига на месяцы. Не подходит для дней и лет.

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

Единственный способ сдвинуть дату прямо в запросе. Для условий отбора выгоднее заранее вычислить дату параметром.

Практический порядок действий

Чтобы выбрать правильный способ и не получить ошибку в расчёте, действуйте последовательно.

Порядок действий
  1. 1
    Определите единицу смещения: секунды, часы, сутки или календарный период (месяц, квартал, год).
  2. 2
    Для секунд, часов и суток используйте сложение: Дата + N * 86400 для дней.
  3. 3
    Для месяцев, кварталов и лет используйте ДобавитьКДате() или ДобавитьМесяц().
  4. 4
    Если расчёт нужен в запросе — примените оператор ДОБАВИТЬКДАТЕ, а для отборов предпочтительнее вычислить дату параметром заранее.
  5. 5
    Проверьте время в результате: при необходимости оберните результат в НачалоДня() или КонецДня().
  6. 6
    Протестируйте граничные случаи: 31 января + 1 месяц, 29 февраля + 1 год, переход через новый год.

Проверка результата и граничные случаи

Больше всего ошибок возникает на стыках календаря. Проверяйте расчёты на датах вроде 31 января, 29 февраля високосного года и 31 декабря. Функции ДобавитьКДате и ДобавитьМесяц в этих случаях возвращают последний корректный день целевого месяца, а ручное сложение секунд может дать неожиданный результат.

Отдельная тема — сравнение дат после вычислений. Если в одной дате время 00:00:00, а в другой 23:59:59, сравнение «в пределах одного дня» даст ложный результат. Для отборов по периоду принято использовать связку НачалоДня(Дата) и КонецДня(Дата): конец дня в 1С — это 23:59:59.

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

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

Сдвиг на один день
Норма

Дата изменилась на сутки, время сохранилось

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

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

Сдвиг на месяц от 31 числа
Норма

Результат — последний день следующего месяца

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

Дата «перепрыгнула» через месяц или сместилась на 30 суток без учёта календаря

Отбор документов за период
Норма

Попадают все документы от 00:00:00 первого дня до 23:59:59 последнего

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

Документы последнего дня теряются — вероятно, в условии использована дата без КонецДня()

Ограничения и риски

Тип «Дата» в 1С имеет диапазон от 01.01.0001 до 31.12.3999. Прибавление большого числа, выводящее за верхнюю границу, приведёт к ошибке исполнения. В прикладных задачах это редкость, но при вычислениях с параметрами, заданными пользователем, стоит проверять результат.

Ещё один риск — пустая дата '00010101'. Прибавление числа к пустой дате технически выполнится, но результат будет бессмысленным для учёта: например, «3 января 0001 года». Перед вычислениями проверяйте дату функцией ЗначениеЗаполнено().

В типовых конфигурациях сроки оплаты и доставки часто считаются через ДобавитьМесяц даже для сроков в днях — это наследие старых версий платформы. При доработке такого кода заменяйте расчёт на ДобавитьКДате с явным типом периода: код становится понятнее, а поведение предсказуемее.
ПЗ
Практическое замечание

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

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

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

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

Потому что число в арифметике дат 1С означает секунды, а не дни. Выражение Дата + 1 смещает момент времени на одну секунду. Чтобы прибавить день, умножьте количество дней на 86400 или используйте функцию ДобавитьКДате.

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

Функции ДобавитьКДате и ДобавитьМесяц автоматически возвращают последний день целевого месяца: от 31 января плюс один месяц получится последний день февраля. Ручное сложение секунд такого поведения не гарантирует, поэтому для месяцев применяйте только календарные функции.

Как прибавить число к дате в запросе 1С?

Используйте оператор ДОБАВИТЬКДАТЕ: ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 5). Тип периода пишется без кавычек, количество может быть отрицательным. Для условий отбора эффективнее вычислить граничную дату в коде и передать её в запрос параметром.

Как вычесть из даты число, а не прибавить?

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

Как получить разницу между двумя датами в днях?

Вычитание дат даёт разницу в секундах: (Дата2 - Дата1) / 86400 — разница в днях. Результат может быть дробным из-за времени в датах; для целого числа дней предварительно примените НачалоДня() к обеим датам или округлите результат.

Итог

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

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