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

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

Как прибавить час к дате в 1С

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

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

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

Как устроена дата в 1С и почему работает сложение с числом

Значение типа Дата в 1С хранит календарную дату и время с точностью до секунды. Над датами определены операции сложения и вычитания с числом, где число интерпретируется как количество секунд. Поэтому Дата + 1 прибавляет одну секунду, а не один день — это частая ошибка новичков, пришедших из других языков.

Вычитание двух дат возвращает разность в секундах. Это удобно для проверки результата: если (НоваяДата - СтараяДата) = 3600, значит час прибавлен корректно. Полезные константы для расчётов: минута — 60 секунд, час — 3600, сутки — 86400.

Базовый способ: сложение даты с секундами

Самый прямой вариант — сложить дату с числом 3600. Код выглядит так:

ИсходнаяДата = ТекущаяДата();

НоваяДата = ИсходнаяДата + 3600; // плюс один час

// несколько часов:

КоличествоЧасов = 5;

НоваяДата = ИсходнаяДата + КоличествоЧасов * 3600;

Для читаемости кода удобно вводить именованную переменную или константу СекундВЧасе = 3600, особенно если арифметика с датами встречается в модуле многократно. Это снимает вопрос «что означает магическое число» при последующей поддержке.

Обратите внимание: операция не изменяет исходную переменную — результат нужно присвоить. Строка ИсходнаяДата + 3600; без присваивания ничего не делает, и это одна из типичных причин «неработающего» кода.

bsl
ИсходнаяДата = ТекущаяДата();
НоваяДата = ИсходнаяДата + 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) после прибавления часа останется «почти пустой» — проверки на заполненность через ЗначениеЗаполнено() могут вести себя неожиданно.

Типичные ошибки
01
Дата + 1 вместо Дата + 3600: прибавляется секунда, а не час
02
Результат сложения не присвоен переменной — исходная дата не меняется
03
Реквизит с составом «Дата» без времени: часы отбрасываются при записи
04
В запросе арифметика с секундами недоступна — нужна функция ДОБАВИТЬКДАТЕ
05
Использование ТекущаяДата() на сервере при разных часовых поясах пользователей

Проверка результата и выбор способа

Проверить результат просто: вычтите исходную дату из новой — разность должна составить ровно 3600 секунд на каждый прибавленный час. Дополнительно убедитесь, что дата корректно перешла через полночь, если исходное время было поздним.

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

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

Разность дат
Норма

НоваяДата - ИсходнаяДата = 3600 × число часов

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

Разность отличается или равна нулю

Переход через полночь
Норма

День увеличился на 1 при времени после 23:00

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

Время изменилось, а день — нет

Реквизит после записи
Норма

Время сохранилось в базе

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

Время обнулилось — состав даты «Дата» без времени

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

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

Как выбрать действие

Нужно прибавить час в коде модуляИспользуйте Дата + 3600 (или N * 3600 для нескольких часов)
Нужно прибавить час в запросе или СКДИспользуйте ДОБАВИТЬКДАТЕ(Дата, ЧАС, 1)
Расчёт сроков для пользователей в разных поясахБерите ТекущаяДатаСеанса() как исходную дату
Обмен данными между системами в разных поясахХраните и передавайте универсальное время (UTC)

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

Как отнять час от даты в 1С?

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

Как прибавить полтора часа?

Переведите интервал в секунды или минуты: 1,5 часа = 5400 секунд, поэтому Дата + 5400. В запросе используйте ДОБАВИТЬКДАТЕ(Дата, МИНУТА, 90).

Почему после прибавления часа время не сохраняется в реквизите?

Скорее всего, у реквизита состав даты установлен как «Дата» без времени. Откройте свойства реквизита в конфигураторе и измените состав даты на «Дата и время». Учтите, что изменение затронет хранимые данные.

Работает ли сложение с секундами на границе месяца и года?

Да, платформа автоматически переносит значение: 31.12 23:30 + 3600 даст 01.01 следующего года 00:30. Отдельные проверки переполнения не требуются.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает время компьютера, где выполняется код (на сервере — серверное). ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя и предпочтительна для расчёта пользовательских сроков.

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

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

Итог

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

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