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

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

Как добавить год к дате в 1С

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

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

Главная ловушка при ручном сложении — 29 февраля. Если прибавить к дате 29.02.2026 фиксированные 365 дней, получится 28.02.2026, а не 29.02.2026 (которого не существует). Функция ДобавитьМесяц решает это автоматически: она работает с календарными месяцами, а не с секундами, и возвращает корректную дату с учётом реального календаря.

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

Почему нельзя просто прибавить 365 дней

Дата в 1С хранится с точностью до секунды, и технически к ней можно прибавить число секунд: НоваяДата = ИсходнаяДата + 365 24 60 * 60;. Такой код выполнится без ошибки, но результат будет неверным в ряде случаев. Год длится 365 или 366 дней, поэтому «год спустя» — это не фиксированное число секунд, а календарное понятие.

Пример ошибки: к дате 01.03.2023 прибавили 365 дней и получили 01.03.2026 — верно. Но к дате 01.03.2026 прибавили 365 дней и получили 29.02.2026 вместо 01.03.2026, потому что 2026 год високосный. В договорах, гарантиях и регламентных расчётах такая ошибка на один день может быть критичной.

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

Основной способ: функция ДобавитьМесяц

Функция ДобавитьМесяц(Дата, ЧислоМесяцев) возвращает дату, смещённую на указанное количество месяцев. Год — это 12 месяцев, поэтому добавление года выглядит так:

ИсходнаяДата = Дата(2026, 3, 15);

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

// Результат: 15.03.2026

Функция корректно работает с переходом через конец года и с 31-м числом: ДобавитьМесяц(Дата(2026, 1, 31), 1) вернёт 29.02.2026, а не несуществующее 31 февраля. Та же логика применяется при добавлении года к 29 февраля: ДобавитьМесяц(Дата(2026, 2, 29), 12) даст 28.02.2026.

Время даты (часы, минуты, секунды) при этом сохраняется. Если к 15.03.2026 14:30:00 добавить 12 месяцев, получится 15.03.2026 14:30:00. Это важно для документов, где время имеет значение.

bsl
// Добавить один год к дате
НоваяДата = ДобавитьМесяц(ИсходнаяДата, 12);

// Добавить несколько лет
ТриГода = ДобавитьМесяц(ИсходнаяДата, 36);

// Вычесть год (отрицательное значение)
ГодНазад = ДобавитьМесяц(ИсходнаяДата, -12);

Добавление года в запросе

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

ВЫБРАТЬ

Договоры.ДатаЗаключения,

ДОБАВИТЬКДАТЕ(Договоры.ДатаЗаключения, ГОД, 1) КАК ДатаОкончания

ИЗ

Справочник.ДоговорыКонтрагентов КАК Договоры

Тип ГОД здесь эквивалентен сдвигу на 12 месяцев с той же календарной логикой. Это удобно, когда дату окончания нужно вычислить прямо в отчёте или динамическом списке, не храня её в базе. Учтите, что если поле даты может быть пустым (01.01.0001), результат сдвига тоже будет малоосмысленным — добавьте проверку через ВЫБОР КОГДА ... ТОГДА.

Добавление года на форме и в пользовательском режиме

Расчёт в поле формы

Если нужно автоматически заполнять дату окончания при вводе даты начала, используйте обработчик события ПриИзменении поля ввода:

&НаКлиенте

Процедура ДатаНачалаПриИзменении(Элемент)

Объект.ДатаОкончания = ДобавитьМесяц(Объект.ДатаНачала, 12) - 1;

КонецПроцедуры

Обратите внимание на - 1 (минус одна секунда): часто срок действия должен заканчиваться за день до годовщины. Договор, заключённый 15.03.2026 сроком на год, обычно действует по 14.03.2026 включительно, а не по 15.03.2026. Вычитание одной секунды от полуночи даёт 23:59:59 предыдущего дня. Какой вариант правильный — определяется условиями вашего учёта, а не платформой.

Без программирования

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

