Разработка и Конфигурация · 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. Если для документа нужно начало дня, дополнительно примените НачалоДня() или КонецДня().
ДатаОкончанияДоговора = ДобавитьМесяц(ДатаЗаключения, 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 — вероятно, использовалось сложение секунд через високосный год
Результат 28.02 невисокосного года и это устраивает бизнес-логику
Ожидалось 1 марта, но код этого не учитывает
Расчёт пропущен или выдано понятное сообщение
В данных появилась дата 01.01.0002
Практические сценарии применения
Срок действия договора
Типовая задача: при записи договора автоматически заполнить дату окончания как дата заключения плюс один год. Расчёт размещают в обработчике ПередЗаписью или в процедуре заполнения по кнопке, чтобы пользователь мог скорректировать значение вручную.
Если ЗначениеЗаполнено(ДатаЗаключения) Тогда
ДатаОкончания = ДобавитьМесяц(ДатаЗаключения, 12) - 1;
// минус 1 секунда: окончание — конец дня накануне годовщины
КонецЕсли;
Обратите внимание на приём с вычитанием одной секунды: если договор «действует год с 15.03.2026», то последним днём действия обычно считается 14.03.2026, а не 15.03.2026. Какой вариант правильный — определяет методология учёта, зафиксируйте её в комментарии.
Период отбора в отчёте
В отчётах часто нужно показать данные «за год от выбранной даты». Вычислите границы периода в коде и передайте в параметры СКД или запроса: начало — исходная дата, конец — КонецДня(ДобавитьМесяц(Дата, 12)) - 1 либо конец дня накануне годовщины, в зависимости от требуемой логики включения границ.
Напоминания и регламентные задания
Для уведомлений о приближении окончания срока (договора, сертификата, поверки) регламентное задание сравнивает текущую дату с вычисленной датой окончания. Храните дату окончания в реквизите, вычисленную один раз при записи, а не вычисляйте её каждый раз в запросе — это упрощает индексирование и отборы.
Сравнение способов и ограничения
Выбор способа зависит от контекста: встроенный язык, запрос или ручной расчёт. Ниже — сопоставление по ключевым критериям.
| Способ | Где применяется | Високосные годы | Ограничения |
|---|---|---|---|
| ДобавитьМесяц(Дата, 12) | Встроенный язык, клиент и сервер | Корректно, 29.02 → 28.02 | Нет отдельного типа «год», только через месяцы |
| ДОБАВИТЬКДАТЕ(Дата, ГОД, 1) | Язык запросов, СКД | Корректно | Требуется платформа 8.3.6 и выше |
| Дата + 365*86400 | Не рекомендуется | Ошибка на сутки | Не использовать в прикладном коде |
Как выбрать способ
Отдельно отметим ограничение по диапазону дат: тип «Дата» в 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).