Разработка и Конфигурация · 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. Это важно для документов, где время имеет значение.
// Добавить один год к дате
НоваяДата = ДобавитьМесяц(ИсходнаяДата, 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Определите, где нужен расчёт: код, запрос или форма
- 2Для кода используйте ДобавитьМесяц(Дата, 12), для запроса — ДОБАВИТЬКДАТЕ(Дата, ГОД, 1)
- 3Решите, нужно ли вычитать одну секунду для срока «по день накануне»
- 4Проверьте результат на граничных датах: 29.02, 31.12, 31 января
- 5Убедитесь, что исходная дата не пустая (не 01.01.0001)
Проверка результата и граничные случаи
После внедрения расчёта протестируйте его на датах, которые чаще всего дают сбой. Ниже контрольные точки для самопроверки:
| Исходная дата | ДобавитьМесяц(Дата, 12) | Комментарий |
|---|---|---|
| 15.03.2026 | 15.03.2026 | Обычный случай |
| 29.02.2026 | 28.02.2026 | Високосный год, 29.02.2026 не существует |
| 31.12.2026 | 31.12.2026 | Переход через год |
| 01.01.0001 | 01.01.0002 | Пустая дата — результат формально верен, но бессмыслен |
Отдельно проверьте пустые даты. Значение 01.01.0001 — это «пустая» дата в 1С, и добавление года к ней не вызовет ошибки, но даст 01.01.0002, что почти наверняка не то, что нужно. Перед расчётом добавляйте проверку: Если ЗначениеЗаполнено(ИсходнаяДата) Тогда ....
Как проверить результат
Получили 10.06.2026
Дата сдвинулась на день-два или время обнулилось
Получили 28.02 следующего года
Ошибка исполнения или несуществующая дата
Расчёт пропущен или выдано предупреждение
В реквизит записалась дата 0002 года
Время сохранилось в результате
Время сброшено в 00:00:00 без необходимости
Типичные ошибки
Ещё одна частая ситуация — разработчик вычисляет год вручную через Год(Дата) + 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 декабря. Для срока «по день накануне» вычитайте одну секунду.