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

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

Как прибавить к дате в 1С: все способы с примерами

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

Работа с датами — одна из самых частых задач при разработке на платформе 1С:Предприятие. Расчёт сроков оплаты, дат отгрузки, периодов действия договоров, отпусков и отчётных периодов — всё это требует корректного прибавления дней, месяцев или лет к исходной дате. При этом у начинающих разработчиков часто возникает соблазн просто прибавить число к дате, что приводит к ошибкам.

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

Ниже разобраны все рабочие способы прибавления к дате в коде и в запросах, особенности перехода через границы месяцев и лет, а также типичные ошибки, которые приводят к неверным расчётам в учётных данных.

Как устроен тип «Дата» и почему нельзя прибавлять число напрямую

Значение типа «Дата» в 1С хранится с точностью до секунды и содержит одновременно календарную дату и время. Именно поэтому простое сложение Дата + 5 прибавит не пять дней, а пять секунд — это самая распространённая ошибка новичков. Результат визуально почти не отличается от исходной даты, и ошибка может долго оставаться незамеченной в отчётах.

Второй нюанс — пустая дата. Значение '00010101' (1 января 1 года) считается пустой датой, и арифметика с ней формально выполняется, но результат обычно бессмыслен для учёта. Перед расчётами стоит проверять заполненность через ЗначениеЗаполнено(Дата) или сравнение с '00010101000000'.

Также помните, что дата без времени вроде Дата(2026, 3, 15) — это начало дня, то есть 00:00:00. Если исходная дата содержит время (например, дата документа), прибавление дней сохранит это время, что важно при сравнениях и отборах по периодам.

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

Для сдвига даты на дни, часы, минуты или секунды используется обычное сложение: к дате прибавляется количество секунд. В сутках 86400 секунд (24 × 60 × 60), в часе — 3600, в минуте — 60. Формула выглядит так:

ИсходнаяДата = ТекущаяДатаСеанса();

// Прибавить 10 дней

НоваяДата = ИсходнаяДата + 10 * 86400;

// Прибавить 3 часа

НоваяДата = ИсходнаяДата + 3 * 3600;

// Вычесть неделю

НоваяДата = ИсходнаяДата - 7 * 86400;

Для удобочитаемости кода часто объявляют переменную СекундВДне = 86400; или используют константу в общем модуле. Это снижает риск опечатки в «магическом числе» и упрощает сопровождение.

Если нужно прибавить дни к дате документа, но результат должен быть началом дня, дополнительно примените НачалоДня(): НоваяДата = НачалоДня(ДатаДокумента + 5 * 86400);. Это уберёт время, которое хранится в дате документа.

Рабочие и календарные дни — не одно и то же

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

Прибавляем месяцы и годы функцией ДобавитьМесяц

Для сдвига на месяцы и годы сложение секунд не подходит: месяцы имеют разную длину (28–31 день), поэтому универсального числа секунд «в месяце» не существует. Для этого в платформе есть функция ДобавитьМесяц(Дата, КоличествоМесяцев). Второй параметр может быть отрицательным — тогда дата сдвигается назад.

// Прибавить 1 месяц

НоваяДата = ДобавитьМесяц(ИсходнаяДата, 1);

// Прибавить год (12 месяцев)

НоваяДата = ДобавитьМесяц(ИсходнаяДата, 12);

// Вычесть квартал

НоваяДата = ДобавитьМесяц(ИсходнаяДата, -3);

Важная особенность функции — поведение на границе месяца. Если исходная дата — 31 января, то ДобавитьМесяц('20260131', 1) вернёт 29 или 28 февраля (последний день месяца), а не 2–3 марта. Функция «прижимает» результат к последнему дню целевого месяца, если исходного числа в нём нет. Это корректное поведение для расчёта сроков, но его нужно учитывать при проверках.

Для прибавления лет отдельной функции нет — используйте ДобавитьМесяц с количеством, кратным 12. Переход через 29 февраля високосного года обрабатывается аналогично: 29.02.2026 плюс 12 месяцев даст 28.02.2026.

Прибавление к дате в запросах: ДОБАВИТЬКДАТЕ

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

ВЫБРАТЬ

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

ДОБАВИТЬКДАТЕ(Заказы.Дата, МЕСЯЦ, 1) КАК ДатаПлановогоПлатежа,

ДОБАВИТЬКДАТЕ(Заказы.Дата, ГОД, -1) КАК ГодНазад

ИЗ

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

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

При построении отборов по периодам в запросах часто удобнее не сдвигать дату, а использовать виртуальные функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() — они корректно определяют границы дня, месяца или квартала без ручных вычислений.

bsl
НоваяДата = ДобавитьМесяц(НачалоДня(ДатаДокумента), 1) + 5 * 86400; // месяц и 5 дней от даты документа

Сравнение способов и выбор подходящего

Выбор способа зависит от того, что именно нужно прибавить и где выполняется расчёт — в коде или в запросе. Сводная таблица поможет быстро сориентироваться.