Порядок действий
  1. 1
    Определите, где нужен расчёт: код, запрос или форма
  2. 2
    Для кода используйте ДобавитьМесяц(Дата, 12), для запроса — ДОБАВИТЬКДАТЕ(Дата, ГОД, 1)
  3. 3
    Решите, нужно ли вычитать одну секунду для срока «по день накануне»
  4. 4
    Проверьте результат на граничных датах: 29.02, 31.12, 31 января
  5. 5
    Убедитесь, что исходная дата не пустая (не 01.01.0001)

Проверка результата и граничные случаи

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

Исходная датаДобавитьМесяц(Дата, 12)Комментарий
15.03.202615.03.2026Обычный случай
29.02.202628.02.2026Високосный год, 29.02.2026 не существует
31.12.202631.12.2026Переход через год
01.01.000101.01.0002Пустая дата — результат формально верен, но бессмыслен

Отдельно проверьте пустые даты. Значение 01.01.0001 — это «пустая» дата в 1С, и добавление года к ней не вызовет ошибки, но даст 01.01.0002, что почти наверняка не то, что нужно. Перед расчётом добавляйте проверку: Если ЗначениеЗаполнено(ИсходнаяДата) Тогда ....

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

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

Обычная дата, например 10.06.2026
Норма

Получили 10.06.2026

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

Дата сдвинулась на день-два или время обнулилось

29 февраля високосного года
Норма

Получили 28.02 следующего года

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

Ошибка исполнения или несуществующая дата

Пустая дата 01.01.0001
Норма

Расчёт пропущен или выдано предупреждение

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

В реквизит записалась дата 0002 года

Время исходной даты 14:30:00
Норма

Время сохранилось в результате

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

Время сброшено в 00:00:00 без необходимости

Типичные ошибки

Типичные ошибки
01
Сложение через секунды: Дата + 365*86400 — ошибка на один день при переходе через 29 февраля
02
Попытка использовать несуществующую функцию ДобавитьГод() — во встроенном языке её нет, будет ошибка компиляции
03
Расчёт без проверки пустой даты — в реквизит попадает 01.01.0002 вместо осмысленного значения
04
Забытое вычитание секунды для срока «по день накануне» — договор формально действует на день дольше
05
Путаница синтаксиса: ДобавитьМесяц из кода переносят в запрос, хотя там нужна ДОБАВИТЬКДАТЕ

Ещё одна частая ситуация — разработчик вычисляет год вручную через Год(Дата) + 1 и собирает дату обратно через Дата(Год + 1, Месяц(Дата), День(Дата)). Такой код упадёт с ошибкой на 29 февраля, потому что Дата(2026, 2, 29) недопустима. ДобавитьМесяц избавляет от необходимости обрабатывать этот случай самостоятельно.

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

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

Есть ли в 1С функция ДобавитьГод?

Нет, во встроенном языке такой функции нет. Год добавляется через ДобавитьМесяц(Дата, 12). В языке запросов есть универсальная функция ДОБАВИТЬКДАТЕ, где тип сдвига можно указать как ГОД.

Что произойдёт, если добавить год к 29 февраля?

ДобавитьМесяц(Дата(2026,2,29), 12) вернёт 28.02.2026, поскольку 29 февраля в следующем году не существует. Функция автоматически берёт последний день месяца, ошибки не будет.

Как вычесть год из даты?

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

Как получить срок действия «по день накануне годовщины»?

Вычтите одну секунду из результата: ДобавитьМесяц(ДатаНачала, 12) - 1. Для даты без времени это даст 23:59:59 предыдущего дня. Если нужна «чистая» дата без времени, дополнительно примените НачалоДня() к исходной дате.

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

Да, часы, минуты и секунды сохраняются без изменений: к 10.05.2026 14:30:00 добавление 12 месяцев даст 10.05.2026 14:30:00. Если время не нужно, обрежьте его функцией НачалоДня().

Как добавить год к дате в СКД или отчёте?

В вычисляемом поле СКД на языке выражений доступна функция ДобавитьМесяц(Дата, 12). Если поле вычисляется на уровне запроса, используйте ДОБАВИТЬКДАТЕ(Поле, ГОД, 1) прямо в тексте запроса набора данных.

Итог

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

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