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

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

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

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

Прибавить к дате время в 1С — типовая задача, которая возникает при расчёте сроков доставки, планировании производства, установке напоминаний и работе с расписаниями. Особенность платформы в том, что тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды, поэтому сложение выполняется через секунды.

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

Ниже разобраны все практические способы: от простого сложения до учёта часовых поясов и получения текущего времени на клиенте и сервере. Примеры кода пригодны для встроенного языка 1С в управляемых и обычных формах.

Как устроен тип «Дата» и почему время складывают в секундах

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

Такое устройство типа даёт важное следствие: любые операции с временем сводятся к арифметике. Чтобы прибавить 15 минут, нужно прибавить 900 секунд, чтобы прибавить сутки — 86400 секунд. Для удобства чтения кода принято записывать множители явно: 24 60 60 вместо 86400.

Ограничение этого подхода — месяцы и годы. Их длина непостоянна (28–31 день, високосные годы), поэтому прибавлять месяц как 30 * 86400 секунд нельзя: результат будет смещаться. Для календарных сдвигов предназначена функция ДобавитьМесяц(), о которой ниже.

Как получить текущую дату и время

Прежде чем прибавлять время, нужно получить исходную точку. В 1С есть несколько функций, и выбор между ними влияет на корректность результата.

ТекущаяДата() на клиенте

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

ТекущаяДатаСеанса() на сервере

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

// На сервере — единое время сеанса

ТекущееВремя = ТекущаяДатаСеанса();

// На клиенте — время рабочей станции

ВремяНаКлиенте = ТекущаяДата();

Как прибавить часы, минуты и секунды к дате

Основной приём — сложение даты с числом секунд. Ниже типовые примеры, которые можно переносить в код напрямую.

// Прибавить 1 час

НоваяДата = ТекущаяДатаСеанса() + 3600;

// Прибавить 30 минут

НоваяДата = ТекущаяДатаСеанса() + 30 * 60;

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

НоваяДата = ТекущаяДатаСеанса() + (1 3600) + (45 60);

// Прибавить сутки

НоваяДата = ТекущаяДатаСеанса() + 24 60 60;

Тот же приём работает и для вычитания: чтобы узнать, какое время было 2 часа назад, вычтите 7200 секунд. Разность двух дат также даёт число секунд, что удобно для измерения длительности операций.

Если нужно прибавить время, заданное пользователем в отдельных полях (часы и минуты), соберите итоговое количество секунд перед сложением:

Часы = 2;

Минуты = 15;

СекундВсего = Часы 3600 + Минуты 60;

СрокВыполнения = ТекущаяДатаСеанса() + СекундВсего;

1c
// Прибавить к дате документа 2 часа 30 минут
НоваяДата = ДатаДокумента + 2 <em> 3600 + 30 </em> 60;

Как прибавить дни, месяцы и годы

Дни можно прибавлять через секунды, но для месяцев и лет используйте функцию ДобавитьМесяц(). Она корректно обрабатывает разную длину месяцев и переход через год.

// Прибавить 3 месяца

НоваяДата = ДобавитьМесяц(ТекущаяДатаСеанса(), 3);

// Отнять 1 месяц

НоваяДата = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);

// Прибавить год = 12 месяцев

НоваяДата = ДобавитьМесяц(ТекущаяДатаСеанса(), 12);

Обратите внимание на поведение функции на границах: если к 31 января прибавить месяц, результатом будет последний день февраля (28 или 29 число), а не «переполнение» в март. Это ожидаемое поведение платформы, и его нужно учитывать при расчёте повторяющихся платежей и сроков.

Сравнение способов

Сложение с секундами (Дата + N)

Подходит для часов, минут, секунд и суток. Просто и быстро, но нельзя применять к месяцам и годам из-за их переменной длины.

ДобавитьМесяц()

Единственный корректный способ сдвига на месяцы и годы. Учитывает разную длину месяцев и високосные годы.

НачалоДня/КонецДня + сдвиг

Используется, когда нужно получить не произвольное время, а границу суток: например, конец дня через три дня.

Как прибавить время к дате без времени и к границам периода

Частая ситуация: в реквизите хранится только дата (время 00:00:00), а нужно получить конкретный момент — например, 18:00 того же дня. Здесь помогают функции НачалоДня() и КонецДня().

// 18:00 сегодня

НужноеВремя = НачалоДня(ТекущаяДатаСеанса()) + 18 * 3600;

// Конец завтрашнего дня

КонецЗавтра = КонецДня(ТекущаяДатаСеанса() + 86400);

// Начало дня конкретной даты из реквизита

Начало = НачалоДня(ДатаОтгрузки);

Функция КонецДня() возвращает 23:59:59 указанной даты. Это важно при построении отчётов и запросов по периодам: если сравнивать дату документа с полночью конечной даты, документы за последний день выпадут из выборки.

