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

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

Как прибавить 30 дней к дате в 1С

Как прибавить 30 дней к дате в 1С: функция ДобавитьКДате, расчёт через секунды, работа в запросах и на форме. Примеры кода, ошибки и проверка результата.

Задача прибавить 30 дней к дате возникает в 1С постоянно: расчёт срока оплаты по договору, даты отгрузки, окончания гарантии, периода действия скидки. Встроенный язык платформы предлагает два рабочих способа — функцию ДобавитьКДате() и арифметику с секундами. Оба корректны, но ведут себя по-разному на границах месяцев и при переходе через високосный год.

Главный подводный камень — тип данных. В 1С дата хранится с точностью до секунды, и прибавление «30 дней» на самом деле означает прибавление 2 592 000 секунд. Если исходная дата содержит время (например, документ проведён в 14:35), результат тоже будет содержать это время, что иногда ломает сравнения дат в отчётах и отборах.

Ниже разобраны оба способа с готовым кодом, работа с датами в запросах, типичные ошибки и способы проверить, что результат посчитан правильно. Примеры подходят для платформы 8.3 в управляемых и обычных формах.

Способ 1: функция ДобавитьКДате — рекомендуемый вариант

Функция ДобавитьКДате() — штатный инструмент платформы для арифметики с датами. Синтаксис: ДобавитьКДате(Дата, Тип, Количество), где второй параметр — единица измерения из перечисления ТипЕдиницыИзмеренияИнтерваловДаты: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД и другие.

Пример кода для прибавления 30 дней:

ИсходнаяДата = Дата(2026, 1, 15); // 15 января

НоваяДата = ДобавитьКДате(ИсходнаяДата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30);

// Результат: 14.02.2026 0:00:00

Ключевое преимущество функции — корректная работа с календарными границами. При прибавлении месяцев к 31 января результат не «провалится» в несуществующую дату: платформа вернёт последний день февраля. Для дней проблема менее остра, но единообразие кода с месяцами и годами делает функцию предпочтительной.

Обратите внимание: функция не изменяет исходную переменную, а возвращает новое значение. Частая ошибка новичков — вызвать ДобавитьКДате(Дата, ...) и забыть присвоить результат.

bsl
НоваяДата = ДобавитьКДате(ИсходнаяДата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30);

Способ 2: прибавление секунд арифметически

Дата в 1С поддерживает операции сложения и вычитания с числами, где единица — одна секунда. Поэтому 30 дней — это 30 × 24 × 60 × 60 = 2 592 000 секунд:

НоваяДата = ИсходнаяДата + 30 * 86400;

// или короче:

НоваяДата = ИсходнаяДата + 2592000;

Этот способ короче и часто встречается в старом коде. Он полностью корректен для дней, потому что день всегда равен 86400 секундам в календарной арифметике 1С. Различий в результате с ДобавитьКДате при прибавлении именно дней не будет.

Ограничение способа — читаемость и риск ошибки в множителе. Кто-то пишет 86400, кто-то 8640 и получает сдвиг на 3 дня вместо 30. Если в коде уже используется ДобавитьКДате для других интервалов, лучше не смешивать подходы.

Как избавиться от времени в результате

Даты документов в 1С почти всегда содержат время. Когда вы рассчитываете «срок оплаты = дата счёта + 30 дней», время обычно не нужно: сравнение СрокОплаты < ТекущаяДатаСеанса() может дать ложный результат из-за часов и минут.

Стандартное решение — обернуть результат в функцию начала или конца дня:

СрокОплаты = НачалоДня(ДобавитьКДате(ДатаСчета, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30));

// или, если срок действует до конца дня:

СрокОплаты = КонецДня(ДобавитьКДате(ДатаСчета, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30));

Выбор между НачалоДня и КонецДня зависит от бизнес-логики. «Оплатить в течение 30 дней» обычно означает, что последний допустимый день входит в срок, поэтому корректнее КонецДня. Для отборов в запросах по периоду конец дня также безопаснее: записи за последний день не выпадут из выборки.

Типичные ошибки
01
Прибавление числа 30 вместо 30*86400 — дата сдвинется на 30 секунд, а не на 30 дней, и ошибка долго остаётся незамеченной
02
Сравнение рассчитанной даты с текущей без отсечения времени — документ «просрочен» уже утром последнего дня
03
Присваивание результата в реквизит типа Строка или Число — при записи получите ошибку преобразования или потерю данных
04
Использование ТекущаяДата() вместо ТекущаяДатаСеанса() на сервере — в тонком клиенте сработает, на сервере вызовет ошибку или даст неверный часовой пояс

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

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

ВЫБРАТЬ

Счет.Ссылка КАК Счет,

ДОБАВИТЬКДАТЕ(Счет.Дата, ДЕНЬ, 30) КАК СрокОплаты

ИЗ

Документ.СчетНаОплатуПокупателю КАК Счет

ГДЕ

ДОБАВИТЬКДАТЕ(Счет.Дата, ДЕНЬ, 30) < &ТекущаяДата

