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

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

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

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

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

Важно понимать, что простое прибавление 365 дней — ошибка. Из-за високосных лет такая арифметика даёт смещение на один день, а при работе с 29 февраля может вообще привести к неверному результату. Правильный подход — использовать календарные функции платформы, которые знают о структуре календаря.

Ниже разобраны все рабочие способы: встроенный язык, язык запросов, работа с типом «Дата», обработка граничных случаев вроде 29 февраля и типичные ошибки, которые приводят к неверным срокам в документах и отчётах.

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

Штатный способ прибавить год к дате в 1С — функция ДобавитьМесяц(<Дата>, <ЧислоМесяцев>). Чтобы прибавить один год, передайте вторым параметром 12, два года — 24 и так далее. Функция возвращает новое значение типа «Дата», исходная переменная не изменяется.

ДатаНачала = '20260315';

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

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

// Прибавить два года

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

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

Функция работает и в обратную сторону: чтобы вычесть год, передайте отрицательное число месяцев. Например, ДобавитьМесяц(Дата, -12) вернёт дату ровно год назад. Это удобно для расчёта периодов отбора в отчётах и анализа задолженности.

Обратите внимание: ДобавитьМесяц сохраняет время, если оно есть в исходной дате. Дата 15.03.2026 14:30:00 после прибавления года останется со временем 14:30:00. Если для документа нужно начало дня, дополнительно примените НачалоДня() или КонецДня().

bsl
ДатаОкончанияДоговора = ДобавитьМесяц(ДатаЗаключения, 12); // +1 год

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

Первая ошибка начинающих разработчиков — арифметика вида Дата + 365 * 86400. В 1С даты складываются в секундах, поэтому такой код формально работает, но результат неверен. Високосный год содержит 366 дней, и при переходе через 29 февраля дата смещается на сутки назад.

Пример: к дате 15.03.2023 прибавили 365 дней и получили 14.03.2026 вместо 15.03.2026, потому что между этими датами есть 29 февраля 2026 года. Для договора или гарантийного срока такая ошибка может иметь юридические последствия: срок будет посчитан неверно.

Вторая причина избегать ручной арифметики — семантика кода. Запись ДобавитьМесяц(Дата, 12) читается однозначно: «прибавить год». Запись с умножением секунд требует от коллег расшифровки и провоцирует ошибки при доработке.

Особый случай: 29 февраля

Прибавление года к дате 29 февраля високосного года — классический граничный случай. В невисокосном году 29 февраля не существует, и ДобавитьМесяц в этой ситуации возвращает последний день февраля — 28 февраля.

Дата = '20260229'; // 29 февраля, високосный год

Результат = ДобавитьМесяц(Дата, 12);

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

Такое поведение соответствует общепринятой календарной логике, но не всегда совпадает с бизнес-ожиданиями. Например, если договор заключён 29 февраля, юридически датой окончания через год может считаться и 28 февраля, и 1 марта — это определяется условиями договора, а не платформой.

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

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

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

ВЫБРАТЬ

Договоры.Ссылка КАК Договор,

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

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

ИЗ

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

Параметр количества может быть и выражением, и параметром запроса — например, ДОБАВИТЬКДАТЕ(Дата, ГОД, &ЧислоЛет). Это удобно для отчётов, где пользователь сам задаёт срок. Для вычитания передайте отрицательное число: ДОБАВИТЬКДАТЕ(Дата, ГОД, -1).

Учтите ограничение: в языке запросов нельзя комбинировать функции дат произвольно и нет аналога ДобавитьМесяц с автоматической корректировкой конца месяца во всех нюансах. Если логика сложная, надёжнее вычислить даты на встроенном языке и передать их в запрос параметрами.

Проверка результата и тип данных

Перед расчётом убедитесь, что значение действительно имеет тип «Дата» и заполнено. Пустая дата в 1С — это '00010101', и прибавление года к ней даст 01.01.0002 — формально корректный, но бессмысленный для учёта результат. Проверяйте заполненность через ЗначениеЗаполнено(Дата).

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

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

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

Год результата
Норма

Увеличился ровно на заданное число лет

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

Год тот же или смещён — проверьте второй параметр функции

День и месяц
Норма

Совпадают с исходной датой

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

