Прибавление года к дате в 1С: ручные и программные способы

· 9 мин

Содержание

Самая частая ошибка — прибавить к дате 365 дней (или 365 × 24 × 3600 секунд) и считать, что получили тот же день через год. В високосный год такой расчёт сдвигает результат на сутки. В коде 1С правильный способ прибавить год — функция ДобавитьМесяц(Дата, 12): она аккуратно переносит дату на год вперёд. А если год нужно поменять не в алгоритме, а в документе или отчёте — это делается прямо в поле даты.

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

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

Как изменить год в дате документа или справочника

В 1С:Предприятии 8.3 с интерфейсом «Такси» дата документа стоит в шапке — поле от рядом с номером. Откройте документ двойным кликом, щёлкните по полю и введите новую дату с клавиатуры или выберите через значок календаря. Чтобы прибавить год, достаточно изменить в дате четыре цифры года.

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

После смены даты проведённый документ нужно перепровести — кнопка Провести или Провести и закрыть. Движения по регистрам пересчитаются уже на новую дату. Заодно проверьте то, что к дате привязано: курс валюты, актуальные цены, настройки учётной политики на период — при переносе на другой год они могут отличаться.

Если нумерация документов ведётся в пределах года, смена года меняет и номер: документ попадёт в нумерацию другого года. Перед правкой даты проверьте, нет ли на этот период даты запрета изменения.

В периодических сведениях (например, в регистре со ставками или окладами) дата хранится в самой записи. Чтобы «перенести» значение на следующий год, не правьте старую запись, а добавьте новую с датой нового года — так сохранится история.

Рабочая дата и периоды отчётов при переходе на новый год

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

Проверьте и поправьте её так: кнопка Сервис и настройки (шестерёнка в правом верхнем углу) → Параметры → раздел Рабочая дата. Переключите на Текущую дату компьютера — тогда новые документы будут подставлять актуальный день. Фиксированную дату оставляют только когда намеренно вводят документы задним числом.

Рабочая дата влияет не только на подстановку в новые документы: от неё зависит, на какой момент программа показывает актуальные значения периодических сведений (цены, курсы, настройки). Если она «висит» в прошлом году, подставляются прошлогодние данные — ещё один повод вернуть её на текущий день сразу после праздников.

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

Здесь помогает различие между конкретной датой и относительным периодом. Если в отчёте выбрать стандартный период Этот год, он автоматически сдвинется: в новом году покажет новый год без правок. А жёстко заданные 01.01 — 31.12 конкретного года так и останутся на прошлом. Для регулярных отчётов, которые вы сохраняете, выбирайте относительные периоды — не придётся переставлять их каждый январь.

Периодичность данных в отчёте (разбивка по годам, кварталам, месяцам) настраивается отдельно: Настройки → Структура или Группировки → добавьте поле Период и выберите тип Год. Тогда строки сгруппируются по годам.

Перевод базы на новый год
Выполнено: 0 / 5

После закрытия года имеет смысл защитить его от случайных правок. Дата запрета задаётся в разделе Администрирование → Настройки пользователей и прав → Даты запрета изменения. Поставьте 31 декабря закрытого года — и документы прошлого периода нельзя будет изменить или перепровести без снятия запрета.

Групповое изменение дат через обработку

Если дату нужно сдвинуть сразу у нескольких объектов, в типовых конфигурациях есть обработка Групповое изменение реквизитов. Она лежит в служебном меню, которое по умолчанию скрыто.

Сначала включите само меню: Сервис и настройки → Параметры → флажок Отображать команду «Все функции». После этого обработка доступна через Сервис и настройки → Все функции → Стандартные → Групповое изменение реквизитов.

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

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

Групповое изменение уместно для справочников и для непроведённых документов, где дата не влияет на движения.

Как прибавить год в коде: функция ДобавитьМесяц

Отдельной функции ДобавитьГод во встроенном языке 1С нет. Год прибавляют через месяцы — в году их двенадцать:

// Прибавить ровно год к текущей дате
НоваяДата = ДобавитьМесяц(ТекущаяДата(), 12);

// Отнять год (год назад)
ГодНазад = ДобавитьМесяц(ТекущаяДата(), -12);

ДобавитьМесяц корректно обрабатывает концы месяцев и високосные годы. Классический пример — 29 февраля:

Исходная = Дата(2024, 2, 29);        // 29 февраля високосного года
ЧерезГод  = ДобавитьМесяц(Исходная, 12); // вернёт 28 февраля 2025

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

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

За «сегодня» в коде отвечают две разные функции. ТекущаяДата() доступна на сервере и во внешнем соединении и возвращает дату компьютера. В клиент-серверной базе на клиенте берите ТекущаяДатаСеанса() — она возвращает дату сеанса (время сервера) и не зависит от часов на машине пользователя. Прибавлять год к результату можно той же ДобавитьМесяц.

