Разработка и Конфигурация · 7 мин
Как вычесть месяц из даты в 1С
Как вычесть месяц из даты в 1С: функция ДобавитьМесяц с отрицательным значением, запросы ДОБАВИТЬКДАТЕ, обработка конца месяца и типичные ошибки.
Вычитание месяца из даты — типовая задача при разработке отчётов, расчёте периодов в документах и формировании выборок. Во встроенном языке 1С для этого предусмотрена функция ДобавитьМесяц(), которая принимает отрицательное второе значение, а в языке запросов — конструкция ДОБАВИТЬКДАТЕ. Напрямую отнимать 30 дней нельзя: длина месяцев различается, и такой подход даст ошибку в одну-три даты.
Главная сложность операции — поведение на границах месяца. Если из 31 марта вычесть один месяц, результатом будет 28 (или 29) февраля, а не несуществующее 31 февраля. Это нужно учитывать при расчёте периодов оплаты, сроков действия договоров и границ отчётов. Ниже разобраны рабочие способы для встроенного языка, языка запросов и типовых сценариев в пользовательском режиме.
Функция ДобавитьМесяц с отрицательным значением
Основной инструмент — функция встроенного языка ДобавитьМесяц(ИсходнаяДата, ЧислоМесяцев). Чтобы получить дату на месяц раньше, передайте вторым параметром отрицательное число. Функция возвращает новое значение типа «Дата», исходная переменная не изменяется.
ДатаОтгрузки = Дата(2026, 3, 15);
МесяцНазад = ДобавитьМесяц(ДатаОтгрузки, -1);
// Результат: 15.02.2026
КварталНазад = ДобавитьМесяц(ДатаОтгрузки, -3);
// Результат: 15.12.2023
Функция корректно работает через границу года: при вычитании месяца из января получится декабрь предыдущего года. Время в составе даты сохраняется без изменений — если исходная дата содержала 14:30:00, результат тоже будет содержать это время.
МесяцНазад = ДобавитьМесяц(ТекущаяДата(), -1);Как 1С обрабатывает конец месяца
Ключевой нюанс — поведение, когда в целевом месяце нет соответствующего числа. Если исходная дата — 31 марта, а вы вычитаете один месяц, функция вернёт последний день февраля (28 или 29 число в високосный год). Аналогично 31 мая минус месяц даст 30 апреля.
Это поведение не всегда симметрично. Операция «прибавить месяц, затем вычесть месяц» может не вернуть исходную дату: 31 января → 28 февраля → 28 марта, а не 31 марта. Если бизнес-логика требует сохранять «последний день месяца», проверяйте исходную дату функцией КонецМесяца() и при совпадении применяйте её же к результату.
Если ИсходнаяДата = КонецМесяца(ИсходнаяДата) Тогда
Результат = КонецМесяца(ДобавитьМесяц(ИсходнаяДата, -1));
Иначе
Результат = ДобавитьМесяц(ИсходнаяДата, -1);
КонецЕсли;
Вычитание месяца в запросе
В языке запросов используется функция ДОБАВИТЬКДАТЕ(Дата, Тип, Количество). Второй параметр — единица измерения (МЕСЯЦ), третий — количество, которое может быть отрицательным. Это удобно для фильтрации данных за предыдущий месяц без выгрузки в код.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -1) КАК МесяцНазад
ПОМЕСТИТЬ Границы
;
ВЫБРАТЬ
Продажи.Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -1), МЕСЯЦ),
КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -1), МЕСЯЦ)) КАК Продажи
Обратите внимание: ДОБАВИТЬКДАТЕ ведёт себя на границе месяца аналогично встроенной функции — при отсутствии числа берётся последний день месяца. Для получения аккуратных границ периода комбинируйте её с НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, как показано в примере.
Вычитание месяца без программирования
В пользовательском режиме типовых конфигураций отдельной кнопки «минус месяц» обычно нет, но задача решается штатными средствами. В полях ввода даты работает клавиатурная навигация: клавиши Page Up и Page Down сдвигают дату на месяц назад и вперёд соответственно. Это самый быстрый способ изменить дату документа или отбора.
В отчётах на СКД (большинство отчётов в «1С:Бухгалтерии», «1С:Управление торговлей») период задаётся стандартными вариантами: «Прошлый месяц», «Произвольный период». Если нужен произвольный сдвиг, выберите произвольный период и установите границы вручную или через календарь. В настройках отчёта период можно сохранить в варианте, чтобы не вводить повторно.
- 1Откройте отчёт и нажмите «Показать настройки» или используйте поле периода в шапке
- 2Выберите вариант «Прошлый месяц» либо «Произвольный период»
- 3При произвольном периоде установите начало и конец нужного месяца через календарь
- 4Сформируйте отчёт и проверьте, что данные попали в ожидаемые границы
Практические сценарии и проверка результата
Типовые применения: расчёт даты начала отсчёта просрочки, формирование отчёта «месяц к месяцу», определение периода действия скидки, выборка документов за предыдущий месяц для сверки. Во всех случаях сначала определите, что именно нужно — та же календарная дата месяцем ранее, начало прошлого месяца или его конец: это три разных результата.
Для проверки корректности удобно использовать контрольные точки на границах: 31 марта, 31 января, 29 февраля високосного года. Прогоните расчёт на этих датах и убедитесь, что поведение соответствует ожиданиям бизнес-логики, а не просто «не падает с ошибкой».
Как проверить результат
15.02 того же года
Дата смещена на 1–3 дня — вероятно, вычитались дни
28 или 29 февраля (последний день месяца)
Ошибка или 31 февраля — некорректный алгоритм
15.12 предыдущего года
Год не изменился — ошибка в логике
Типичные ошибки и ограничения
Самая частая ошибка — вычитание фиксированного числа секунд или дней. Вторая по частоте — забыть, что функция возвращает новое значение, а не меняет переменную: код вида ДобавитьМесяц(Дата, -1); без присваивания результата ничего не делает. Третья — ожидание симметрии операций на границах месяца, о которой сказано выше.
В запросах распространённая проблема — попытка вычесть месяц из строкового представления даты или из поля составного типа. Убедитесь, что выражение имеет тип «Дата», иначе запрос завершится с ошибкой либо вернёт NULL.
Частые вопросы
Как вычесть несколько месяцев сразу?
Передайте в ДобавитьМесяц нужное отрицательное число: ДобавитьМесяц(Дата, -6) вычтет полгода. В запросе аналогично — ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, -6).
Сохранится ли время при вычитании месяца?
Да, компонент времени (часы, минуты, секунды) не изменяется. Если нужен сброс времени, дополнительно примените НачалоДня() или КонецДня().
Как получить начало предыдущего месяца?
Используйте вложенные функции: НачалоМесяца(ДобавитьМесяц(Дата, -1)). В запросе — НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, -1), МЕСЯЦ).
Работает ли ДобавитьМесяц на клиенте?
Да, функция доступна и на тонком, и на веб-клиенте, поэтому её можно использовать в формах без серверного вызова.
Что вернёт функция из даты 31 марта?
Последний день февраля: 28 февраля в обычный год и 29 февраля в високосный. Если нужна именно дата «31 число месяцем ранее», такого числа не существует — определите правило обработки этого случая заранее.
Что важно запомнить
Для вычитания месяца используйте ДобавитьМесяц(Дата, -1) в коде и ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, -1) в запросе. Не вычитайте фиксированные дни, помните про поведение на границах месяца и проверяйте результат на датах 29–31 числа.