Разработка и Конфигурация · 8 мин
Как прибавить час к дате в 1С
Как прибавить час к дате в 1С: сложение с секундами, функция ДобавитьМесяц, работа с часовыми поясами, типичные ошибки и проверка результата.
В языке 1С нет отдельной функции «прибавить час» — но это не проблема. Дата во встроенном языке хранится с точностью до секунды, поэтому прибавление часа выполняется обычным сложением: к значению типа Дата добавляется число секунд. Один час — это 3600 секунд, и конструкция НоваяДата = СтараяДата + 3600; решает задачу в одну строку.
Такой подход работает одинаково в управляемых и обычных формах, в тонком и толстом клиенте, на сервере и в запросах с небольшими оговорками. Однако у простого сложения есть нюансы: переход через границу суток, часовые пояса, типы реквизитов «Дата» с составом «Дата» без времени. Ниже — все рабочие способы, их ограничения и способы проверки.
Как устроена дата в 1С и почему работает сложение с числом
Значение типа Дата в 1С хранит календарную дату и время с точностью до секунды. Над датами определены операции сложения и вычитания с числом, где число интерпретируется как количество секунд. Поэтому Дата + 1 прибавляет одну секунду, а не один день — это частая ошибка новичков, пришедших из других языков.
Вычитание двух дат возвращает разность в секундах. Это удобно для проверки результата: если (НоваяДата - СтараяДата) = 3600, значит час прибавлен корректно. Полезные константы для расчётов: минута — 60 секунд, час — 3600, сутки — 86400.
Базовый способ: сложение даты с секундами
Самый прямой вариант — сложить дату с числом 3600. Код выглядит так:
ИсходнаяДата = ТекущаяДата();
НоваяДата = ИсходнаяДата + 3600; // плюс один час
// несколько часов:
КоличествоЧасов = 5;
НоваяДата = ИсходнаяДата + КоличествоЧасов * 3600;
Для читаемости кода удобно вводить именованную переменную или константу СекундВЧасе = 3600, особенно если арифметика с датами встречается в модуле многократно. Это снимает вопрос «что означает магическое число» при последующей поддержке.
Обратите внимание: операция не изменяет исходную переменную — результат нужно присвоить. Строка ИсходнаяДата + 3600; без присваивания ничего не делает, и это одна из типичных причин «неработающего» кода.
ИсходнаяДата = ТекущаяДата();
НоваяДата = ИсходнаяДата + 3600; // прибавили 1 час
Сообщить(НоваяДата);Прибавление часа в запросе: ДОБАВИТЬКДАТЕ
В языке запросов арифметика с секундами недоступна — там используется функция ДОБАВИТЬКДАТЕ(Дата, Тип, Количество). Для часа второй параметр принимает значение ЧАС:
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Документ.Дата, ЧАС, 1) КАК ДатаПлюсЧас
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Функция поддерживает типы СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, ГОД и другие. Чтобы отнять час, передайте отрицательное количество: ДОБАВИТЬКДАТЕ(Дата, ЧАС, -1). Количество может быть выражением или параметром запроса.
Важное ограничение: ДОБАВИТЬКДАТЕ работает с целыми количествами указанного типа. Дробный час (например, 1,5) напрямую не передать — используйте МИНУТА с количеством 90 или секунды.
Функция ДобавитьМесяц и почему она не подходит для часов
Во встроенном языке есть функция ДобавитьМесяц(Дата, ЧислоМесяцев), которая корректно обрабатывает переход через конец месяца. Для часов, минут и дней аналогичной штатной функции нет — и она не нужна, потому что сложение с секундами автоматически корректно переносит значение через границы суток, месяцев и лет.
Например, если к 31.01.2026 23:30:00 прибавить 3600 секунд, результатом будет 01.02.2026 00:30:00. Никаких дополнительных проверок на переполнение писать не требуется — платформа делает это сама.
Часовые пояса и сеансовые даты
Функция ТекущаяДата() возвращает дату компьютера, на котором выполняется код: на сервере — серверную, на клиенте — клиентскую. Если сервер и пользователи находятся в разных часовых поясах, «прибавленный час» может оказаться не тем, что ожидал пользователь.
Для единообразия используйте ТекущаяДатаСеанса() — она учитывает часовой пояс сеанса и возвращает время так, как его видит пользователь. При работе с универсальным временем есть функции ТекущаяУниверсальнаяДата() и УниверсальноеВремя() для пересчёта.
Прибавление часа к дате само по себе не учитывает переходы на летнее время и смещения поясов — платформа хранит дату как абсолютное значение без информации о поясе. Если в учёте критичны часовые пояса (интеграции, расписания), храните время в UTC и пересчитывайте при отображении.
Типичные ошибки и ограничения
Первая группа ошибок связана с типами. Если реквизит объявлен с составом даты «Дата» (без времени), прибавление часа к его значению не даст видимого эффекта при записи — время будет отброшено. Проверьте состав даты реквизита в конфигураторе и при необходимости измените его на «Дата и время».
Вторая группа — путаница с единицами. Дата + 1 прибавляет секунду, а не день или час. Для дня нужно 86400 секунд. Чтобы не ошибаться, пишите множитель явно: Дата + 24 * 3600 читается однозначно.
Третья группа — попытка складывать дату со строкой или с датой. Выражение Дата1 + Дата2 недопустимо и вызовет ошибку; разность получают вычитанием. Также помните, что пустая дата (01.01.0001) после прибавления часа останется «почти пустой» — проверки на заполненность через ЗначениеЗаполнено() могут вести себя неожиданно.
Проверка результата и выбор способа
Проверить результат просто: вычтите исходную дату из новой — разность должна составить ровно 3600 секунд на каждый прибавленный час. Дополнительно убедитесь, что дата корректно перешла через полночь, если исходное время было поздним.
Как проверить результат
НоваяДата - ИсходнаяДата = 3600 × число часов
Разность отличается или равна нулю
День увеличился на 1 при времени после 23:00
Время изменилось, а день — нет
Время сохранилось в базе
Время обнулилось — состав даты «Дата» без времени
Выбор способа зависит от контекста. В коде модуля — сложение с секундами. В запросе и СКД — ДОБАВИТЬКДАТЕ. Для пользовательских сроков — ТекущаяДатаСеанса() как база. Для интеграций между системами — универсальное время с пересчётом при выводе.
Как выбрать действие
Часто задаваемые вопросы
Как отнять час от даты в 1С?
Вычтите 3600 секунд: НоваяДата = ИсходнаяДата - 3600. В запросе используйте ДОБАВИТЬКДАТЕ(Дата, ЧАС, -1) — отрицательное количество работает корректно.
Как прибавить полтора часа?
Переведите интервал в секунды или минуты: 1,5 часа = 5400 секунд, поэтому Дата + 5400. В запросе используйте ДОБАВИТЬКДАТЕ(Дата, МИНУТА, 90).
Почему после прибавления часа время не сохраняется в реквизите?
Скорее всего, у реквизита состав даты установлен как «Дата» без времени. Откройте свойства реквизита в конфигураторе и измените состав даты на «Дата и время». Учтите, что изменение затронет хранимые данные.
Работает ли сложение с секундами на границе месяца и года?
Да, платформа автоматически переносит значение: 31.12 23:30 + 3600 даст 01.01 следующего года 00:30. Отдельные проверки переполнения не требуются.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время компьютера, где выполняется код (на сервере — серверное). ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя и предпочтительна для расчёта пользовательских сроков.
Можно ли прибавить час к дате в СКД без запроса?
Да, в вычисляемых полях СКД доступна функция ДОБАВИТЬКДАТЕ языка выражений компоновки. Либо добавьте вычисляемое поле в сам запрос набора данных.
Что важно запомнить
Час прибавляется сложением даты с 3600 секундами в коде и функцией ДОБАВИТЬКДАТЕ(Дата, ЧАС, 1) в запросах. Проверяйте состав даты реквизита и используйте ТекущаяДатаСеанса() при работе с часовыми поясами.