Разработка и Конфигурация · 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 января результат не «провалится» в несуществующую дату: платформа вернёт последний день февраля. Для дней проблема менее остра, но единообразие кода с месяцами и годами делает функцию предпочтительной.
Обратите внимание: функция не изменяет исходную переменную, а возвращает новое значение. Частая ошибка новичков — вызвать ДобавитьКДате(Дата, ...) и забыть присвоить результат.
НоваяДата = ДобавитьКДате(ИсходнаяДата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 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 дней» обычно означает, что последний допустимый день входит в срок, поэтому корректнее КонецДня. Для отборов в запросах по периоду конец дня также безопаснее: записи за последний день не выпадут из выборки.
Прибавление 30 дней в запросе
В языке запросов 1С есть аналог — функция ДОБАВИТЬКДАТЕ(Дата, ТИП, Количество). Это удобно, когда срок нужно вычислить прямо в выборке, не перебирая результат в коде:
ВЫБРАТЬ
Счет.Ссылка КАК Счет,
ДОБАВИТЬКДАТЕ(Счет.Дата, ДЕНЬ, 30) КАК СрокОплаты
ИЗ
Документ.СчетНаОплатуПокупателю КАК Счет
ГДЕ
ДОБАВИТЬКДАТЕ(Счет.Дата, ДЕНЬ, 30) < &ТекущаяДата
Такой запрос сразу отбирает просроченные счета. Параметр &ТекущаяДата передаётся из кода через Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()).
Учтите, что вычисления в запросе выполняются на СУБД, и при больших объёмах таблиц условие с функцией в секции ГДЕ не использует индекс по полю Дата. На миллионах документов выгоднее инвертировать условие: Счет.Дата < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -30) — тогда функция вычисляется один раз от параметра, а индекс по дате документа работает.
- 1Определите исходную дату: реквизит документа, параметр или ТекущаяДатаСеанса()
- 2Прибавьте 30 дней через ДобавитьКДате(Дата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30)
- 3При необходимости отсеките время: НачалоДня() или КонецДня()
- 4Запишите результат в реквизит типа Дата или используйте в сравнении
- 5Проверьте результат на граничных датах: конец месяца, конец года, февраль
Работа на форме и в пользовательском режиме
Если 30 дней нужно прибавить не в коде, а прямо на форме — например, пользователь вводит дату начала, а дата окончания должна рассчитаться автоматически, — логика размещается в обработчике ПриИзменении поля ввода:
&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
Объект.ДатаОкончания = НачалоДня(Объект.ДатаНачала) + 30 * 86400;
КонецПроцедуры
На клиенте функция ДобавитьКДате тоже доступна, но арифметика с секундами в формах встречается чаще из-за краткости. Оба варианта работают без вызова сервера, что важно для отзывчивости формы.
Отдельный сценарий — пользователь без прав разработчика. В режиме 1С:Предприятие прибавить дни к дате «вручную» можно только через внешние обработки, консоль кода или встроенные механизмы конфигурации (например, поле «Срок оплаты» в типовых договорах, где указывается число дней, а дата считается автоматически). Если такой механизм есть в вашей конфигурации — используйте его, а не дорабатывайте код.
Как выбрать способ
Проверка результата и граничные случаи
После внедрения расчёта проверьте его на датах, где чаще всего всплывают дефекты. Основные контрольные точки: переход через конец месяца (15 января + 30 дней = 14 февраля), переход через год (20 декабря + 30 дней = 19 января следующего года) и високосный февраль.
Быстрая проверка без отладчика — вывести результат через Сообщить() или в консоли кода:
Сообщить(Формат(ДобавитьКДате(Дата(2026,12,20), ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30), "ДЛФ=D"));
// Ожидаем: 19.01.2026
Если результат отличается на один день, почти всегда причина в трактовке: «через 30 дней» и «30-й день» — разные даты. Уточните у постановщика задачи, входит ли текущий день в отсчёт. При необходимости считать от следующего дня прибавляйте 31 или корректируйте логику явно.
Как проверить результат
14.02 того же года
13.02 или 15.02 — сбой в отсчёте или лишнее отсечение дня
19.01 следующего года
Дата осталась в текущем году или сбросился месяц
0:00:00 или 23:59:59 после НачалоДня/КонецДня
Произвольное время из исходной даты при сравнениях
Дата (или Дата с составом Дата и время)
Строка или Число — ошибка преобразования при записи
Частые вопросы
Чем ДобавитьКДате лучше прибавления секунд?
Для дней результат идентичен, но ДобавитьКДате читается явно и безопасна для месяцев и лет, где длина интервала непостоянна. Если в коде уже есть расчёты с месяцами, используйте функцию везде для единообразия.
Как прибавить 30 календарных дней с учётом производственного календаря?
Штатные функции работают только с календарными днями. Для рабочих дней нужен регистр «РегламентированныйПроизводственныйКалендарь» (в типовых конфигурациях) и перебор дат с проверкой вида дня. Готовой функции «прибавить рабочие дни» в платформе нет.
Почему после прибавления 30 дней дата сравнивается неправильно?
Чаще всего мешает время: исходная дата документа содержит часы и минуты, а сравнивается с началом текущего дня. Оберните расчёт в НачалоДня() или КонецДня() — в зависимости от того, входит ли последний день в срок.
Можно ли прибавить дни к дате в СКД без изменения запроса?
Да, через вычисляемое поле с выражением на языке выражений СКД или через функцию ДОБАВИТЬКДАТЕ прямо в запросе набора данных. Для простых случаев достаточно вычисляемого поля с выражением вида ДобавитьКДате(Дата, "День", 30).
Что будет, если прибавить дни к пустой дате (01.01.0001)?
Получится дата в январе года 1, что почти наверняка сломает дальнейшую логику и отчёты. Перед расчётом проверяйте заполненность: Если ЗначениеЗаполнено(ИсходнаяДата) Тогда ... КонецЕсли.
Что важно запомнить
Для прибавления 30 дней к дате в 1С используйте ДобавитьКДате(Дата, ТипЕдиницыИзмеренияИнтерваловДаты.ДЕНЬ, 30) или Дата + 30 * 86400. Отсекайте время через НачалоДня/КонецДня перед сравнениями, в запросах применяйте ДОБАВИТЬКДАТЕ, а результат проверяйте на границах месяца и года.