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

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

1С: как прибавить к дате секунду

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

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

Чаще всего задача возникает при формировании границ периодов: например, чтобы получить «конец дня» как 23:59:59, при построении уникальных меток времени в цикле или при сравнении дат документов, идущих друг за другом. Неправильная работа с секундами — частая причина ошибок в отчётах и запросах.

Ниже разобраны оба способа с примерами кода, отличия платформы 8.3 в разных контекстах выполнения, типичные ошибки и способы проверить результат.

Способ 1: арифметическое сложение даты и числа

Тип «Дата» в 1С поддерживает операции сложения и вычитания с числами. Единица измерения при этом — секунда. То есть выражение Дата + 1 вернёт дату на одну секунду позже, а Дата - 1 — на секунду раньше.

ИсходнаяДата = Дата(2026, 5, 15, 12, 30, 45);

НоваяДата = ИсходнаяДата + 1; // 15.05.2026 12:30:46

Сообщить(НоваяДата);

Этот способ короткий и быстрый, но менее наглядный для тех, кто читает код: по записи + 3600 неочевидно, что добавляется час. Поэтому в командной разработке арифметику с датами часто заменяют на ДобавитьКДате().

Способ 2: функция ДобавитьКДате

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

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

НоваяДата = ДобавитьКДате(ИсходнаяДата, "СЕКУНДА", 1);

// Можно и убавить секунду:

ПредыдущаяДата = ДобавитьКДате(ИсходнаяДата, "СЕКУНДА", -1);

Допустимые значения второго параметра: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ. Регистр значения не имеет.

Преимущество функции — корректная обработка переходов через границы месяцев и лет при добавлении месяцев и лет, чего арифметическое сложение делать не умеет. Для секунд же оба способа эквивалентны.

Сравнение вариантов

Дата + 1

Короткая запись, подходит для секунд и минут. Минус — плохая читаемость при больших числах.

ДобавитьКДате(Дата, "СЕКУНДА", 1)

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

Дата + 24*60*60

Так иногда добавляют сутки. Работает, но лучше ДобавитьКДате с типом ДЕНЬ — нагляднее и безопаснее.

Практический пример: конец дня и граница периода

Классическая задача — получить момент «конец дня» для включения всех документов дня в выборку. Для этого от начала следующего дня отнимают одну секунду:

НачалоПериода = НачалоДня(ДатаОтчета);

КонецПериода = НачалоДня(ДатаОтчета + 86400) - 1; // 23:59:59

// Или через функцию:

КонецПериода = ДобавитьКДате(НачалоДня(ДобавитьКДате(ДатаОтчета, "ДЕНЬ", 1)), "СЕКУНДА", -1);

Более простой вариант — встроенная функция КонецДня(Дата), которая сразу возвращает 23:59:59 указанного дня. В запросах для тех же целей используют объект «Граница» с видом «Включая», чтобы не манипулировать секундами вручную.

Порядок действий для границы периода
  1. 1
    Определите начало периода через НачалоДня(Дата)
  2. 2
    Вычислите конец через КонецДня(Дата) или отнимите секунду от начала следующего дня
  3. 3
    В запросе используйте Границу с видом Включая, если нужен момент времени документа
  4. 4
    Проверьте результат выводом в сообщение или отладчиком

Добавление секунд в цикле и генерация уникальных меток

Иногда требуется создать последовательность дат с шагом в секунду — например, для тестовых данных или распределения записей по времени. Здесь удобно наращивать переменную в цикле:

ТекущаяМетка = НачалоДня(ТекущаяДатаСеанса());

Для Счетчик = 1 По 10 Цикл

ТекущаяМетка = ТекущаяМетка + 1; // +1 секунда на каждой итерации

// ... использование ТекущаяМетка

КонецЦикла;

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

Особенности и ограничения

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

Диапазон допустимых значений даты — с 01.01.0001 до 31.12.3999. При выходе за границы арифметика вернёт ошибку или некорректное значение, поэтому в расчётах с крайними датами стоит добавлять проверки.

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

Типичные ошибки при работе с секундами

Типичные ошибки
01
Сложение двух дат вместо даты и числа — приводит к ошибке выполнения
02
Ожидание, что Дата + 1 добавит день: на самом деле добавляется одна секунда
03
Забытое присвоение результата: ДобавитьКДате возвращает новое значение и не меняет исходную переменную
04
Использование ТекущаяДата() вместо ТекущаяДатаСеанса() на сервере — возможны расхождения по часовым поясам
05
Сравнение дат на равенство без учёта секунд: документы в одну дату, но в разное время, не совпадут

Отдельно отметим самую частую ошибку новичков: функция ДобавитьКДате() не изменяет переданную дату, а возвращает новую. Запись ДобавитьКДате(МояДата, "СЕКУНДА", 1); без присвоения результата ничего не делает.

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

Самый простой способ — вывести обе даты через Сообщить() или посмотреть значения в отладчике (Ctrl+Shift+F9 для запуска, точка останова на нужной строке). Дата выводится в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС, и разница в секунду видна сразу.

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

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

Значение новой даты
Норма

Время увеличилось ровно на 1 секунду

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

Время не изменилось — результат функции не присвоен переменной

Переход через минуту
Норма

12:30:59 + 1 даёт 12:31:00

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

Получено 12:30:60 — такого быть не должно, платформа сама переносит разряды

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

НоваяДата - ИсходнаяДата равна 1

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

Разность 0 или отрицательная — проверьте порядок операндов

Дополнительная проверка — вычитание: НоваяДата - ИсходнаяДата должно вернуть число 1. Это удобно использовать в автотестах и процедурах самоконтроля обработок.

Итог

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

К дате в 1С секунда добавляется либо операцией Дата + 1, либо функцией ДобавитьКДате(Дата, "СЕКУНДА", 1). Результат всегда нужно присваивать переменной. Для границ периодов удобнее КонецДня() и объект Граница в запросах.

Частые вопросы

Что вернёт выражение Дата1 - Дата2 в 1С?

Вычитание одной даты из другой возвращает число — количество секунд между ними. Если первая дата позже, результат положительный. Это удобно для измерения длительности операций.

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

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

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

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

Как прибавить к дате ровно сутки?

Лучше всего ДобавитьКДате(Дата, "ДЕНЬ", 1). Запись Дата + 86400 тоже работает, но менее читаема. Для смены календарной даты с сохранением времени подходит именно вариант с функцией.

Почему после ДобавитьКДате дата не изменилась?

Функция не меняет исходную переменную, а возвращает новое значение. Нужно присвоить результат: МояДата = ДобавитьКДате(МояДата, "СЕКУНДА", 1). Без присвоения вызов функции бесполезен.

Как в запросе 1С добавить секунду к дате?

В языке запросов есть функция ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, 1) с аналогичным синтаксисом. Для сравнения с концом периода в запросах чаще используют Границу с видом Включая вместо ручного вычитания секунды.