Если нужен не сдвиг конкретного дня, а весь следующий год целиком, удобно комбинировать с НачалоГода и КонецГода:

НачалоСледующего = ДобавитьМесяц(НачалоГода(ТекущаяДата()), 12);
КонецСледующего  = КонецГода(НачалоСледующего);

Вытащить только число года из даты поможет функция Год(Дата) — она вернёт целое, с которым можно сравнивать или выводить в текст через Формат(Год(Дата), "ЧГ=0"), чтобы год не разбивался разделителем разрядов.

Прибавление года в запросе: функция ДОБАВИТЬКДАТЕ

В языке запросов для сдвига даты есть функция ДОБАВИТЬКДАТЕ(<Дата>, <Интервал>, <Количество>). Для года интервал задаётся словом ГОД:

ВЫБРАТЬ
    Продажи.Период КАК Период,
    ДОБАВИТЬКДАТЕ(Продажи.Период, ГОД, 1) КАК ПериодСледующегоГода,
    ДОБАВИТЬКДАТЕ(Продажи.Период, ГОД, -1) КАК ПериодПрошлогоГода
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи

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

Границы года в запросе задаются функциями НАЧАЛОПЕРИОДА(Дата, ГОД) и КОНЕЦПЕРИОДА(Дата, ГОД). Чтобы получить следующий год целиком, сдвиньте дату и возьмите его начало и конец:

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, ГОД, 1), ГОД) КАК НачалоСледующего,
    КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, ГОД, 1), ГОД)  КАК КонецСледующего

Дату-литерал в запросе записывают функцией ДАТАВРЕМЯ(2024, 1, 1). Во встроенном языке тот же литерал выглядит как '20240101'. Эти же функции (ДОБАВИТЬКДАТЕ, НАЧАЛОПЕРИОДА) работают в вычисляемых полях и параметрах системы компоновки данных, когда отчёт строится на запросе.

В регистрах сведений год косвенно задаётся периодичностью. Если у регистра периодичность «в пределах года», каждая запись относится к конкретному году, и чтобы «перенести» значение на следующий, добавляют новую запись с датой нового года — старую не трогают, иначе потеряется история. Какая периодичность у регистра, видно в его записях: если поле периода показывает только год, значит, детальнее одной записи в год не сохранить.

Типичные ошибки при работе с датами

Перечисленные промахи встречаются чаще всего — проверьте себя по ним.

  • 📅 Прибавили 365 дней вместо года. На границе високосного года результат уезжает на сутки. Лечится заменой на ДобавитьМесяц(Дата, 12).
  • 🧮 Собрали дату конструктором на 29 февраля. Дата(Год + 1, 2, 29) в невисокосный год даст ошибку. Используйте ДобавитьМесяц.
  • 🕛 Забыли про время в дате. Дата хранит и время. КонецГода возвращает 31.12 23:59:59, поэтому отбор Дата <= КонецГода(...) ведёт себя иначе, чем Дата < НачалоСледующегоГода. Для диапазонов удобнее сравнивать с началом следующего периода.
  • 🗓 Рабочая дата застряла в прошлом году. Новые документы подставляют старую дату. Исправляется в Параметрах переключением на текущую дату компьютера.
  • 📊 Отчёт пуст после нового года. Период в отчёте остался прошлогодним — сдвиньте его вручную.
  • 🔢 Массово сдвинули даты проведённых документов. Сломались номера и последовательности. Правьте даты точечно, с перепроведением по порядку.

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

Есть ли в 1С функция ДобавитьГод?
Отдельной функции нет. Во встроенном языке год прибавляют через ДобавитьМесяц(Дата, 12), а в запросе — через ДОБАВИТЬКДАТЕ(Дата, ГОД, 1).
Почему дата через «плюс год» уехала на один день?
Скорее всего, год прибавили сложением секунд или дней (+ 365 × 86400). В високосном году 366 дней, поэтому результат сдвигается. Считайте только через ДобавитьМесяц.
Нужно ли переносить остатки и настройки на новый год вручную?
Нет. Учёт в 1С сквозной, остатки и справочники переходят на новый год сами. Меняется период в отчётах и рабочая дата, а по итогам закрытия года ставится дата запрета изменения.
Можно ли одной обработкой поменять дату у всех документов?
Технически да — через Групповое изменение реквизитов. Но для проведённых документов это рискованно: сбиваются нумерация и последовательности. Безопаснее менять дату точечно с перепроведением.
Как в отчёте сравнить текущий год с прошлым?
Добавьте вычисляемое поле с ДОБАВИТЬКДАТЕ(Период, ГОД, -1) для привязки к прошлому году либо постройте отчёт по двум периодам и сопоставьте итоги.