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

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

Как перевести время в секунды в 1С

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

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

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

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

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

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

Доступные операции:

  • Дата1 - Дата2 — возвращает число секунд между датами (тип Число);
  • Дата + Число — прибавляет указанное количество секунд к дате;
  • Дата - Число — отнимает секунды от даты.

Из этого следует главное правило: если вам нужно «время в секундах», чаще всего достаточно обычного вычитания дат. Никаких специальных функций преобразования для этого не требуется.

Как получить количество секунд между двумя датами

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

НачалоОперации = ТекущаяДата();

// ... выполнение операции ...

КонецОперации = ТекущаяДата();

ДлительностьСекунд = КонецОперации - НачалоОперации;

Сообщить("Операция заняла " + ДлительностьСекунд + " сек.");

Результат будет целым числом, потому что точность типа Дата ограничена секундами. Если операция длится меньше секунды, разность покажет 0 — для измерения миллисекунд используйте другие средства, о них ниже.

Обратный пересчёт — из секунд в часы и минуты — делается целочисленным делением:

ВсегоСекунд = 7384;

Часов = Цел(ВсегоСекунд / 3600);

Минут = Цел((ВсегоСекунд - Часов * 3600) / 60);

Секунд = ВсегоСекунд % 60; // остаток

bsl
ДлительностьСекунд = КонецПериода - НачалоПериода; // число секунд между датами

Как перевести время дня в секунды с начала суток

Иногда требуется не интервал, а «положение времени внутри дня»: например, 14:30:15 должно превратиться в 52215 секунд. Для этого используется функция НачалоДня(), которая возвращает ту же дату с обнулённым временем:

ДатаВремя = ТекущаяДата();

СекундСНачалаДня = ДатаВремя - НачалоДня(ДатаВремя);

Если у вас есть только время без даты (например, значение из реквизита с составом даты «Время»), приём работает точно так же: платформа хранит его как дату с фиксированной календарной частью, и вычитание начала дня даст правильное число секунд.

Альтернативный способ — через функции извлечения компонентов времени:

СекундСНачалаДня = Час(ДатаВремя)  3600 + Минута(ДатаВремя)  60 + Секунда(ДатаВремя);

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

Два способа получить секунды с начала дня

Дата - НачалоДня(Дата)

Короткая запись, одно выражение. Подходит для любого значения типа Дата, включая реквизиты с составом «Время».

Час*3600 + Минута*60 + Секунда

Явно показывает состав времени, удобно при отладке и когда отдельные компоненты нужны ещё где-то. Чуть длиннее и требует аккуратности.

Как перевести строку вида «чч:мм:сс» в секунды

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

Функция ВремяВСекунды(СтрокаВремени) Экспорт

Части = СтрРазделить(СокрЛП(СтрокаВремени), ":");

Если Части.Количество() < 2 Тогда

Возврат 0;

КонецЕсли;

Часы = Число(Части[0]);

Минуты = Число(Части[1]);

Секунды = ?(Части.Количество() > 2, Число(Части[2]), 0);

Возврат Часы 3600 + Минуты 60 + Секунды;

КонецФункции

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

Если строка содержит полную дату со временем, надёжнее сначала преобразовать её в тип Дата (например, через Дата() с разбором компонентов или формат ISO 8601 через ПрочитатьДатуJSON), а затем уже вычитать начало дня.

Перевод строки времени в секунды
  1. 1
    Убедитесь, что строка имеет формат чч:мм:сс или чч:мм
  2. 2
    Разделите строку функцией СтрРазделить по символу двоеточия
  3. 3
    Преобразуйте каждую часть в число, подставив 0 для отсутствующих секунд
  4. 4
    Вычислите Часы*3600 + Минуты*60 + Секунды
  5. 5
    Проверьте результат на контрольном примере: 01:00:00 должно дать 3600

Как измерить интервалы точнее секунды

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

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();

// ... измеряемый код ...

ДлительностьМс = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;

ДлительностьСек = ДлительностьМс / 1000;

Функция доступна на сервере и в толстом клиенте; в тонком и веб-клиенте её применение ограничено, поэтому замеры производительности корректнее выполнять в серверном контексте. Учитывайте также, что функция возвращает универсальное время (UTC), но для измерения интервала это не важно — разность не зависит от часового пояса.

Как перевести секунды обратно во время и дату

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

ДатаОкончания = ДатаНачала + ДлительностьСекунд;

Если нужно получить значение типа Дата, содержащее только время (например, для реквизита с составом «Время»), прибавьте секунды к пустой дате или к началу произвольного дня:

ВремяКакДата = '00010101' + СекундСНачалаДня;

Для представления длительности пользователю в читаемом виде удобно форматировать число секунд вручную, собирая строку «чч:мм:сс» из компонентов, вычисленных целочисленным делением, как показано выше. Встроенная функция Формат() для чисел не умеет выводить длительность в таком виде напрямую.

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

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

Вторая ошибка — использование ТекущаяДата() дважды с предположением, что значения совпадут. Между двумя вызовами проходит реальное время, поэтому для сравнений сохраняйте значение в переменную один раз и работайте с ней.

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

Типичные ошибки
01
Умножение даты на 86400 по аналогии с Excel — в 1С дата не является числом дней, используйте вычитание дат
02
Двойной вызов ТекущаяДата() в одном сравнении — значения различаются, сохраняйте дату в переменную
03
Разбор строки времени без проверки количества частей — исключение на данных вида «9:5» или пустой строке
04
Смешение локального и универсального времени — разность искажается на величину смещения часового пояса
05
Ожидание дробных секунд от разности дат — тип Дата хранит время только с точностью до секунды

FAQ

Как получить секунды из реквизита с составом даты «Время»?

Вычтите из значения его начало дня: Секунды = РеквизитВремя - НачалоДня(РеквизитВремя). Хотя визуально реквизит показывает только время, внутри хранится полная дата, и приём работает без дополнительных преобразований.

Можно ли перевести секунды в формат «чч:мм:сс» одной функцией?

Встроенной функции для этого нет. Соберите строку вручную: часы — целочисленное деление на 3600, минуты — остаток, делённый на 60, секунды — остаток от деления на 60, затем дополните значения ведущими нулями через Формат(Значение, "ЧЦ=2; ЧВН=").

Почему разность двух одинаковых с виду дат не равна нулю?

Чаще всего даты получены в разном представлении времени: одна локальная, другая универсальная. Проверьте источники значений и приведите обе к одному виду, например через УниверсальноеВремя() или наоборот.

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

Используйте ТекущаяУниверсальнаяДатаВМиллисекундах() до и после участка кода и разделите разность на 1000. Учтите, что в тонком и веб-клиенте функция недоступна — выполняйте замер на сервере.

Что вернёт выражение Дата + Число, если число отрицательное?

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

Как перевести в секунды длительность из нескольких дней?

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

Итог

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

В 1С время в секундах получается вычитанием дат: Дата2 - Дата1 даёт число секунд. Секунды с начала дня — это Дата минус НачалоДня(Дата). Строку «чч:мм:сс» разбирают вручную с умножением на 3600 и 60. Для интервалов короче секунды используйте ТекущаяУниверсальнаяДатаВМиллисекундах(), а перед вычитанием приводите даты к одному часовому представлению.