Разработка и Конфигурация · 9 мин
Как прибавить месяц к дате в 1С
Как прибавить месяц к дате в 1С: функция ДобавитьМесяц, работа с концом месяца, примеры кода, типичные ошибки и проверка результата в запросах и отчётах.
Прибавить месяц к дате в 1С нельзя простым сложением чисел: длина месяца разная, и операция «дата + 30 дней» почти всегда даст неверный результат. Для этого во встроенном языке существует отдельная функция ДобавитьМесяц(), которая корректно обрабатывает переходы через месяцы, кварталы и годы.
Функция доступна во всех режимах работы: в тонком и толстом клиенте, на сервере, в веб-клиенте и во внешних соединениях. Она одинаково работает как в конфигурациях на управляемых формах (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ЗУП), так и в самописных решениях.
Типичные задачи, где требуется прибавить месяц: расчёт даты окончания договора, формирование периода отчёта, определение срока оплаты по счёту, планирование начислений. Ниже разобраны синтаксис, готовые примеры кода, особенности граничных дат и альтернативные способы — в том числе в языке запросов.
Синтаксис функции ДобавитьМесяц
Функция имеет два параметра. Первый — исходная дата (тип «Дата»), второй — целое число месяцев, которое нужно прибавить. Возвращаемое значение — новая дата, исходная переменная не изменяется.
НоваяДата = ДобавитьМесяц(ИсходнаяДата, КоличествоМесяцев);
Важно понимать, что функция не модифицирует переданную дату «на месте» — результат нужно обязательно присвоить переменной или использовать в выражении. Частая ошибка начинающих разработчиков — вызвать функцию и забыть сохранить результат.
ДатаДоговора = Дата(2026, 1, 15);
ДатаОкончания = ДобавитьМесяц(ДатаДоговора, 12); // 15.01.2026
Сообщить(ДатаОкончания);Второй параметр может быть отрицательным — тогда месяцы вычитаются. Это удобно для расчёта даты начала периода, когда известна дата окончания: например, «три месяца назад от текущей даты».
Базовые примеры: прибавить и вычесть месяц
Разберём несколько практических ситуаций. Первая — расчёт срока оплаты по счёту, когда по условиям договора оплата наступает через один месяц после отгрузки.
ДатаОтгрузки = ДокументОбъект.Дата;
СрокОплаты = ДобавитьМесяц(ДатаОтгрузки, 1);
Вторая ситуация — формирование отчёта за предыдущий месяц. Здесь месяц нужно вычесть, а затем взять границы периода функциями НачалоМесяца и КонецМесяца.
ПрошлыйМесяц = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);
НачалоПериода = НачалоМесяца(ПрошлыйМесяц);
КонецПериода = КонецМесяца(ПрошлыйМесяц);
Третья ситуация — ежемесячное плановое начисление. В цикле дата сдвигается на месяц вперёд, пока не будет достигнут конец срока договора. Здесь важно, чтобы на каждой итерации результат ДобавитьМесяц присваивался той же переменной, иначе цикл станет бесконечным.
- 1Откройте модуль объекта или формы, где нужен расчёт
- 2Получите исходную дату: реквизит документа, ТекущаяДатаСеанса() или параметр
- 3Вызовите ДобавитьМесяц(Дата, 1) и присвойте результат переменной или реквизиту
- 4При необходимости приведите результат к началу или концу месяца
- 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 плюс месяцы), что в документах выглядит как «дата не задана», но проходит проверки сравнения. Перед расчётом проверяйте заполненность функцией ЗначениеЗаполнено().
Третья ошибка — использование ТекущаяДата() в серверных процедурах. В управляемых приложениях серверный вызов этой функции может возвращать дату сервера, а не сеанса пользователя, что при разных часовых поясах даёт сдвиг на день. Для прикладной логики применяйте ТекущаяДатаСеанса().
Проверка результата и смежные функции
Быстро проверить поведение функции можно без изменения конфигурации: откройте любую внешнюю обработку с полем для выполнения кода или используйте консоль кода, если она есть в вашем инструментарии разработчика. Введите выражение с ДобавитьМесяц и посмотрите результат на граничных датах — 31 января, 31 марта, 29 февраля високосного года.
Для полноценной работы с датами полезно знать смежные функции: НачалоМесяца и КонецМесяца возвращают границы периода, ДобавитьМесяц комбинируется с ними в большинстве отчётных задач. Для сдвига на квартал или год используйте ДобавитьМесяц с параметром 3 или 12 — отдельных функций для кварталов во встроенном языке нет.
Как проверить результат
То же число того же месяца через год (15.01.2026 → 15.01.2026)
Дата совпадает с начальной или смещена на случайное число дней
Последний день февраля (28 или 29 число)
2–3 марта — признак сложения дней вместо ДобавитьМесяц
Колонка со сдвинутой датой заполнена для всех строк выборки
NULL или пустые значения — проверьте тип исходного поля
Если результат расчёта записывается в документ, проверяйте его в пользовательском режиме на копии базы: откройте документ, перепроведите и убедитесь, что дата сформировалась ожидаемо. Для регламентных операций (начисления, пени) тестируйте граничные случаи — конец месяца, конец года, високосный февраль.
Что важно запомнить
Для сдвига даты на месяцы используйте ДобавитьМесяц(Дата, ЧислоМесяцев) в коде и ДОБАВИТЬКДАТЕ(..., МЕСЯЦ, ...) в запросах. Результат всегда присваивайте переменной, проверяйте заполненность исходной даты и помните: несуществующий день целевого месяца заменяется его последним днём.
Частые вопросы
Как вычесть месяц из даты в 1С?
Передайте в ДобавитьМесяц отрицательное второе число: ДобавитьМесяц(Дата, -1) вернёт дату на месяц раньше. Тот же приём работает в запросах: ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, -1).
Что вернёт ДобавитьМесяц от 31 января при сдвиге на месяц?
Последний день февраля: 28 число в обычный год и 29 в високосный. Платформа не переносит результат на начало марта — несуществующий день заменяется последним днём целевого месяца.
Можно ли прибавить месяц к дате в отчёте на СКД?
Да, в тексте запроса набора данных используйте ДОБАВИТЬКДАТЕ с типом МЕСЯЦ. Если сдвиг должен зависеть от пользовательских настроек, вынесите количество месяцев в параметр и подставьте его в выражение.
Чем ДобавитьМесяц лучше сложения даты с числом 30?
Сложение с числом сдвигает дату на фиксированное количество секунд и не учитывает реальную длину месяцев: на периоде в несколько месяцев ошибка достигает нескольких дней. ДобавитьМесяц работает с календарной логикой и корректно обрабатывает переходы через год и високосный февраль.
Как получить последний день следующего месяца?
Комбинируйте две функции: КонецМесяца(ДобавитьМесяц(Дата, 1)). Сначала дата сдвигается на месяц вперёд, затем берётся конец получившегося месяца. Это стандартный приём для расчёта сроков «до конца следующего месяца».
Работает ли ДобавитьМесяц с пустой датой?
Функция выполнится без ошибки и вернёт сдвинутую дату от 01.01.0001, что обычно не имеет смысла для прикладной логики. Перед вызовом проверяйте реквизит через ЗначениеЗаполнено() и при пустом значении задавайте поведение явно — например, оставляйте поле пустым или подставляйте текущую дату сеанса.