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

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

Как в 1С прибавить к дате время

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

Во встроенном языке 1С дата и время хранятся в одном значении типа «Дата» с точностью до секунды. Поэтому «прибавить время к дате» — это на самом деле обычное сложение: к значению даты добавляется количество секунд. Никаких отдельных типов «время» в платформе нет, и это упрощает задачу, но требует понимания единиц измерения.

Самый простой способ — арифметическое сложение: НоваяДата = ИсходнаяДата + 3600; добавит один час, так как 3600 — это число секунд в часе. Для более читаемого кода используется функция ДобавитьКДате(), а в запросах — функция языка запросов ДОБАВИТЬКДАТЕ. Каждый из вариантов имеет свои ограничения и области применения.

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

Как устроен тип «Дата» в 1С и почему время — это секунды

Тип «Дата» в платформе 1С содержит календарную дату и время суток одновременно. Внутренне значение хранится с точностью до секунды, и все арифметические операции с датами выполняются именно в секундах. Когда вы пишете Дата1 + 60, платформа прибавляет ровно одну минуту.

Из этого следуют базовые коэффициенты пересчёта, которые нужно держать в голове или выносить в константы:

  • 1 минута = 60 секунд;
  • 1 час = 3600 секунд;
  • 1 сутки = 86400 секунд;
  • 1 неделя = 604800 секунд.

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

Прибавление времени простым сложением секунд

Базовый вариант — сложение даты с числом. Число трактуется как количество секунд, поэтому для прибавления часов и минут их нужно предварительно пересчитать:

ИсходнаяДата = Дата(2026, 5, 15, 10, 30, 0); // 15.05.2026 10:30:00

// Прибавить 2 часа 45 минут

НоваяДата = ИсходнаяДата + 2 3600 + 45 60;

// Результат: 15.05.2026 13:15:00

// Прибавить 90 секунд

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

// Результат: 15.05.2026 10:31:30

Чтобы код читался лучше, коэффициенты удобно выносить в переменные или функции общего модуля:

Функция ПрибавитьВремя(ИсходнаяДата, Часы = 0, Минуты = 0, Секунды = 0) Экспорт

Возврат ИсходнаяДата + Часы 3600 + Минуты 60 + Секунды;

КонецФункции

Вычитание работает симметрично: Дата - 3600 отнимет час. А разность двух дат (Дата2 - Дата1) вернёт число — количество секунд между ними. Это удобно для расчёта длительности операций, например времени выполнения заказа.

Функция ДобавитьКДате: сдвиг на часы, дни, месяцы

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

ИсходнаяДата = Дата(2026, 1, 31, 14, 0, 0);

// Прибавить 5 часов

Результат = ДобавитьКДате(ИсходнаяДата, "ЧАС", 5);

// 31.01.2026 19:00:00

// Прибавить 1 месяц — календарно корректно

Результат = ДобавитьКДате(ИсходнаяДата, "МЕСЯЦ", 1);

// 29.02.2026 14:00:00 (а не несуществующее 31 февраля)

// Отнять 3 дня — количество со знаком минус

Результат = ДобавитьКДате(ИсходнаяДата, "ДЕНЬ", -3);

// 28.01.2026 14:00:00

Главное преимущество функции — корректная обработка границ месяцев. Прибавление месяца к 31 января даёт последний день февраля, а не ошибку и не «переход» на март. Простым сложением секунд такого результата добиться нельзя без дополнительных проверок.

Обращение к функции регистронезависимо, но строку типа единицы лучше писать точно по документации — при неверном значении платформа выдаст ошибку исполнения.

Прибавление времени в запросах

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

ВЫБРАТЬ

Заказы.Ссылка,

ДОБАВИТЬКДАТЕ(Заказы.Дата, ЧАС, 3) КАК КрайнийСрок

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ГДЕ

Заказы.Дата >= ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -7)

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

Учтите ограничение: в запросах нельзя складывать дату с числом напрямую, как во встроенном языке. Выражение Дата + 3600 в тексте запроса вызовет ошибку — только функция ДОБАВИТЬКДАТЕ.

Типичные ошибки
01
Сложение даты с числом в запросе — язык запросов этого не поддерживает, нужна функция ДОБАВИТЬКДАТЕ
02
Прибавление месяца секундами (30 * 86400) — длительность месяцев разная, результат будет неверным; используйте ДобавитьКДате с типом МЕСЯЦ
03
Путаница единиц: разработчик прибавляет 60, ожидая час, а получает минуту — всегда пересчитывайте часы и минуты в секунды
04
Использование ТекущаяДата() на клиенте при расчёте сроков в распределённой системе — из-за часовых поясов сроки «плывут»; применяйте ТекущаяДатаСеанса()

