Разработка и Конфигурация · 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 в тексте запроса вызовет ошибку — только функция ДОБАВИТЬКДАТЕ.
Практические сценарии
Прибавить время к текущей дате
Частая задача — рассчитать срок от текущего момента, например дедлайн задачи через 4 часа:
Дедлайн = ТекущаяДатаСеанса() + 4 * 3600;
// или
Дедлайн = ДобавитьКДате(ТекущаяДатаСеанса(), "ЧАС", 4);
Установить конкретное время у даты без времени
Если дата получена без времени (например, НачалоДня(Дата) даёт 00:00:00) и нужно установить, скажем, 18:30, прибавьте соответствующее число секунд:
ДатаСобытия = НачалоДня(ДатаДокумента) + 18 3600 + 30 60;
// 18:30:00 того же дня
Конец дня для периодов в отчётах
Классический приём для включения последнего дня периода целиком — использовать КонецДня(Дата), который возвращает 23:59:59. Если функция недоступна в вашем контексте, эквивалент: НачалоДня(Дата) + 86399.
- 1Определите единицу сдвига: секунды/часы — сложением, месяцы/годы — через ДобавитьКДате
- 2Пересчитайте часы и минуты в секунды при сложении: Часы <em> 3600 + Минуты </em> 60
- 3Используйте ТекущаяДатаСеанса() как точку отсчёта, а не ТекущаяДата() на клиенте
- 4Проверьте результат через Сообщить() или отладчик в формате ДЛФ=DT
- 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. Для месяцев и лет используйте ДобавитьКДате, в запросах — ДОБАВИТЬКДАТЕ. Точку отсчёта берите из ТекущаяДатаСеанса(), а результат проверяйте выводом в полном формате даты и времени.