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

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

Как в 1С добавить месяц к дате

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

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

Ошибка новичков — прибавлять к дате фиксированное число секунд (например, 30 24 60 * 60) или дней. Такой подход ломается на феврале, на месяцах с 31 днём и при переходе через год. Функция ДобавитьМесяц решает эти проблемы на уровне платформы, но и у неё есть особенности, которые нужно понимать, чтобы не получить неожиданный результат.

Материал ориентирован на разработчиков и администраторов, работающих с кодом на встроенном языке 1С (тонкий клиент, толстый клиент, сервер, веб-клиент — синтаксис везде одинаковый). Разобраны синтаксис, поведение на граничных датах, вычитание месяцев, работа в запросах и типичные ошибки.

Синтаксис функции ДобавитьМесяц

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

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

Функция возвращает значение типа Дата. Время, если оно было задано в исходной дате, сохраняется без изменений. Если передать пустую дату (01.01.0001), результат также будет некорректным для бизнес-логики — это стоит проверять заранее.

bsl
ДатаНачала = Дата(2026, 1, 15);
ДатаОкончания = ДобавитьМесяц(ДатаНачала, 1); // 15.02.2026
ДатаГодНазад = ДобавитьМесяц(ДатаНачала, -12); // 15.01.2023

Важно: функция не изменяет переданную переменную, а возвращает новое значение. Типичная ошибка — вызвать ДобавитьМесяц(Дата, 1) без присваивания результата и ожидать, что переменная Дата изменилась.

Как прибавить один месяц к дате

Самый частый сценарий — сдвинуть дату ровно на один месяц вперёд. Для этого достаточно одной строки кода.

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

ДатаСледующегоПлатежа = ДобавитьМесяц(ДатаДокумента, 1);

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

Порядок действий
  1. 1
    Получите или проверьте исходную дату: она должна быть заполнена и иметь тип Дата
  2. 2
    Вызовите ДобавитьМесяц(ИсходнаяДата, 1) и присвойте результат переменной
  3. 3
    При необходимости приведите результат к началу или концу дня через НачалоДня() или КонецДня()
  4. 4
    Проверьте результат на граничных датах: 31 января, 29 февраля, 31 декабря

Как вычесть месяц из даты

Для сдвига назад отдельной функции не требуется — передайте отрицательное число месяцев. Это удобно при расчёте периодов «за прошлый месяц», дат начала отчётных интервалов и проверки просрочек.

МесяцНазад = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);

КварталНазад = ДобавитьМесяц(ТекущаяДатаСеанса(), -3);

Тот же приём работает в циклах: например, чтобы получить список дат за последние 12 месяцев, достаточно в цикле вызывать ДобавитьМесяц с параметром от -1 до -12.

Особенности на границах месяца и года

Главная тонкость функции — поведение, когда в целевом месяце нет соответствующего числа. Если исходная дата — 31 января, то после прибавления одного месяца результатом будет последний день февраля (28 или 29 число в зависимости от високосности). Платформа не «переносит» лишние дни на март, а ограничивает результат концом месяца.

Это создаёт эффект необратимости: ДобавитьМесяц(ДобавитьМесяц('31.01.2026', 1), -1) вернёт не 31 января, а 29 января (или 30-е в зависимости от промежуточного результата). Если бизнес-логика требует «тот же день месяца», нужна дополнительная проверка и корректировка.

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

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

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

ДобавитьМесяц('15.03.2026', 1)
Норма

15.04.2026 — день сохранился

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

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

ДобавитьМесяц('31.01.2026', 1)
Норма

29.02.2026 — последний день февраля

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

02.03.2026 или 03.03.2026 — значит, используется самописная арифметика дней

ДобавитьМесяц('15.12.2026', 1)
Норма

15.01.2026 — корректный переход через год

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

Год не изменился

Добавление месяца в запросе

В языке запросов 1С функции ДобавитьМесяц нет — там используется функция ДОБАВИТЬКДАТЕ с указанием единицы измерения МЕСЯЦ.

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, 1) КАК ДатаОкончания

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

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

ДобавитьМесяц в коде

Подходит для любой логики на встроенном языке; результат легко проверить и передать дальше параметром

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

Удобна, когда сдвиг нужен прямо в выборке, например для сравнения дат документов; усложняет отладку

Прибавление секунд (30 дней)

Не рекомендуется: месяцы имеют разную длину, результат почти всегда будет неточным

Типичные ошибки и ограничения

Первая распространённая ошибка — прибавление к дате 30 дней через арифметику секунд. Такой код «почти работает» и долго не вызывает подозрений, пока не встречается февраль или месяц с 31 днём.

Вторая ошибка — потеря результата функции из-за отсутствия присваивания. Третья — работа с незаполненной датой: сдвиг пустой даты не вызывает исключения, но даёт бессмысленное значение, которое потом попадает в документы. Четвёртая — ожидание симметрии: «плюс месяц, минус месяц» не всегда возвращает исходную дату из-за обрезания на конце короткого месяца.

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

Ещё одно ограничение: функция работает с типом Дата, а не со строками. Если дата приходит из внешнего источника в виде текста, её сначала нужно преобразовать, например через Дата() с параметрами или функции разбора строки.

Практические примеры

Расчёт даты окончания договора, заключённого на N месяцев:

Функция ДатаОкончанияДоговора(ДатаЗаключения, СрокМесяцев)

Если Не ЗначениеЗаполнено(ДатаЗаключения) Тогда

Возврат Неопределено;

КонецЕсли;

Возврат ДобавитьМесяц(ДатаЗаключения, СрокМесяцев) - 1;

КонецФункции

Вычитание одной секунды в конце переводит дату на конец предыдущего дня — стандартный приём для «договор действует по день накануне годовщины». Формирование периода «прошлый месяц» для отчёта:

ДатаНачала = НачалоМесяца(ДобавитьМесяц(ТекущаяДатаСеанса(), -1));

ДатаОкончания = КонецМесяца(ДатаНачала);

Итог

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

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

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

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

Передайте нужное количество вторым параметром: ДобавитьМесяц(Дата, 6) сдвинет дату на полгода. Отдельного цикла не требуется — функция принимает любое целое число, включая значения больше 12.

Сохраняется ли время при добавлении месяца?

Да, компонент времени остаётся без изменений: если исходная дата 15.03.2026 14:30:00, результат будет 15.04.2026 14:30:00. Если время не нужно, приведите результат через НачалоДня() или КонецДня().

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

Последний день февраля: 29 февраля в високосный год и 28 февраля в обычный. Платформа не переносит «лишние» дни на следующий месяц, поэтому обратный сдвиг может не вернуть исходное число.

Как добавить месяц к дате в запросе 1С?

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

Чем отличается ДобавитьМесяц от прибавления 30 дней?

Месяцы имеют длину от 28 до 31 дня, поэтому прибавление фиксированных 30 дней даёт сдвиг на 1–3 дня относительно «того же числа следующего месяца». ДобавитьМесяц учитывает календарную структуру и сохраняет день месяца, где это возможно.

Работает ли ДобавитьМесяц на клиенте и на сервере?

Да, функция доступна во всех контекстах исполнения встроенного языка: на сервере, в толстом и тонком клиенте, в веб-клиенте, в том числе в управляемых формах с директивами &НаКлиенте и &НаСервере.