ЗадачаСпособ в кодеСпособ в запросе
Прибавить дни / часы / минутыДата + N * 86400 (или 3600, 60)ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, N)
Прибавить месяцыДобавитьМесяц(Дата, N)ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, N)
Прибавить годыДобавитьМесяц(Дата, N * 12)ДОБАВИТЬКДАТЕ(Дата, ГОД, N)
Начало / конец периодаНачалоДня(), КонецМесяца() и др.НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА()
Рабочие дниРасчёт по производственному календарюСоединение с регистром календаря
Маршрут решения

Как выбрать способ

Нужно прибавить дни, часы или минуты в кодеПрибавьте к дате число секунд: N * 86400 для дней
Нужно прибавить месяцы или годыИспользуйте ДобавитьМесяц(Дата, КоличествоМесяцев)
Расчёт выполняется в запросе или СКДИспользуйте ДОБАВИТЬКДАТЕ с нужным типом периода
Считать нужно в рабочих дняхИспользуйте производственный календарь, а не простое сложение

Проверка результата и типичные ошибки

После реализации расчёта обязательно проверьте его на граничных датах: конец месяца, конец года, 29 февраля, пустая дата. Большинство дефектов в работе с датами всплывает именно на таких значениях, а не на «средних» датах месяца.

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

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

Сдвиг с 31.01 на 1 месяц
Норма

Результат — последний день февраля (28 или 29 число)

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

Результат — 2 или 3 марта, либо ошибка преобразования

Прибавление 7 дней к дате документа
Норма

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

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

Дата изменилась на несколько секунд — прибавлено число без пересчёта

Расчёт с пустой датой
Норма

Пустая дата отсечена проверкой ЗначениеЗаполнено

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

В расчётах фигурирует 01.01.0001 и попадает в отчёты

Сравнение рассчитанной даты с периодом
Норма

Дата попадает в отбор запроса корректно

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

Дата «выпадает» из-за несовпадения времени суток

Типичные ошибки
01
Прибавление числа к дате без пересчёта в секунды — дата сдвигается на секунды вместо дней
02
Прибавление «среднего месяца» как 30 * 86400 вместо ДобавитьМесяц — накапливается ошибка в 1–3 дня
03
Игнорирование времени в дате документа — сравнения и отборы по периоду работают неверно
04
Отсутствие проверки пустой даты — в отчёты попадает 01.01.0001
05
Расчёт рабочих дней простым сложением — срок попадает на выходные и праздники

Ещё одна тонкость — функция ТекущаяДата() на клиенте и ТекущаяДатаСеанса() на сервере могут возвращать разные значения из-за часовых поясов и настроек сеанса. Для расчётов сроков в учётных механизмах предпочтительнее ТекущаяДатаСеанса() — она едина для всех пользователей сеанса и не зависит от настроек клиентского компьютера.

Практические сценарии из учётных задач

Срок оплаты по договору

Типовая задача: срок оплаты — 14 календарных дней от даты отгрузки. Расчёт: СрокОплаты = НачалоДня(ДатаОтгрузки) + 14 * 86400;. Если договором предусмотрены рабочие дни, потребуется перебор дней с проверкой по календарю, хранящемуся в регистре сведений.

Период действия договора

Договор заключён на год: ДатаОкончания = ДобавитьМесяц(ДатаНачала, 12) - 86400; — вычитание одних суток даёт последний день действия, если по условиям договор действует «по день, предшествующий дате начала». Уточняйте методику расчёта в постановке задачи: «год с даты» и «по ту же дату следующего года» — разные результаты.

Отчётный период по умолчанию

При открытии отчёта часто подставляют период «последние 30 дней» или «текущий месяц»: ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса()); ДатаОкончания = КонецМесяца(ТекущаяДатаСеанса());. Такой подход надёжнее ручного вычитания секунд, так как не зависит от длины месяца.

Итог

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

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

Часто задаваемые вопросы

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

Прибавьте к дате 86400 секунд: НоваяДата = ИсходнаяДата + 86400;. Если нужно отбросить время, оберните результат в НачалоДня(). В запросе используйте ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 1).

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

Потому что единица измерения при сложении с датой — секунда, а не день. Выражение Дата + 1 сдвигает значение на одну секунду. Для сдвига на день умножьте количество дней на 86400.

Как к дате прибавить год?

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

Что вернёт ДобавитьМесяц для 31 января?

Функция вернёт последний день февраля — 28 или 29 число в зависимости от високосности года. Если исходного числа в целевом месяце нет, результат «прижимается» к его последнему дню, а не переносится на начало следующего месяца.

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

Тем же способом, но со знаком минус: НоваяДата = ИсходнаяДата - 5 * 86400; — вычитание пяти дней. Для месяцев передайте отрицательный параметр: ДобавитьМесяц(Дата, -2) сдвинет дату на два месяца назад.

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

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