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