Разработка и Конфигурация · 10 мин
Как перевести время в секунды в 1С
Как перевести время в секунды в 1С: работа с типом Дата, разностью дат, функциями и универсальными функциями пересчёта. Примеры кода и типичные ошибки.
В 1С нет отдельного примитивного типа «время»: время всегда хранится внутри значения типа Дата вместе с календарной датой. Поэтому задача «перевести время в секунды» на практике сводится к одному из трёх сценариев: получить количество секунд между двумя датами, извлечь число секунд, прошедших с начала дня, или преобразовать строку вида «чч:мм:сс» в числовое значение.
Ключевой момент, который нужно понять сразу: арифметика дат в 1С построена именно на секундах. Когда вы вычитаете одну дату из другой, результат — это число секунд между ними, а не дата и не дробное число дней. Это делает многие пересчёты тривиальными, если знать правильный приём.
Ниже разобраны рабочие способы пересчёта времени в секунды на встроенном языке 1С, различия для тонкого клиента и сервера, типичные ошибки и готовые функции, которые можно скопировать в общий модуль.
Как устроено хранение даты и времени в 1С
Тип Дата в 1С содержит календарную дату и время с точностью до одной секунды. Внутренне значение можно представить как количество секунд, прошедших от некоторой начальной точки, однако разработчику не нужно знать эту точку: язык сам поддерживает операции сложения и вычитания.
Доступные операции:
Дата1 - Дата2— возвращает число секунд между датами (тип Число);Дата + Число— прибавляет указанное количество секунд к дате;Дата - Число— отнимает секунды от даты.
Из этого следует главное правило: если вам нужно «время в секундах», чаще всего достаточно обычного вычитания дат. Никаких специальных функций преобразования для этого не требуется.
Как получить количество секунд между двумя датами
Самый частый сценарий — измерить длительность операции, интервал между событиями или срок хранения документа. Для этого достаточно вычесть начальную дату из конечной:
НачалоОперации = ТекущаяДата();
// ... выполнение операции ...
КонецОперации = ТекущаяДата();
ДлительностьСекунд = КонецОперации - НачалоОперации;
Сообщить("Операция заняла " + ДлительностьСекунд + " сек.");
Результат будет целым числом, потому что точность типа Дата ограничена секундами. Если операция длится меньше секунды, разность покажет 0 — для измерения миллисекунд используйте другие средства, о них ниже.
Обратный пересчёт — из секунд в часы и минуты — делается целочисленным делением:
ВсегоСекунд = 7384;
Часов = Цел(ВсегоСекунд / 3600);
Минут = Цел((ВсегоСекунд - Часов * 3600) / 60);
Секунд = ВсегоСекунд % 60; // остаток
ДлительностьСекунд = КонецПериода - НачалоПериода; // число секунд между датамиКак перевести время дня в секунды с начала суток
Иногда требуется не интервал, а «положение времени внутри дня»: например, 14:30:15 должно превратиться в 52215 секунд. Для этого используется функция НачалоДня(), которая возвращает ту же дату с обнулённым временем:
ДатаВремя = ТекущаяДата();
СекундСНачалаДня = ДатаВремя - НачалоДня(ДатаВремя);
Если у вас есть только время без даты (например, значение из реквизита с составом даты «Время»), приём работает точно так же: платформа хранит его как дату с фиксированной календарной частью, и вычитание начала дня даст правильное число секунд.
Альтернативный способ — через функции извлечения компонентов времени:
СекундСНачалаДня = Час(ДатаВремя) 3600 + Минута(ДатаВремя) 60 + Секунда(ДатаВремя);
Оба подхода дают одинаковый результат. Вариант с вычитанием короче и меньше подвержен ошибкам при ручном наборе, вариант с компонентами нагляднее при отладке.
Два способа получить секунды с начала дня
Короткая запись, одно выражение. Подходит для любого значения типа Дата, включая реквизиты с составом «Время».
Явно показывает состав времени, удобно при отладке и когда отдельные компоненты нужны ещё где-то. Чуть длиннее и требует аккуратности.
Как перевести строку вида «чч:мм:сс» в секунды
Когда время приходит извне — из файла обмена, веб-сервиса или текстового поля — оно обычно представлено строкой. Встроенной функции «строка в секунды» нет, поэтому строку разбирают вручную. Готовая функция для общего модуля:
Функция ВремяВСекунды(СтрокаВремени) Экспорт
Части = СтрРазделить(СокрЛП(СтрокаВремени), ":");
Если Части.Количество() < 2 Тогда
Возврат 0;
КонецЕсли;
Часы = Число(Части[0]);
Минуты = Число(Части[1]);
Секунды = ?(Части.Количество() > 2, Число(Части[2]), 0);
Возврат Часы 3600 + Минуты 60 + Секунды;
КонецФункции
Перед преобразованием строки в число полезно проверить, что части действительно числовые, иначе обращение Число() к некорректному значению вызовет исключение. Для проверки подойдёт конструкция Попытка ... Исключение или предварительная валидация регулярным выражением.
Если строка содержит полную дату со временем, надёжнее сначала преобразовать её в тип Дата (например, через Дата() с разбором компонентов или формат ISO 8601 через ПрочитатьДатуJSON), а затем уже вычитать начало дня.
- 1Убедитесь, что строка имеет формат чч:мм:сс или чч:мм
- 2Разделите строку функцией СтрРазделить по символу двоеточия
- 3Преобразуйте каждую часть в число, подставив 0 для отсутствующих секунд
- 4Вычислите Часы*3600 + Минуты*60 + Секунды
- 5Проверьте результат на контрольном примере: 01:00:00 должно дать 3600
Как измерить интервалы точнее секунды
Стандартный тип Дата не хранит доли секунды, поэтому для замеров производительности коротких операций разность дат не подходит. В таких случаях используют функцию ТекущаяУниверсальнаяДатаВМиллисекундах():
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... измеряемый код ...
ДлительностьМс = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
ДлительностьСек = ДлительностьМс / 1000;
Функция доступна на сервере и в толстом клиенте; в тонком и веб-клиенте её применение ограничено, поэтому замеры производительности корректнее выполнять в серверном контексте. Учитывайте также, что функция возвращает универсальное время (UTC), но для измерения интервала это не важно — разность не зависит от часового пояса.
Как перевести секунды обратно во время и дату
Обратное преобразование тоже выполняется арифметикой: прибавьте число секунд к базовой дате. Например, чтобы получить момент окончания задачи, зная старт и длительность:
ДатаОкончания = ДатаНачала + ДлительностьСекунд;
Если нужно получить значение типа Дата, содержащее только время (например, для реквизита с составом «Время»), прибавьте секунды к пустой дате или к началу произвольного дня:
ВремяКакДата = '00010101' + СекундСНачалаДня;
Для представления длительности пользователю в читаемом виде удобно форматировать число секунд вручную, собирая строку «чч:мм:сс» из компонентов, вычисленных целочисленным делением, как показано выше. Встроенная функция Формат() для чисел не умеет выводить длительность в таком виде напрямую.
Типичные ошибки при пересчёте времени в секунды
Первая распространённая ошибка — попытка умножить или разделить значение типа Дата, как будто это число дней, по аналогии с Excel. В 1С дата не является дробным числом дней, и выражения вида Дата * 86400 либо не имеют смысла, либо вызовут ошибку типов. Пересчёт делается только через вычитание дат и сложение даты с числом секунд.
Вторая ошибка — использование ТекущаяДата() дважды с предположением, что значения совпадут. Между двумя вызовами проходит реальное время, поэтому для сравнений сохраняйте значение в переменную один раз и работайте с ней.
Третья группа проблем связана со строками: нестрогий разбор «чч:мм:сс» без проверки количества частей и числового формата приводит к исключениям на реальных данных из внешних систем, где время может прийти как «9:5» или с лишними пробелами.
FAQ
Как получить секунды из реквизита с составом даты «Время»?
Вычтите из значения его начало дня: Секунды = РеквизитВремя - НачалоДня(РеквизитВремя). Хотя визуально реквизит показывает только время, внутри хранится полная дата, и приём работает без дополнительных преобразований.
Можно ли перевести секунды в формат «чч:мм:сс» одной функцией?
Встроенной функции для этого нет. Соберите строку вручную: часы — целочисленное деление на 3600, минуты — остаток, делённый на 60, секунды — остаток от деления на 60, затем дополните значения ведущими нулями через Формат(Значение, "ЧЦ=2; ЧВН=").
Почему разность двух одинаковых с виду дат не равна нулю?
Чаще всего даты получены в разном представлении времени: одна локальная, другая универсальная. Проверьте источники значений и приведите обе к одному виду, например через УниверсальноеВремя() или наоборот.
Как измерить выполнение кода короче одной секунды?
Используйте ТекущаяУниверсальнаяДатаВМиллисекундах() до и после участка кода и разделите разность на 1000. Учтите, что в тонком и веб-клиенте функция недоступна — выполняйте замер на сервере.
Что вернёт выражение Дата + Число, если число отрицательное?
Дата сдвинется назад на указанное количество секунд — это допустимая операция. Если результат уходит раньше минимально допустимой даты (01.01.0001), платформа вызовет ошибку, поэтому при вычитании больших интервалов проверяйте границы.
Как перевести в секунды длительность из нескольких дней?
Принцип тот же: вычтите начальную дату из конечной, разность уже будет в секундах с учётом суток. Если длительность задана как число дней, умножьте его на 86400 (количество секунд в сутках) и при необходимости прибавьте время.
Что важно запомнить
В 1С время в секундах получается вычитанием дат: Дата2 - Дата1 даёт число секунд. Секунды с начала дня — это Дата минус НачалоДня(Дата). Строку «чч:мм:сс» разбирают вручную с умножением на 3600 и 60. Для интервалов короче секунды используйте ТекущаяУниверсальнаяДатаВМиллисекундах(), а перед вычитанием приводите даты к одному часовому представлению.