Как в 1С получить текущую дату плюс 3 часа?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие часто возникает задача вычисления будущей или прошедшей даты относительно текущего момента. Например, это требуется для установки срока действия задачи, планирования оплат или расчета времени доставки. Разберем по шагам, как правильно прибавить 3 часа к текущему времени во встроенном языке и в запросах, а также проанализируем важные нюансы, которые уберегут ваш код от ошибок.

Способ 1. Математическое сложение во встроенном языке

В 1С значения типа Дата хранят время с точностью до секунды. Если прибавить к переменной типа Дата обычное число, платформа интерпретирует его как количество секунд. Для прибавления 3 часов нам необходимо перевести это время в секунды:

3 часа * 60 минут * 60 секунд = 10 800 секунд

Посмотрим на классический пример реализации этой операции:


// Самый простой способ прибавления 3 часов
НоваяДата = ТекущаяДата() + 3 * 60 * 60;

Или в упрощенном виде, используя уже вычисленное количество секунд:

НоваяДата = ТекущаяДата() + 10800;

Важные нюансы работы со временем в клиент-серверной архитектуре

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

Рассмотрим более надежные альтернативные методы получения времени:

  1. ТекущаяДатаСеанса() — возвращает время сервера, но автоматически приведенное к часовому поясу конкретного сеанса пользователя. Рекомендуется использовать именно этот метод для большинства бизнес-задач.
  2. ТекущаяУниверсальнаяДата() — возвращает текущее серверное время в стандарте UTC (по Гринвичу). Отличный выбор, если необходимо хранить единое время для филиалов по всему миру.

С учетом этих рекомендаций безопасный код будет выглядеть так:

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

Риски математического сложения дат

Хотя прибавление секунд напрямую выглядит простым, проанализируем возможные скрытые угрозы этого подхода:

Способ 2. Прибавление времени в запросах 1С

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

Разберем пример получения даты со смещением на 3 часа через запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ДОБАВИТЬКДАТЕ(&ИсходнаяДата, ЧАС, 3) КАК Плюс3Часа";
    
Запрос.УстановитьПараметр("ИсходнаяДата", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ТекущаяДатаПлюс3Часа = Выборка.Плюс3Часа;
КонецЕсли;

Функция ДОБАВИТЬКДАТЕ принимает три параметра:

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

Учет рабочих часов при расчете времени

В реальных бизнес-задачах требование «прибавить 3 часа» часто связано с расчетом дедлайнов (SLA, время ответа на обращение клиента). Если вы просто математически прибавите 3 часа к пятничному вечеру, то срок исполнения задачи выпадет на глубокую ночь или выходной день.

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

← На главную