Разработка и Конфигурация · 8 мин
Как прибавить месяц к дате в 1С
Как прибавить месяц к дате в 1С: функция ДобавитьМесяц, синтаксис, примеры кода, работа с концом месяца, типовые ошибки и проверка результата.
Прибавить месяц к дате в 1С — типовая задача, которая встречается при расчёте сроков оплаты, периодов действия договоров, дат отпусков и отчётных периодов. Во встроенном языке 1С для этого есть штатная функция ДобавитьМесяц(), которая корректно обрабатывает переходы через год и разную длину месяцев.
Главная особенность функции — она работает не простым добавлением 30 или 31 дня, а именно сдвигом по календарным месяцам. Это принципиально: прибавление фиксированного числа секунд или дней к дате даёт ошибки на коротких месяцах и при переходе через февраль.
Ниже разобран синтаксис функции, практические примеры для управляемых и обычных форм, поведение на граничных датах, типовые ошибки и способы проверить результат.
Синтаксис функции ДобавитьМесяц
Функция доступна во встроенном языке 1С:Предприятие 8 на клиенте и на сервере, в тонком и толстом клиенте, а также в веб-клиенте. Отдельного подключения или общего модуля не требуется.
НоваяДата = ДобавитьМесяц(ИсходнаяДата, КоличествоМесяцев);
Параметры функции:
- ИсходнаяДата — значение типа Дата, к которому выполняется сдвиг;
- КоличествоМесяцев — целое число: положительное для сдвига вперёд, отрицательное для сдвига назад.
Функция возвращает новое значение типа Дата. Исходная переменная не изменяется — результат нужно присвоить в переменную или реквизит.
Простые примеры: прибавить и отнять месяц
Базовый сценарий — прибавить один месяц к текущей дате или к дате документа:
ДатаДокумента = Объект.Дата;
ДатаОплаты = ДобавитьМесяц(ДатаДокумента, 1);
Чтобы отнять месяц, передайте отрицательное значение. Это удобно, например, при расчёте начала прошлого отчётного периода:
МесяцНазад = ДобавитьМесяц(ТекущаяДата(), -1);
КварталВперед = ДобавитьМесяц(ТекущаяДата(), 3);
Число месяцев может быть любым целым: 12 даст сдвиг ровно на год, 6 — на полгода. Функция сама корректно обрабатывает переход через 31 декабря, дополнительных проверок года не требуется.
ДатаНачала = Дата(2026, 1, 15);
ДатаОкончания = ДобавитьМесяц(ДатаНачала, 1); // 15.02.2026
ПрошлыйМесяц = ДобавитьМесяц(ДатаНачала, -1); // 15.12.2023Поведение на граничных датах: конец месяца и февраль
Самый частый вопрос — что происходит, если исходная дата приходится на 31 число, а в следующем месяце только 30 дней, или это февраль. В таких случаях функция возвращает последний день целевого месяца: 31 января плюс один месяц даст 28 или 29 февраля в зависимости от високосности года.
Это поведение нужно учитывать при расчёте цепочек дат. Если прибавлять по месяцу последовательно, дата может «сползти»: 31.01 → 28.02 → 28.03, а не 31.03. Для договорных сроков, где важно сохранить исходное число, храните дату начала и каждый раз считайте от неё, а не от предыдущего результата.
Время в составе даты сохраняется без изменений: если исходное значение содержит 14:30:00, результат тоже будет содержать 14:30:00, изменится только календарная часть.
Прибавление месяца в запросах 1С
В языке запросов функции ДобавитьМесяц нет. Для сдвига дат в запросе используется функция ДОБАВИТЬКДАТЕ с указанием типа сдвига МЕСЯЦ:
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Реализация.Дата, МЕСЯЦ, 1) КАК ДатаОплаты
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Тип сдвига может быть СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Для вычитания используйте отрицательное число. Учтите, что вычисления в запросе выполняются на сервере СУБД, и на больших выборках сложные выражения с датами могут влиять на производительность — по возможности выносите расчёт границ периода в параметры запроса.
Где выполнять сдвиг даты
Подходит для расчёта одной даты перед запросом или в обработчиках. Гибко, легко отладить.
Подходит, когда сдвиг нужен для каждой строки выборки. Неудобен для сложной логики с условиями.
Оптимально для границ периода: дата считается один раз в коде и передаётся в запрос.
Практические сценарии использования
Срок оплаты по договору
Если по условиям договора оплата наступает через месяц после отгрузки, дата считается в момент записи документа и сохраняется в реквизит, а не вычисляется каждый раз заново — это защищает от расхождений при изменении логики.
Период по умолчанию в отчёте
Для отчёта за прошлый месяц границы удобно считать так: начало — начало месяца, полученного сдвигом назад, конец — конец того же месяца. Функции НачалоМесяца() и КонецМесяца() сочетаются с ДобавитьМесяц() без дополнительных преобразований.
ПрошлыйМесяц = ДобавитьМесяц(ТекущаяДата(), -1);
ДатаНачала = НачалоМесяца(ПрошлыйМесяц);
ДатаОкончания = КонецМесяца(ПрошлыйМесяц);
Расчёт даты окончания договора
Если договор действует N месяцев с даты начала, дату окончания считают как ДобавитьМесяц(ДатаНачала, N) - 1 — вычитание одной секунды даёт конец предыдущего дня, что корректно для формулировки «по 14.02 включительно». Проверяйте, какой вариант ожидает учётная политика: в некоторых конфигурациях датой окончания считается ровно та же календарная дата.
- 1Определите исходную дату: реквизит документа, ТекущаяДата() или параметр
- 2Вызовите ДобавитьМесяц(Дата, 1) и сохраните результат в переменную или реквизит
- 3При необходимости приведите результат к началу или концу месяца функциями НачалоМесяца() и КонецМесяца()
- 4Проверьте результат на граничных датах: 31 января, 31 марта, високосный февраль
Типовые ошибки и как их избежать
Первая распространённая ошибка — попытка прибавить месяц арифметикой: Дата + 30 * 86400. На части месяцев результат совпадёт случайно, что маскирует ошибку до попадания на февраль или 31-дневный месяц.
Вторая ошибка — передача в функцию строки или пустой даты. Если реквизит не заполнен, результатом будет некорректная дата, и логика сравнения периодов начнёт работать непредсказуемо. Перед вызовом проверяйте заполненность функцией ЗначениеЗаполнено().
Третья ошибка — последовательное прибавление месяца к результату предыдущего шага в цикле. Из-за схлопывания 31 числа в конец короткого месяца накапливается смещение. Считайте каждую дату от исходной: ДобавитьМесяц(ДатаНачала, НомерШага).
Проверка результата
Отладить расчёт проще всего через окно «Вычислить выражение» (Shift+F9) в конфигураторе: остановитесь в точке останова и вычислите ДобавитьМесяц(Дата(2026,1,31), 1) — результат должен быть 29.02.2026 для високосного года.
Для прикладных проверок используйте контрольные пары дат: начало месяца должно сдвигаться на начало следующего, 15-е число — на 15-е, а 31-е — на последний день целевого месяца. Если хотя бы одна пара не совпадает с ожиданием, ищите место, где вместо функции используется арифметика с секундами.
Как проверить результат
Последний день февраля (28 или 29)
02.03 или 03.03 — признак сложения дней
15.04 того же года
Смещение на день вперёд или назад
31.01 следующего года
Год не изменился или дата в марте
Что важно запомнить
Для сдвига даты на месяц используйте ДобавитьМесяц(Дата, 1), для запросов — ДОБАВИТЬКДАТЕ с типом МЕСЯЦ. Функция корректно обрабатывает конец месяца и переход через год, а ручное сложение дней приводит к ошибкам.
Частые вопросы
Как отнять месяц от даты в 1С?
Передайте в функцию отрицательное число: ДобавитьМесяц(Дата, -1). Аналогично можно отнять любое количество месяцев, например -3 для квартала назад.
Что вернёт ДобавитьМесяц для 31 января?
Последний день февраля: 28 число в обычный год и 29 в високосный. Функция не переносит излишек дней на март, а «схлопывает» дату до конца целевого месяца.
Как прибавить месяц к дате в запросе 1С?
Используйте конструкцию ДОБАВИТЬКДАТЕ(Поле, МЕСЯЦ, 1). Если сдвиг нужен только для границы периода, эффективнее вычислить дату в коде через ДобавитьМесяц и передать её параметром.
Сохраняется ли время при прибавлении месяца?
Да, время в составе даты не изменяется — сдвигается только календарная часть. Если время не нужно, приведите результат функцией НачалоДня() или КонецДня().
Можно ли прибавить месяц, сложив 30 дней?
Технически выражение Дата + 2592000 выполнится, но результат будет смещён на месяцах длиной не 30 дней. Для календарного сдвига всегда используйте ДобавитьМесяц.
Как получить дату «через месяц минус один день»?
Вычтите одну секунду из результата: ДобавитьМесяц(ДатаНачала, 1) - 1. Получится конец дня, предшествующего той же календарной дате следующего месяца, что удобно для сроков действия договоров.