Практические сценарии

Прибавить время к текущей дате

Частая задача — рассчитать срок от текущего момента, например дедлайн задачи через 4 часа:

Дедлайн = ТекущаяДатаСеанса() + 4 * 3600;

// или

Дедлайн = ДобавитьКДате(ТекущаяДатаСеанса(), "ЧАС", 4);

Установить конкретное время у даты без времени

Если дата получена без времени (например, НачалоДня(Дата) даёт 00:00:00) и нужно установить, скажем, 18:30, прибавьте соответствующее число секунд:

ДатаСобытия = НачалоДня(ДатаДокумента) + 18  3600 + 30  60;

// 18:30:00 того же дня

Конец дня для периодов в отчётах

Классический приём для включения последнего дня периода целиком — использовать КонецДня(Дата), который возвращает 23:59:59. Если функция недоступна в вашем контексте, эквивалент: НачалоДня(Дата) + 86399.

Порядок действий при расчёте срока
  1. 1
    Определите единицу сдвига: секунды/часы — сложением, месяцы/годы — через ДобавитьКДате
  2. 2
    Пересчитайте часы и минуты в секунды при сложении: Часы <em> 3600 + Минуты </em> 60
  3. 3
    Используйте ТекущаяДатаСеанса() как точку отсчёта, а не ТекущаяДата() на клиенте
  4. 4
    Проверьте результат через Сообщить() или отладчик в формате ДЛФ=DT
  5. 5
    Для запросов замените сложение на ДОБАВИТЬКДАТЕ и передайте дату параметром

Проверка результата и отладка

Быстрее всего проверить вычисление — вывести значение в явном формате:

Сообщить(Формат(НоваяДата, "ДЛФ=DT"));

// выведет, например: 15.05.2026 13:15:00

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

При работе в тонком клиенте помните про деление на серверные и клиентские вызовы: ТекущаяДата() в клиентском контексте вернёт время компьютера пользователя, что при расчёте бизнес-сроков недопустимо.

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

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

Формат вывода даты
Норма

Время отображается и соответствует расчёту

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

Время 00:00:00 — где-то применён НачалоДня или реквизит хранит только дату

Сдвиг через границу месяца
Норма

31.01 + 1 месяц = последний день февраля

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

Получилось 2–3 марта — вероятно, месяц прибавляли секундами

Сроки в распределённой работе
Норма

Все пользователи видят одинаковый срок

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

Сроки отличаются на часы — использована ТекущаяДата() клиента

Часто задаваемые вопросы

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

Умножьте минуты на 60 и сложите с датой: НоваяДата = Дата + 30 * 60;. Альтернатива — ДобавитьКДате(Дата, "МИНУТА", 30), что читается нагляднее в сложных выражениях.

Можно ли складывать две даты между собой?

Нет, сложение двух дат лишено смысла и вызовет ошибку. Допустимы операции «дата + число» (сдвиг вперёд на секунды), «дата − число» (сдвиг назад) и «дата − дата» (разность в секундах).

Как прибавить к дате только время из другой даты?

Извлеките время как число секунд от начала дня: СекундыВремени = ДатаИсточник - НачалоДня(ДатаИсточник);, затем прибавьте к нужной дате: Результат = НачалоДня(ЦелеваяДата) + СекундыВремени;.

Почему ДОБАВИТЬКДАТЕ в запросе возвращает NULL?

Чаще всего исходное поле даты содержит NULL (например, после левого соединения). Добавьте проверку через ЕСТЬNULL или отфильтруйте записи с незаполненной датой в условии ГДЕ.

Как прибавить рабочие дни, а не календарные?

Штатной арифметики для рабочих дней нет. Используйте регистр сведений с производственным календарём: в цикле или запросе отсчитывайте нужное количество дней с видом «рабочий день». Простое сложение секунд здесь не подходит.

Что произойдёт при прибавлении секунд через полночь?

Платформа корректно перенесёт значение на следующие сутки: 23:30:00 + 3600 даст 00:30:00 следующего дня. Никаких дополнительных проверок для перехода через сутки, месяц или год не требуется.

Итог

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

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