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

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

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

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

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

Функция доступна во всех режимах работы: в тонком и толстом клиенте, на сервере, в веб-клиенте и во внешних соединениях. Она одинаково работает как в конфигурациях на управляемых формах (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ЗУП), так и в самописных решениях.

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

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

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

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

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

bsl
ДатаДоговора = Дата(2026, 1, 15);
ДатаОкончания = ДобавитьМесяц(ДатаДоговора, 12); // 15.01.2026
Сообщить(ДатаОкончания);

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

Базовые примеры: прибавить и вычесть месяц

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

ДатаОтгрузки = ДокументОбъект.Дата;

СрокОплаты = ДобавитьМесяц(ДатаОтгрузки, 1);

Вторая ситуация — формирование отчёта за предыдущий месяц. Здесь месяц нужно вычесть, а затем взять границы периода функциями НачалоМесяца и КонецМесяца.

ПрошлыйМесяц = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);

НачалоПериода = НачалоМесяца(ПрошлыйМесяц);

КонецПериода = КонецМесяца(ПрошлыйМесяц);

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

Как прибавить месяц к дате документа
  1. 1
    Откройте модуль объекта или формы, где нужен расчёт
  2. 2
    Получите исходную дату: реквизит документа, ТекущаяДатаСеанса() или параметр
  3. 3
    Вызовите ДобавитьМесяц(Дата, 1) и присвойте результат переменной или реквизиту
  4. 4
    При необходимости приведите результат к началу или концу месяца
  5. 5
    Запишите объект и проверьте значение в пользовательском режиме

Особенность граничных дат: 31 число и февраль

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

Результат = ДобавитьМесяц(Дата(2026, 1, 31), 1); // 29.02.2026

Результат = ДобавитьМесяц(Дата(2026, 3, 31), -1); // 29.02.2026

Из-за этого сдвиг «туда и обратно» не всегда возвращает исходную дату: 31 января + 1 месяц − 1 месяц даст 29 января, а не 31. Если бизнес-логика требует «такого же числа», а при его отсутствии — конца месяца, нужна дополнительная проверка.

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

КонецСрока = КонецМесяца(ДобавитьМесяц(ДатаНачала, СрокВМесяцах) - 1);

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

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

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(Реализация.Дата, МЕСЯЦ, 1) КАК СрокОплаты

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

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

Где выполнять сдвиг даты

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

Подходит для расчётов в модулях, проведении документов, обработках. Гибкая постобработка результата, но требует выгрузки данных из запроса

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

Подходит для отчётов, динамических списков и СКД. Сдвиг выполняется на сервере СУБД, без лишнего обхода выборки

Параметры периода в СКД

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

Типичные ошибки и как их избежать

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

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

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

Типичные ошибки
01
Вызов ДобавитьМесяц без присваивания результата — дата остаётся прежней
02
Сложение даты с числом дней вместо ДобавитьМесяц — ошибка накапливается из-за разной длины месяцев
03
Расчёт от незаполненной даты — получается 01.01.0001 со сдвигом, проверки сравнения ведут себя неожиданно
04
Цепочка «плюс месяц, минус месяц» от 31 числа — исходная дата не восстанавливается
05
ТекущаяДата() на сервере вместо ТекущаяДатаСеанса() — сдвиг на сутки при разных часовых поясах

Проверка результата и смежные функции

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

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

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

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

Дата окончания договора при сроке 12 месяцев
Норма

То же число того же месяца через год (15.01.2026 → 15.01.2026)

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

Дата совпадает с начальной или смещена на случайное число дней

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

Последний день февраля (28 или 29 число)

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

2–3 марта — признак сложения дней вместо ДобавитьМесяц

Расчёт в запросе через ДОБАВИТЬКДАТЕ
Норма

Колонка со сдвинутой датой заполнена для всех строк выборки

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

NULL или пустые значения — проверьте тип исходного поля

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

Итог

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

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

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

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

Передайте в ДобавитьМесяц отрицательное второе число: ДобавитьМесяц(Дата, -1) вернёт дату на месяц раньше. Тот же приём работает в запросах: ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, -1).

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

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

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

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

Чем ДобавитьМесяц лучше сложения даты с числом 30?

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

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

Комбинируйте две функции: КонецМесяца(ДобавитьМесяц(Дата, 1)). Сначала дата сдвигается на месяц вперёд, затем берётся конец получившегося месяца. Это стандартный приём для расчёта сроков «до конца следующего месяца».

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

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