День смещён на 1 — вероятно, использовалось сложение секунд через високосный год

Исходная дата 29.02
Норма

Результат 28.02 невисокосного года и это устраивает бизнес-логику

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

Ожидалось 1 марта, но код этого не учитывает

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

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

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

В данных появилась дата 01.01.0002

Практические сценарии применения

Срок действия договора

Типовая задача: при записи договора автоматически заполнить дату окончания как дата заключения плюс один год. Расчёт размещают в обработчике ПередЗаписью или в процедуре заполнения по кнопке, чтобы пользователь мог скорректировать значение вручную.

Если ЗначениеЗаполнено(ДатаЗаключения) Тогда

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

// минус 1 секунда: окончание — конец дня накануне годовщины

КонецЕсли;

Обратите внимание на приём с вычитанием одной секунды: если договор «действует год с 15.03.2026», то последним днём действия обычно считается 14.03.2026, а не 15.03.2026. Какой вариант правильный — определяет методология учёта, зафиксируйте её в комментарии.

Период отбора в отчёте

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

Напоминания и регламентные задания

Для уведомлений о приближении окончания срока (договора, сертификата, поверки) регламентное задание сравнивает текущую дату с вычисленной датой окончания. Храните дату окончания в реквизите, вычисленную один раз при записи, а не вычисляйте её каждый раз в запросе — это упрощает индексирование и отборы.

Типичные ошибки
01
Прибавление 365 дней в секундах — смещение на сутки через високосный год
02
Расчёт от пустой даты — в данных появляется 01.01.0002
03
Игнорирование случая 29 февраля — неожиданное 28.02 там, где бизнес ждёт 1 марта
04
Путаница границ срока: годовщина включена в срок или нет — дата окончания различается на день
05
Потеря времени: начало дня вместо исходного времени или наоборот
06
Использование ДОБАВИТЬКДАТЕ с типом ГОД на платформе ниже 8.3.6 — ошибка запроса

Сравнение способов и ограничения

Выбор способа зависит от контекста: встроенный язык, запрос или ручной расчёт. Ниже — сопоставление по ключевым критериям.

СпособГде применяетсяВисокосные годыОграничения
ДобавитьМесяц(Дата, 12)Встроенный язык, клиент и серверКорректно, 29.02 → 28.02Нет отдельного типа «год», только через месяцы
ДОБАВИТЬКДАТЕ(Дата, ГОД, 1)Язык запросов, СКДКорректноТребуется платформа 8.3.6 и выше
Дата + 365*86400Не рекомендуетсяОшибка на суткиНе использовать в прикладном коде
Маршрут решения

Как выбрать способ

Расчёт в модуле объекта, форме или общем модулеИспользуйте ДобавитьМесяц(Дата, 12) с проверкой заполненности даты
Нужно вычислить дату прямо в запросе или СКДПрименяйте ДОБАВИТЬКДАТЕ(Дата, ГОД, 1), для старых платформ — МЕСЯЦ, 12
Исходная дата может быть 29 февраля и важна точная дата окончанияДобавьте явную проверку этого случая и согласуйте правило с методологией учёта
Встретили сложение дат в секундах в старом кодеЗамените на ДобавитьМесяц и проверьте ранее рассчитанные сроки

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

Итог

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

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

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

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

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

Что вернёт ДобавитьМесяц для даты 29 февраля?

Для 29.02 високосного года прибавление 12 месяцев даст 28 февраля следующего невисокосного года. Если прикладная логика требует 1 марта, реализуйте эту корректировку отдельной проверкой.

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

Передайте отрицательное число месяцев: ДобавитьМесяц(Дата, -12). В запросе — ДОБАВИТЬКДАТЕ(Дата, ГОД, -1).

Почему после расчёта получилась дата 01.01.0002?

Исходная дата была пустой (01.01.0001), и к ней прибавили год. Проверяйте заполненность через ЗначениеЗаполнено() перед вычислением и не выполняйте расчёт для пустых значений.

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

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

Как прибавить год к текущей дате?

Получите текущую дату функцией ТекущаяДата() (на клиенте) или ТекущаяДатаСеанса() (на сервере, предпочтительно) и передайте её в ДобавитьМесяц: ДобавитьМесяц(ТекущаяДатаСеанса(), 12).