Порядок действий для типовой задачи
  1. 1
    Определите контекст выполнения: на сервере используйте ТекущаяДатаСеанса(), на клиенте — ТекущаяДата()
  2. 2
    Проверьте, что исходная дата заполнена (ЗначениеЗаполнено)
  3. 3
    Переведите прибавляемое время в секунды (часы <em> 3600 + минуты </em> 60)
  4. 4
    Сложите дату и секунды; для месяцев и лет используйте ДобавитьМесяц()
  5. 5
    Проверьте результат через Сообщить() или отладчик, сравнив с ожидаемым значением

Типичные ошибки и ограничения

Первая распространённая ошибка — попытка складывать дату со строкой или с временем, представленным как строка вида «14:30». Встроенный язык не выполнит такое сложение: строку нужно предварительно разобрать на часы и минуты и преобразовать в секунды.

Вторая ошибка — использование ТекущаяДата() в серверном коде при файловой работе, где клиент и сервер фактически на одной машине, с последующим переносом базы в клиент-серверный режим. После переезда время начнёт браться с рабочих станций, и данные «поплывут». В серверных процедурах всегда применяйте ТекущаяДатаСеанса().

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

Типичные ошибки
01
Прибавление месяца как 30 * 86400 секунд — сдвиг накапливается, и через несколько операций дата уходит от ожидаемой
02
Использование ТекущаяДата() на сервере — время начинает зависеть от настроек клиентских машин
03
Сравнение дат без учёта времени: документ за конечный день периода не попадает в отбор, если граница задана как 00:00:00
04
Сложение с незаполненной датой — результат вычисляется от 1 января 1 года и выглядит как «мусор»
05
Округление при делении секунд: 3600 / 60 даёт целое, но неочевидные дробные интервалы лучше задавать явно

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

Самый быстрый способ проверки — вывести полученную дату через Сообщить() или посмотреть значение в отладчике. Формат вывода по умолчанию показывает и дату, и время, поэтому сразу видно, корректно ли прибавились часы и минуты.

НоваяДата = ТекущаяДатаСеанса() + 2 * 3600;

Сообщить("Было: " + ТекущаяДатаСеанса() + ", стало: " + НоваяДата);

// Проверка разности: должно быть ровно 7200 секунд

Разность = НоваяДата - ТекущаяДатаСеанса();

Сообщить("Разность в секундах: " + Разность);

Если результат отличается от ожидаемого ровно на час или несколько часов, почти наверняка дело в часовом поясе сеанса или в смешении серверного и клиентского времени. Проверьте, какая функция использовалась для получения исходной даты.

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

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

Разность новой и исходной даты
Норма

Равна ровно заданному числу секунд (например, 7200 для двух часов)

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

Разность отличается или содержит дробную часть — проверьте формулу пересчёта

Время в выведенной дате
Норма

Часы и минуты соответствуют ожиданию

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

Смещение на целые часы — вероятна проблема с часовым поясом сеанса

ДобавитьМесяц на границе месяца
Норма

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

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

Дата «провалилась» в март — значит, использовалось сложение секунд вместо ДобавитьМесяц

FAQ

Как прибавить к дате только время, если оно задано строкой «14:30»?

Разберите строку на часы и минуты (например, через СтрРазделить по двоеточию), преобразуйте части в числа и вычислите секунды: Часы 3600 + Минуты 60. Затем сложите результат с началом дня нужной даты: НачалоДня(Дата) + Секунды.

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

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

Можно ли прибавить к дате дробное число секунд?

Нет, точность типа «Дата» ограничена секундой. Дробная часть при сложении будет отброшена. Если нужна более точная фиксация моментов, используйте универсальную дату в миллисекундах через ТекущаяУниверсальнаяДатаВМиллисекундах() и храните её как число.

Как узнать, сколько минут между двумя датами?

Вычтите одну дату из другой — результатом будет число секунд. Разделите его на 60: Минуты = (Дата2 - Дата1) / 60. Для целого числа минут примените Цел() или округление в зависимости от требуемой логики.

Почему после прибавления часа время сместилось ещё на час при выводе?

Наиболее вероятная причина — смешение времени сервера и клиента в разных часовых поясах. Проверьте, какой функцией получена исходная дата, и убедитесь, что все вычисления выполняются в одном контексте, желательно на сервере через ТекущаяДатаСеанса().

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

Встроенной функции для рабочих дней нет. Используйте календарь из регистра сведений «Регламентированный производственный календарь» (в типовых конфигурациях) или собственный график: в цикле прибавляйте по одному дню и проверяйте, является ли день рабочим по календарю.

Итог

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

Время в 1С прибавляется к дате сложением с секундами: час = 3600, сутки = 86400. Месяцы и годы добавляйте только через ДобавитьМесяц(). На сервере используйте ТекущаяДатаСеанса(), проверяйте заполненность исходной даты и не смешивайте клиентское и серверное время в одном расчёте.