Прибавление года к дате в 1С: ручные и программные способы
Содержание
Самая частая ошибка — прибавить к дате 365 дней (или 365 × 24 × 3600 секунд) и считать, что получили тот же день через год. В високосный год такой расчёт сдвигает результат на сутки. В коде 1С правильный способ прибавить год — функция ДобавитьМесяц(Дата, 12): она аккуратно переносит дату на год вперёд. А если год нужно поменять не в алгоритме, а в документе или отчёте — это делается прямо в поле даты.
«Прибавить год» в 1С сводится к одному из трёх: сдвинуть дату в конкретном документе или справочнике, перевести отчёты и рабочую дату на новый год или вычислить дату через год в коде либо запросе. Ниже — каждый случай с точными путями меню и примерами.
| Что нужно | Способ | Где |
|---|---|---|
| Поменять дату в одном документе | вручную в поле даты | шапка документа |
| Сдвинуть дату у многих объектов | групповое изменение реквизитов | меню «Все функции» |
| Перевести программу на новый год | рабочая дата + период отчётов | Параметры |
| Прибавить год в алгоритме | ДобавитьМесяц(Дата, 12) | встроенный язык |
| Прибавить год в выборке | ДОБАВИТЬКДАТЕ(Дата, ГОД, 1) | язык запросов |
Как изменить год в дате документа или справочника
В 1С:Предприятии 8.3 с интерфейсом «Такси» дата документа стоит в шапке — поле от рядом с номером. Откройте документ двойным кликом, щёлкните по полю и введите новую дату с клавиатуры или выберите через значок календаря. Чтобы прибавить год, достаточно изменить в дате четыре цифры года.
Полностью дату перенабирать не обязательно: встаньте курсором на цифры года и исправьте только их. Значок календаря рядом с полем открывает выбор мышью, а по клавише Enter подставляется текущая рабочая дата.
После смены даты проведённый документ нужно перепровести — кнопка Провести или Провести и закрыть. Движения по регистрам пересчитаются уже на новую дату. Заодно проверьте то, что к дате привязано: курс валюты, актуальные цены, настройки учётной политики на период — при переносе на другой год они могут отличаться.
Если нумерация документов ведётся в пределах года, смена года меняет и номер: документ попадёт в нумерацию другого года. Перед правкой даты проверьте, нет ли на этот период даты запрета изменения.
В периодических сведениях (например, в регистре со ставками или окладами) дата хранится в самой записи. Чтобы «перенести» значение на следующий год, не правьте старую запись, а добавьте новую с датой нового года — так сохранится история.
Рабочая дата и периоды отчётов при переходе на новый год
Когда наступает новый год, частая жалоба — новые документы создаются со старой датой. Причина почти всегда одна: в программе задана фиксированная рабочая дата из прошлого года.
Проверьте и поправьте её так: кнопка Сервис и настройки (шестерёнка в правом верхнем углу) → Параметры → раздел Рабочая дата. Переключите на Текущую дату компьютера — тогда новые документы будут подставлять актуальный день. Фиксированную дату оставляют только когда намеренно вводят документы задним числом.
Рабочая дата влияет не только на подстановку в новые документы: от неё зависит, на какой момент программа показывает актуальные значения периодических сведений (цены, курсы, настройки). Если она «висит» в прошлом году, подставляются прошлогодние данные — ещё один повод вернуть её на текущий день сразу после праздников.
В отчётах год задаётся не рабочей датой, а периодом. В шапке отчёта откройте поле Период и выберите нужный интервал — через стандартные значения (Этот год, Прошлый год) или вручную начало и конец. Если отчёт после нового года показывает пусто, скорее всего период остался на прошлом годе.
Здесь помогает различие между конкретной датой и относительным периодом. Если в отчёте выбрать стандартный период Этот год, он автоматически сдвинется: в новом году покажет новый год без правок. А жёстко заданные 01.01 — 31.12 конкретного года так и останутся на прошлом. Для регулярных отчётов, которые вы сохраняете, выбирайте относительные периоды — не придётся переставлять их каждый январь.
Периодичность данных в отчёте (разбивка по годам, кварталам, месяцам) настраивается отдельно: Настройки → Структура или Группировки → добавьте поле Период и выберите тип Год. Тогда строки сгруппируются по годам.
После закрытия года имеет смысл защитить его от случайных правок. Дата запрета задаётся в разделе Администрирование → Настройки пользователей и прав → Даты запрета изменения. Поставьте 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) для привязки к прошлому году либо постройте отчёт по двум периодам и сопоставьте итоги.