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