Разработка и Конфигурация · 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);
Допустимые значения второго параметра: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ. Регистр значения не имеет.
Преимущество функции — корректная обработка переходов через границы месяцев и лет при добавлении месяцев и лет, чего арифметическое сложение делать не умеет. Для секунд же оба способа эквивалентны.
Сравнение вариантов
Короткая запись, подходит для секунд и минут. Минус — плохая читаемость при больших числах.
Явно указывает единицу измерения, единый стиль для любых интервалов. Предпочтительна в промышленном коде.
Так иногда добавляют сутки. Работает, но лучше ДобавитьКДате с типом ДЕНЬ — нагляднее и безопаснее.
Практический пример: конец дня и граница периода
Классическая задача — получить момент «конец дня» для включения всех документов дня в выборку. Для этого от начала следующего дня отнимают одну секунду:
НачалоПериода = НачалоДня(ДатаОтчета);
КонецПериода = НачалоДня(ДатаОтчета + 86400) - 1; // 23:59:59
// Или через функцию:
КонецПериода = ДобавитьКДате(НачалоДня(ДобавитьКДате(ДатаОтчета, "ДЕНЬ", 1)), "СЕКУНДА", -1);
Более простой вариант — встроенная функция КонецДня(Дата), которая сразу возвращает 23:59:59 указанного дня. В запросах для тех же целей используют объект «Граница» с видом «Включая», чтобы не манипулировать секундами вручную.
- 1Определите начало периода через НачалоДня(Дата)
- 2Вычислите конец через КонецДня(Дата) или отнимите секунду от начала следующего дня
- 3В запросе используйте Границу с видом Включая, если нужен момент времени документа
- 4Проверьте результат выводом в сообщение или отладчиком
Добавление секунд в цикле и генерация уникальных меток
Иногда требуется создать последовательность дат с шагом в секунду — например, для тестовых данных или распределения записей по времени. Здесь удобно наращивать переменную в цикле:
ТекущаяМетка = НачалоДня(ТекущаяДатаСеанса());
Для Счетчик = 1 По 10 Цикл
ТекущаяМетка = ТекущаяМетка + 1; // +1 секунда на каждой итерации
// ... использование ТекущаяМетка
КонецЦикла;
Обратите внимание: наращивать нужно одну и ту же переменную, а не каждый раз добавлять секунду к исходной дате — иначе все итерации дадут одинаковое значение.
Особенности и ограничения
Точность типа «Дата» в 1С ограничена секундами — доли секунд хранить нельзя. Если нужна большая точность (например, для замеров производительности), используют функцию ТекущаяУниверсальнаяДатаВМиллисекундах(), но она возвращает число, а не дату.
Диапазон допустимых значений даты — с 01.01.0001 до 31.12.3999. При выходе за границы арифметика вернёт ошибку или некорректное значение, поэтому в расчётах с крайними датами стоит добавлять проверки.
Ещё один нюанс: ТекущаяДатаСеанса() при частых вызовах может возвращать одно и то же значение в пределах секунды. Если нужны гарантированно различающиеся метки, полагайтесь на приращение переменной, а не на повторные вызовы функции.
Типичные ошибки при работе с секундами
Отдельно отметим самую частую ошибку новичков: функция ДобавитьКДате() не изменяет переданную дату, а возвращает новую. Запись ДобавитьКДате(МояДата, "СЕКУНДА", 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) с аналогичным синтаксисом. Для сравнения с концом периода в запросах чаще используют Границу с видом Включая вместо ручного вычитания секунды.