Такой запрос сразу отбирает просроченные счета. Параметр &ТекущаяДата передаётся из кода через Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()).

Учтите, что вычисления в запросе выполняются на СУБД, и при больших объёмах таблиц условие с функцией в секции ГДЕ не использует индекс по полю Дата. На миллионах документов выгоднее инвертировать условие: Счет.Дата < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -30) — тогда функция вычисляется один раз от параметра, а индекс по дате документа работает.

Порядок действий для расчёта срока оплаты
  1. 1
    Определите исходную дату: реквизит документа, параметр или ТекущаяДатаСеанса()
  2. 2
    Прибавьте 30 дней через ДобавитьКДате(Дата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30)
  3. 3
    При необходимости отсеките время: НачалоДня() или КонецДня()
  4. 4
    Запишите результат в реквизит типа Дата или используйте в сравнении
  5. 5
    Проверьте результат на граничных датах: конец месяца, конец года, февраль

Работа на форме и в пользовательском режиме

Если 30 дней нужно прибавить не в коде, а прямо на форме — например, пользователь вводит дату начала, а дата окончания должна рассчитаться автоматически, — логика размещается в обработчике ПриИзменении поля ввода:

&НаКлиенте

Процедура ДатаНачалаПриИзменении(Элемент)

Объект.ДатаОкончания = НачалоДня(Объект.ДатаНачала) + 30 * 86400;

КонецПроцедуры

На клиенте функция ДобавитьКДате тоже доступна, но арифметика с секундами в формах встречается чаще из-за краткости. Оба варианта работают без вызова сервера, что важно для отзывчивости формы.

Отдельный сценарий — пользователь без прав разработчика. В режиме 1С:Предприятие прибавить дни к дате «вручную» можно только через внешние обработки, консоль кода или встроенные механизмы конфигурации (например, поле «Срок оплаты» в типовых договорах, где указывается число дней, а дата считается автоматически). Если такой механизм есть в вашей конфигурации — используйте его, а не дорабатывайте код.

Маршрут решения

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

Нужно прибавить дни, месяцы или годы в серверном кодеИспользуйте ДобавитьКДате() — единообразно и безопасно на границах календаря
Нужно быстро сдвинуть дату на форме или в простом кодеПодойдёт Дата + 30 * 86400, но добавьте комментарий о единицах
Расчёт нужен в отборе или выборке запросаПрименяйте ДОБАВИТЬКДАТЕ() в тексте запроса, при больших объёмах выносите функцию к параметру
Результат сравнивается с текущей датойОберните расчёт в НачалоДня() или КонецДня(), чтобы исключить влияние времени

Проверка результата и граничные случаи

После внедрения расчёта проверьте его на датах, где чаще всего всплывают дефекты. Основные контрольные точки: переход через конец месяца (15 января + 30 дней = 14 февраля), переход через год (20 декабря + 30 дней = 19 января следующего года) и високосный февраль.

Быстрая проверка без отладчика — вывести результат через Сообщить() или в консоли кода:

Сообщить(Формат(ДобавитьКДате(Дата(2026,12,20), ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30), "ДЛФ=D"));

// Ожидаем: 19.01.2026

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

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

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

Дата 15.01 + 30 дней
Норма

14.02 того же года

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

13.02 или 15.02 — сбой в отсчёте или лишнее отсечение дня

Дата 20.12 + 30 дней
Норма

19.01 следующего года

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

Дата осталась в текущем году или сбросился месяц

Время в результате
Норма

0:00:00 или 23:59:59 после НачалоДня/КонецДня

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

Произвольное время из исходной даты при сравнениях

Тип реквизита-получателя
Норма

Дата (или Дата с составом Дата и время)

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

Строка или Число — ошибка преобразования при записи

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

Чем ДобавитьКДате лучше прибавления секунд?

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

Как прибавить 30 календарных дней с учётом производственного календаря?

Штатные функции работают только с календарными днями. Для рабочих дней нужен регистр «РегламентированныйПроизводственныйКалендарь» (в типовых конфигурациях) и перебор дат с проверкой вида дня. Готовой функции «прибавить рабочие дни» в платформе нет.

Почему после прибавления 30 дней дата сравнивается неправильно?

Чаще всего мешает время: исходная дата документа содержит часы и минуты, а сравнивается с началом текущего дня. Оберните расчёт в НачалоДня() или КонецДня() — в зависимости от того, входит ли последний день в срок.

Можно ли прибавить дни к дате в СКД без изменения запроса?

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

Что будет, если прибавить дни к пустой дате (01.01.0001)?

Получится дата в январе года 1, что почти наверняка сломает дальнейшую логику и отчёты. Перед расчётом проверяйте заполненность: Если ЗначениеЗаполнено(ИсходнаяДата) Тогда ... КонецЕсли.

Итог

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

Для прибавления 30 дней к дате в 1С используйте ДобавитьКДате(Дата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30) или Дата + 30 * 86400. Отсекайте время через НачалоДня/КонецДня перед сравнениями, в запросах применяйте ДОБАВИТЬКДАТЕ, а результат проверяйте на границах месяца и года.