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

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

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

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

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

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

Как устроена арифметика дат в 1С

Во встроенном языке 1С значение типа «Дата» поддерживает операции сложения и вычитания с числами. Число в этих операциях интерпретируется как количество секунд. Поэтому выражение Дата + 1 сдвигает дату ровно на одну секунду вперёд, а Дата - 1 — на одну секунду назад.

Разность двух дат тоже возвращает число секунд между ними. Это удобно для измерения длительности операций: Длительность = ТекущаяДата() - ДатаНачала; даст количество секунд, прошедших с момента начала.

Если из внешней системы приходит время с миллисекундами, при записи в реквизит типа «Дата» они будут отброшены. Для задач, где критична более высокая точность, используют универсальное время или отдельные числовые поля.

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

Самый короткий и распространённый способ — сложение с единицей. Пример кода:

ДатаДокумента = ДокументОбъект.Дата;

НоваяДата = ДатаДокумента + 1; // на одну секунду позже

Если нужно добавить произвольное количество секунд, просто подставьте нужное число: Дата + 3600 сдвинет дату на час, Дата + 86400 — на сутки. Для минут и часов величины удобно вычислять выражением, чтобы код читался проще: Дата + 5 * 60 — плюс пять минут.

Такой подход работает везде, где доступен встроенный язык: в модулях объектов, форм, общих модулях, внешних обработках. Никаких дополнительных вызовов и контекстов не требуется.

1c
НоваяДата = ИсходнаяДата + 1; // добавить одну секунду

Использование функции ДобавитьСекунду в запросах

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

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(Документы.Дата, СЕКУНДА, 1) КАК ДатаСоСдвигом

ИЗ

Документ.РеализацияТоваровУслуг КАК Документы

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

Обратите внимание: третий аргумент может быть отрицательным, тогда функция вычитает время. ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, -1) вернёт дату на секунду раньше — это часто используют для получения момента «непосредственно перед» событием.

Типовые сценарии, где нужен сдвиг на секунду

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

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

Третий сценарий — сравнение моментов времени при обмене данными. При дельта-выгрузках часто запоминают дату последней выгрузки и отбирают изменения «позже этого момента». Чтобы не потерять записи, созданные ровно в секунду выгрузки, границу сдвигают на секунду назад или вперёд в зависимости от логики.

Порядок действий при сдвиге даты на секунду
  1. 1
    Определите, где выполняется код: в модуле (используйте Дата + 1) или в запросе (используйте ДОБАВИТЬКДАТЕ)
  2. 2
    Убедитесь, что исходное значение имеет тип Дата, а не Строка — при необходимости преобразуйте
  3. 3
    Выполните сдвиг: НоваяДата = ИсходнаяДата + 1
  4. 4
    Проверьте результат выводом через Сообщить() или в отладчике: время должно увеличиться ровно на 1 секунду
  5. 5
    Если дата используется как граница периода — убедитесь, что включение/исключение границы соответствует логике отбора

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

После операции полезно убедиться, что результат соответствует ожиданиям. Самый простой способ — вывести значение: Сообщить(НоваяДата); покажет дату в формате, заданном региональными настройками. Для точного контроля используйте функцию Формат(НоваяДата, "ДФ='dd.MM.yyyy HH:mm:ss'"), чтобы увидеть секунды явно.

Частая проблема — исходное значение оказывается строкой, а не датой. Сложение строки с числом либо вызовет ошибку, либо даст неожиданный результат конкатенации. Перед операцией проверяйте тип: Если ТипЗнч(Значение) = Тип("Дата") Тогда.. КонецЕсли;

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

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

Тип значения после операции
Норма

ТипЗнч() возвращает «Дата»

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

Получилась строка или число — значит, исходное значение было не датой

Разница между исходной и новой датой
Норма

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

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

Разница 0 или другое число — операция не выполнилась или применена дважды

Отображение времени
Норма

Секунды увеличились на единицу, переход через минуту/сутки корректен

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

Время не изменилось — возможно, результат не присвоен переменной

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

Самая распространённая ошибка — попытка использовать сложение с числом в тексте запроса. Конструкция Дата + 1 в запросе вызовет ошибку синтаксиса: язык запросов требует ДОБАВИТЬКДАТЕ. Обратная ситуация тоже встречается: разработчик ищет функцию «ДобавитьКДате» во встроенном языке, хотя там она не нужна — достаточно сложения.

Вторая ошибка — забыть присвоить результат. Операция Дата + 1; сама по себе не меняет переменную, результат нужно сохранить: Дата = Дата + 1;. Это особенно коварно в циклах, где дата должна накапливать сдвиг.

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

Типичные ошибки
01
Использование Дата + 1 в тексте запроса — синтаксическая ошибка, нужна функция ДОБАВИТЬКДАТЕ
02
Отсутствие присваивания результата — переменная остаётся без изменений
03
Сравнение дат «на равенство» после сдвига вместо сравнения интервалов — условие не срабатывает
04
Ожидание миллисекундной точности — тип Дата хранит только секунды, дробная часть теряется

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

Альтернативные подходы

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

Если требуется сдвиг по сложному правилу — например, «следующая рабочая секунда с учётом календаря» — простой арифметики недостаточно. Такие задачи решаются через регистры сведений с производственными календарями и последовательный перебор дат.

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

Сложение: Дата + 1

Встроенный язык, модули, обработки. Самый быстрый и читаемый способ. Не работает в запросах.

ДОБАВИТЬКДАТЕ в запросе

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

КонецДня() / НачалоДня() + арифметика

Подходит для расчёта границ периодов, когда сдвиг на секунду — часть более широкой логики.

Итог

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

Во встроенном языке 1С секунда добавляется сложением: Дата + 1. В запросах — функцией ДОБАВИТЬКДАТЕ с параметром СЕКУНДА. Результат всегда присваивайте переменной и проверяйте тип исходного значения. Тип «Дата» точен до секунды, миллисекунды не хранятся.

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

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

Прибавьте нужное число: НоваяДата = ИсходнаяДата + 30;. В запросе укажите количество третьим аргументом: ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, 30). Отрицательное число сдвинет дату назад.

Почему Дата + 1 не работает в запросе?

Язык запросов 1С не поддерживает арифметику дат с числами — это возможно только во встроенном языке. В запросе используйте функцию ДОБАВИТЬКДАТЕ с указанием единицы измерения СЕКУНДА.

Что произойдёт при добавлении секунды к 31.12 23:59:59?

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

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

Тип «Дата» хранит время только с точностью до секунды. Если из внешней системы приходят миллисекунды, они потеряются при записи в реквизит типа «Дата». Для хранения высокой точности используют отдельное числовое поле или строковое представление.

Как получить дату на секунду раньше заданной?

Вычтите единицу: ПредыдущийМомент = ИсходнаяДата - 1;. В запросе — ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, -1). Такой приём часто применяют для построения границ «строго до» указанного момента.

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

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