Разработка и Конфигурация · 9 мин
Как добавить секунду к дате в 1С
Как прибавить секунду к дате в 1С: арифметика с типом Дата, функция ДобавитьСекунду, работа в запросах и типичные ошибки при округлении времени.
Добавление секунды к дате — одна из базовых операций при работе со временем в 1С. Она встречается при формировании уникальных меток времени, расчёте границ периодов, обработке документов с точностью до секунды и при отладке обменов данными. Встроенный язык 1С предлагает несколько способов решить эту задачу, и у каждого есть свои особенности.
Ключевой факт: тип «Дата» в 1С хранит значение с точностью до секунды, и арифметические операции с датами выполняются именно в секундах. Это значит, что прибавить секунду можно простым сложением — без специальных функций. Однако в запросах и при работе с границами периодов есть нюансы, о которых стоит знать.
Как устроена арифметика дат в 1С
Во встроенном языке 1С значение типа «Дата» поддерживает операции сложения и вычитания с числами. Число в этих операциях интерпретируется как количество секунд. Поэтому выражение Дата + 1 сдвигает дату ровно на одну секунду вперёд, а Дата - 1 — на одну секунду назад.
Разность двух дат тоже возвращает число секунд между ними. Это удобно для измерения длительности операций: Длительность = ТекущаяДата() - ДатаНачала; даст количество секунд, прошедших с момента начала.
Если из внешней системы приходит время с миллисекундами, при записи в реквизит типа «Дата» они будут отброшены. Для задач, где критична более высокая точность, используют универсальное время или отдельные числовые поля.
Добавление секунды простым сложением
Самый короткий и распространённый способ — сложение с единицей. Пример кода:
ДатаДокумента = ДокументОбъект.Дата;
НоваяДата = ДатаДокумента + 1; // на одну секунду позже
Если нужно добавить произвольное количество секунд, просто подставьте нужное число: Дата + 3600 сдвинет дату на час, Дата + 86400 — на сутки. Для минут и часов величины удобно вычислять выражением, чтобы код читался проще: Дата + 5 * 60 — плюс пять минут.
Такой подход работает везде, где доступен встроенный язык: в модулях объектов, форм, общих модулях, внешних обработках. Никаких дополнительных вызовов и контекстов не требуется.
НоваяДата = ИсходнаяДата + 1; // добавить одну секундуИспользование функции ДобавитьСекунду в запросах
В языке запросов 1С арифметика «дата плюс число» не работает — там применяется функция ДОБАВИТЬКДАТЕ. Она принимает три аргумента: исходную дату, единицу измерения (СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ и другие) и количество единиц.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Документы.Дата, СЕКУНДА, 1) КАК ДатаСоСдвигом
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
Типичный сценарий — построение непересекающихся интервалов. Если у вас есть периоды «с даты по дату» включительно, то границу следующего периода удобно получить сдвигом конца предыдущего на одну секунду. Это исключает попадание одной записи в два интервала.
Обратите внимание: третий аргумент может быть отрицательным, тогда функция вычитает время. ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, -1) вернёт дату на секунду раньше — это часто используют для получения момента «непосредственно перед» событием.
Типовые сценарии, где нужен сдвиг на секунду
На практике добавление секунды чаще всего встречается в нескольких ситуациях. Первая — формирование конца периода. Если отчёт строится «по дату включительно», а данные хранятся с точностью до секунды, то конец дня задаётся как КонецДня(Дата), что равнозначно 23:59:59. Если же нужно получить начало следующего периода, к концу дня добавляют одну секунду.
Вторая ситуация — обеспечение уникальности времени при программном создании документов. Если несколько документов создаются в цикле с одинаковой датой, иногда требуется развести их по времени: каждому следующему присваивают дату предыдущего плюс секунда. Это упрощает сортировку и восстановление последовательности.
Третий сценарий — сравнение моментов времени при обмене данными. При дельта-выгрузках часто запоминают дату последней выгрузки и отбирают изменения «позже этого момента». Чтобы не потерять записи, созданные ровно в секунду выгрузки, границу сдвигают на секунду назад или вперёд в зависимости от логики.
- 1Определите, где выполняется код: в модуле (используйте Дата + 1) или в запросе (используйте ДОБАВИТЬКДАТЕ)
- 2Убедитесь, что исходное значение имеет тип Дата, а не Строка — при необходимости преобразуйте
- 3Выполните сдвиг: НоваяДата = ИсходнаяДата + 1
- 4Проверьте результат выводом через Сообщить() или в отладчике: время должно увеличиться ровно на 1 секунду
- 5Если дата используется как граница периода — убедитесь, что включение/исключение границы соответствует логике отбора
Проверка результата и контроль типов
После операции полезно убедиться, что результат соответствует ожиданиям. Самый простой способ — вывести значение: Сообщить(НоваяДата); покажет дату в формате, заданном региональными настройками. Для точного контроля используйте функцию Формат(НоваяДата, "ДФ='dd.MM.yyyy HH:mm:ss'"), чтобы увидеть секунды явно.
Частая проблема — исходное значение оказывается строкой, а не датой. Сложение строки с числом либо вызовет ошибку, либо даст неожиданный результат конкатенации. Перед операцией проверяйте тип: Если ТипЗнч(Значение) = Тип("Дата") Тогда.. КонецЕсли;
Как проверить результат
ТипЗнч() возвращает «Дата»
Получилась строка или число — значит, исходное значение было не датой
НоваяДата - ИсходнаяДата = 1
Разница 0 или другое число — операция не выполнилась или применена дважды
Секунды увеличились на единицу, переход через минуту/сутки корректен
Время не изменилось — возможно, результат не присвоен переменной
Типичные ошибки и ограничения
Самая распространённая ошибка — попытка использовать сложение с числом в тексте запроса. Конструкция Дата + 1 в запросе вызовет ошибку синтаксиса: язык запросов требует ДОБАВИТЬКДАТЕ. Обратная ситуация тоже встречается: разработчик ищет функцию «ДобавитьКДате» во встроенном языке, хотя там она не нужна — достаточно сложения.
Вторая ошибка — забыть присвоить результат. Операция Дата + 1; сама по себе не меняет переменную, результат нужно сохранить: Дата = Дата + 1;. Это особенно коварно в циклах, где дата должна накапливать сдвиг.
Третий подводный камень — работа с границами периодов. Если вы строите отбор «с ДатаНачала по ДатаОкончания» и хотите захватить весь последний день, используйте КонецДня() или добавляйте сутки и вычитайте секунду. Простое указание даты без времени даст 00:00:00, и записи за этот день в выборку не попадут.
Отдельно стоит упомянуть часовые пояса. Функция ТекущаяДата() возвращает время компьютера, на котором выполняется код, а в клиент-серверном режиме серверное и клиентское время могут различаться. Если сдвиг на секунду участвует в логике синхронизации, опирайтесь на единый источник времени — например, дату, полученную на сервере.
Альтернативные подходы
Помимо сложения, для сдвига даты на крупные единицы (месяцы, годы) во встроенном языке применяют функцию ДобавитьМесяц(), поскольку длительность месяца в секундах непостоянна. Для секунд, минут, часов и дней такой функции нет — постоянная длительность позволяет обходиться сложением.
Если требуется сдвиг по сложному правилу — например, «следующая рабочая секунда с учётом календаря» — простой арифметики недостаточно. Такие задачи решаются через регистры сведений с производственными календарями и последовательный перебор дат.
Сравнение способов добавить секунду
Встроенный язык, модули, обработки. Самый быстрый и читаемый способ. Не работает в запросах.
Единственный вариант внутри текста запроса. Позволяет сдвигать на любые единицы времени, включая отрицательные значения.
Подходит для расчёта границ периодов, когда сдвиг на секунду — часть более широкой логики.
Что важно запомнить
Во встроенном языке 1С секунда добавляется сложением: Дата + 1. В запросах — функцией ДОБАВИТЬКДАТЕ с параметром СЕКУНДА. Результат всегда присваивайте переменной и проверяйте тип исходного значения. Тип «Дата» точен до секунды, миллисекунды не хранятся.
Частые вопросы
Как добавить к дате несколько секунд, например 30?
Прибавьте нужное число: НоваяДата = ИсходнаяДата + 30;. В запросе укажите количество третьим аргументом: ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, 30). Отрицательное число сдвинет дату назад.
Почему Дата + 1 не работает в запросе?
Язык запросов 1С не поддерживает арифметику дат с числами — это возможно только во встроенном языке. В запросе используйте функцию ДОБАВИТЬКДАТЕ с указанием единицы измерения СЕКУНДА.
Что произойдёт при добавлении секунды к 31.12 23:59:59?
Дата корректно перейдёт на 00:00:00 первого января следующего года. Арифметика дат в 1С самостоятельно обрабатывает переходы через границы суток, месяцев и лет, ручная корректировка не нужна.
Можно ли работать с миллисекундами в 1С?
Тип «Дата» хранит время только с точностью до секунды. Если из внешней системы приходят миллисекунды, они потеряются при записи в реквизит типа «Дата». Для хранения высокой точности используют отдельное числовое поле или строковое представление.
Как получить дату на секунду раньше заданной?
Вычтите единицу: ПредыдущийМомент = ИсходнаяДата - 1;. В запросе — ДОБАВИТЬКДАТЕ(Дата, СЕКУНДА, -1). Такой приём часто применяют для построения границ «строго до» указанного момента.
Чем отличается ТекущаяДата() на клиенте и на сервере?
На клиенте возвращается время компьютера пользователя, на сервере — время сервера. В распределённой системе они могут различаться. Если сдвиг на секунду участвует в логике обмена или отборов, получайте базовое время в одном месте, как правило на сервере.