Разработка и Конфигурация · 11 мин
Как прибавить к дате в 1С: все способы с примерами
Как прибавить к дате в 1С дни, месяцы и годы: функции ДобавитьКДате, ДобавитьМесяц, работа с датами в запросах и типичные ошибки разработчиков.
Работа с датами — одна из самых частых задач при разработке на платформе 1С:Предприятие. Расчёт сроков оплаты, дат отгрузки, периодов действия договоров, отпусков и отчётных периодов — всё это требует корректного прибавления дней, месяцев или лет к исходной дате. При этом у начинающих разработчиков часто возникает соблазн просто прибавить число к дате, что приводит к ошибкам.
Во встроенном языке 1С дата — это отдельный тип данных, а не число, поэтому арифметика с датами имеет свои правила. Платформа предоставляет специальные функции: ДобавитьМесяц() для сдвига на месяцы и годы, а также операцию сложения с числом секунд для сдвига на дни, часы и минуты. В языке запросов применяется функция ДОБАВИТЬКДАТЕ().
Ниже разобраны все рабочие способы прибавления к дате в коде и в запросах, особенности перехода через границы месяцев и лет, а также типичные ошибки, которые приводят к неверным расчётам в учётных данных.
Как устроен тип «Дата» и почему нельзя прибавлять число напрямую
Значение типа «Дата» в 1С хранится с точностью до секунды и содержит одновременно календарную дату и время. Именно поэтому простое сложение Дата + 5 прибавит не пять дней, а пять секунд — это самая распространённая ошибка новичков. Результат визуально почти не отличается от исходной даты, и ошибка может долго оставаться незамеченной в отчётах.
Второй нюанс — пустая дата. Значение '00010101' (1 января 1 года) считается пустой датой, и арифметика с ней формально выполняется, но результат обычно бессмыслен для учёта. Перед расчётами стоит проверять заполненность через ЗначениеЗаполнено(Дата) или сравнение с '00010101000000'.
Также помните, что дата без времени вроде Дата(2026, 3, 15) — это начало дня, то есть 00:00:00. Если исходная дата содержит время (например, дата документа), прибавление дней сохранит это время, что важно при сравнениях и отборах по периодам.
Прибавляем дни, часы и минуты к дате
Для сдвига даты на дни, часы, минуты или секунды используется обычное сложение: к дате прибавляется количество секунд. В сутках 86400 секунд (24 × 60 × 60), в часе — 3600, в минуте — 60. Формула выглядит так:
ИсходнаяДата = ТекущаяДатаСеанса();
// Прибавить 10 дней
НоваяДата = ИсходнаяДата + 10 * 86400;
// Прибавить 3 часа
НоваяДата = ИсходнаяДата + 3 * 3600;
// Вычесть неделю
НоваяДата = ИсходнаяДата - 7 * 86400;
Для удобочитаемости кода часто объявляют переменную СекундВДне = 86400; или используют константу в общем модуле. Это снижает риск опечатки в «магическом числе» и упрощает сопровождение.
Если нужно прибавить дни к дате документа, но результат должен быть началом дня, дополнительно примените НачалоДня(): НоваяДата = НачалоДня(ДатаДокумента + 5 * 86400);. Это уберёт время, которое хранится в дате документа.
Рабочие и календарные дни — не одно и то же
Прибавление секунд сдвигает дату на календарные дни, включая выходные и праздники. Если по условиям задачи нужен расчёт в рабочих днях (например, «оплата в течение 5 рабочих дней»), простой арифметики недостаточно — потребуется регистр сведений с производственным календарём и циклический перебор дней с проверкой их вида. В типовых конфигурациях для этого есть готовые механизмы календарных графиков.
Прибавляем месяцы и годы функцией ДобавитьМесяц
Для сдвига на месяцы и годы сложение секунд не подходит: месяцы имеют разную длину (28–31 день), поэтому универсального числа секунд «в месяце» не существует. Для этого в платформе есть функция ДобавитьМесяц(Дата, КоличествоМесяцев). Второй параметр может быть отрицательным — тогда дата сдвигается назад.
// Прибавить 1 месяц
НоваяДата = ДобавитьМесяц(ИсходнаяДата, 1);
// Прибавить год (12 месяцев)
НоваяДата = ДобавитьМесяц(ИсходнаяДата, 12);
// Вычесть квартал
НоваяДата = ДобавитьМесяц(ИсходнаяДата, -3);
Важная особенность функции — поведение на границе месяца. Если исходная дата — 31 января, то ДобавитьМесяц('20260131', 1) вернёт 29 или 28 февраля (последний день месяца), а не 2–3 марта. Функция «прижимает» результат к последнему дню целевого месяца, если исходного числа в нём нет. Это корректное поведение для расчёта сроков, но его нужно учитывать при проверках.
Для прибавления лет отдельной функции нет — используйте ДобавитьМесяц с количеством, кратным 12. Переход через 29 февраля високосного года обрабатывается аналогично: 29.02.2026 плюс 12 месяцев даст 28.02.2026.
Прибавление к дате в запросах: ДОБАВИТЬКДАТЕ
В языке запросов 1С арифметика сложения с датами недоступна — вместо неё используется функция ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество). Она универсальна и позволяет сдвигать дату на секунды, минуты, часы, дни, недели, месяцы, кварталы, полугодия и годы.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Заказы.ДатаОтгрузки, ДЕНЬ, 3) КАК СрокОплаты,
ДОБАВИТЬКДАТЕ(Заказы.Дата, МЕСЯЦ, 1) КАК ДатаПлановогоПлатежа,
ДОБАВИТЬКДАТЕ(Заказы.Дата, ГОД, -1) КАК ГодНазад
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Допустимые типы периода: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД, а также ДЕКАДА. Количество может быть отрицательным — тогда дата сдвигается назад. Поведение на границах месяцев аналогично функции ДобавитьМесяц.
При построении отборов по периодам в запросах часто удобнее не сдвигать дату, а использовать виртуальные функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() — они корректно определяют границы дня, месяца или квартала без ручных вычислений.
НоваяДата = ДобавитьМесяц(НачалоДня(ДатаДокумента), 1) + 5 * 86400; // месяц и 5 дней от даты документаСравнение способов и выбор подходящего
Выбор способа зависит от того, что именно нужно прибавить и где выполняется расчёт — в коде или в запросе. Сводная таблица поможет быстро сориентироваться.
| Задача | Способ в коде | Способ в запросе |
|---|---|---|
| Прибавить дни / часы / минуты | Дата + N * 86400 (или 3600, 60) | ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, N) |
| Прибавить месяцы | ДобавитьМесяц(Дата, N) | ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, N) |
| Прибавить годы | ДобавитьМесяц(Дата, N * 12) | ДОБАВИТЬКДАТЕ(Дата, ГОД, N) |
| Начало / конец периода | НачалоДня(), КонецМесяца() и др. | НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА() |
| Рабочие дни | Расчёт по производственному календарю | Соединение с регистром календаря |
Как выбрать способ
Проверка результата и типичные ошибки
После реализации расчёта обязательно проверьте его на граничных датах: конец месяца, конец года, 29 февраля, пустая дата. Большинство дефектов в работе с датами всплывает именно на таких значениях, а не на «средних» датах месяца.
Как проверить результат
Результат — последний день февраля (28 или 29 число)
Результат — 2 или 3 марта, либо ошибка преобразования
Дата сдвинулась ровно на неделю, время сохранено
Дата изменилась на несколько секунд — прибавлено число без пересчёта
Пустая дата отсечена проверкой ЗначениеЗаполнено
В расчётах фигурирует 01.01.0001 и попадает в отчёты
Дата попадает в отбор запроса корректно
Дата «выпадает» из-за несовпадения времени суток
Ещё одна тонкость — функция ТекущаяДата() на клиенте и ТекущаяДатаСеанса() на сервере могут возвращать разные значения из-за часовых поясов и настроек сеанса. Для расчётов сроков в учётных механизмах предпочтительнее ТекущаяДатаСеанса() — она едина для всех пользователей сеанса и не зависит от настроек клиентского компьютера.
Практические сценарии из учётных задач
Срок оплаты по договору
Типовая задача: срок оплаты — 14 календарных дней от даты отгрузки. Расчёт: СрокОплаты = НачалоДня(ДатаОтгрузки) + 14 * 86400;. Если договором предусмотрены рабочие дни, потребуется перебор дней с проверкой по календарю, хранящемуся в регистре сведений.
Период действия договора
Договор заключён на год: ДатаОкончания = ДобавитьМесяц(ДатаНачала, 12) - 86400; — вычитание одних суток даёт последний день действия, если по условиям договор действует «по день, предшествующий дате начала». Уточняйте методику расчёта в постановке задачи: «год с даты» и «по ту же дату следующего года» — разные результаты.
Отчётный период по умолчанию
При открытии отчёта часто подставляют период «последние 30 дней» или «текущий месяц»: ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса()); ДатаОкончания = КонецМесяца(ТекущаяДатаСеанса());. Такой подход надёжнее ручного вычитания секунд, так как не зависит от длины месяца.
Что важно запомнить
Дни прибавляются к дате в секундах (N * 86400), месяцы и годы — функцией ДобавитьМесяц, в запросах — ДОБАВИТЬКДАТЕ. Всегда учитывайте время в составе даты, проверяйте пустые значения и тестируйте расчёты на границах месяцев и високосных годах.
Часто задаваемые вопросы
Как прибавить к дате один день в 1С?
Прибавьте к дате 86400 секунд: НоваяДата = ИсходнаяДата + 86400;. Если нужно отбросить время, оберните результат в НачалоДня(). В запросе используйте ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 1).
Почему Дата + 1 не прибавляет день?
Потому что единица измерения при сложении с датой — секунда, а не день. Выражение Дата + 1 сдвигает значение на одну секунду. Для сдвига на день умножьте количество дней на 86400.
Как к дате прибавить год?
Отдельной функции для лет нет. Используйте ДобавитьМесяц(Дата, 12). Для нескольких лет умножьте количество лет на 12. В запросе доступен тип периода ГОД: ДОБАВИТЬКДАТЕ(Дата, ГОД, 1).
Что вернёт ДобавитьМесяц для 31 января?
Функция вернёт последний день февраля — 28 или 29 число в зависимости от високосности года. Если исходного числа в целевом месяце нет, результат «прижимается» к его последнему дню, а не переносится на начало следующего месяца.
Как вычесть из даты несколько дней?
Тем же способом, но со знаком минус: НоваяДата = ИсходнаяДата - 5 * 86400; — вычитание пяти дней. Для месяцев передайте отрицательный параметр: ДобавитьМесяц(Дата, -2) сдвинет дату на два месяца назад.
Как прибавить к дате рабочие дни, а не календарные?
Простым сложением это не решается. Нужен производственный календарь (в типовых конфигурациях — регистр сведений с данными календаря): в цикле сдвигайте дату по одному дню и увеличивайте счётчик только для рабочих дней, пока не наберёте требуемое количество.