В процессе разработки интеграций с веб-сервисами, работы с API сторонних систем или при реализации собственных алгоритмов логирования программисты 1С часто сталкиваются с необходимостью перевода даты в секунды. Это может быть как расчет количества секунд, прошедших с начала текущего дня, так и вычисление стандартного временного штампа Unix Timestamp (количества секунд, прошедших с 1 января 1970 года). В этой статье мы подробно разберем, как решить эти задачи изящно, избегая громоздкого ручного парсинга строк и арифметических ошибок.
Прежде чем переходить к алгоритмам преобразования, важно вспомнить фундаментальное свойство платформы 1С:Предприятие. При вычитании одной даты из другой платформа всегда возвращает разность в секундах (тип Число). Это избавляет нас от необходимости вручную переводить часы в минуты, а минуты в секунды.
Рассмотрим простейший пример, демонстрирующий это поведение:
РазностьВСекундах = ТекущаяДата() - НачалоДня(ТекущаяДата());
В результате этой несложной операции в переменную РазностьВСекундах запишется точное количество секунд, прошедших с полуночи текущего дня. Этот базовый принцип мы и будем использовать для всех последующих вычислений.
---
Часто исходные данные приходят к нам в текстовом виде — например, «25.10.2026 14:30». Прежде чем вычитать даты, нам нужно корректно преобразовать строку в объект типа Дата. Разберем три наиболее изящных способа сделать это.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вам не нужно писать собственный велосипед для разбора строки. В составе БСП есть готовые надежные инструменты в общем модуле СтроковыеФункцииКлиентСервер.
Рассмотрим пример использования:
ИсходнаяСтрока = "25.10.2026 14:30";
// Функция автоматически распознает популярные разделители
НашаДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);
Этот метод безопасен, протестирован на множестве конфигураций и учитывает различные варианты заполнения строки (наличие или отсутствие секунд, разные разделители).
Если БСП в вашей базе отсутствует (например, вы работаете в полностью самописной конфигурации), самым быстрым решением будет приведение строки к внутреннему стандарту платформы ГГГГММДДЧЧММСС. Для этого достаточно убрать лишние символы разделителей.
Разберем по шагам, как выполнить это преобразование:
ИсходнаяСтрока = "25.10.2026 14:30";
// Очищаем строку от точек, двоеточий и пробелов
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, ".", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");
// Теперь строка имеет вид "251020261430"
// Перегруппируем символы в формат ГГГГММДДЧЧММСС
КаноническаяСтрока = Сред(ЧистаяСтрока, 5, 4) // Год (2026)
+ Сред(ЧистаяСтрока, 3, 2) // Месяц (10)
+ Сред(ЧистаяСтрока, 1, 2) // День (25)
+ Сред(ЧистаяСтрока, 9, 4) // Время (1430)
+ "00"; // Секунды по умолчанию
НашаДата = Дата(КаноническаяСтрока);
Этот способ работает очень быстро на уровне платформы и не требует обращения к сторонним библиотекам.
Если вы получаете данные из внешних систем в стандартном международном формате (например, ISO 8601 вида 2026-10-25T14:30:00), то разбирать их вручную вообще не имеет смысла. Платформа 1С умеет делать это "из коробки" в одну строку:
// Вариант через XMLЗначение
НашаДата = XMLЗначение(Тип("Дата"), "2026-10-25T14:30:00");
// Вариант через чтение JSON
НашаДата = ПрочитатьДатуJSON("""2026-10-25T14:30:00""", ФорматДатыJSON.ISO);
---
Одной из наиболее частых задач перевода даты в секунды является получение Unix Timestamp (количества секунд с 01.01.1970). На форумах часто предлагают простое решение:
// ВНИМАНИЕ: Этот код содержит скрытую ошибку!
СекундыUnix = НашаДата - Дата(1970, 1, 1);
В чем заключается опасность данного подхода? Дело в том, что временной штамп Unix по стандарту рассчитывается исключительно по универсальному координированному времени (UTC/GMT+0). В то же время тип Дата в 1С хранит локальное время компьютера или сервера. Если вы просто вычтете локальную дату из локальной даты начала эпохи, вы получите смещение на величину вашего часового пояса (например, +3 часа для Московского времени, что даст погрешность в 10800 секунд).
Для правильного расчета мы должны обязательно использовать приведение локального времени к универсальному с помощью функции УниверсальноеВремя().
Рассмотрим правильный алгоритм перевода локальной даты 1С в Unix Timestamp:
Функция ПолучитьUnixTimeИзДаты(Знач ЛокальнаяДата) Экспорт
// Приводим дату к UTC перед расчетом
УниверсальнаяДата = УниверсальноеВремя(ЛокальнаяДата);
// Вычитаем дату начала эпохи Unix
Возврат УниверсальнаяДата - '19700101000000';
КонецФункции
Аналогично, если вам потребуется решить обратную задачу — получить читаемую локальную дату из секунд Unix Timestamp, необходимо выполнить обратное преобразование с помощью функции МестноеВремя():
Функция ПолучитьДатуИзUnixTime(Знач UnixTime) Экспорт
// Прибавляем секунды к началу эпохи и переводим в локальный часовой пояс
Возврат МестноеВремя('19700101000000' + UnixTime);
КонецФункции
---
Иногда при высокоинтенсивном обмене данными секундной точности оказывается недостаточно. Например, когда за одну секунду регистрируется несколько десятков запросов, и их необходимо строго упорядочить во времени. В современных версиях платформы 1С:Предприятие 8.3 для этих целей добавлена встроенная функция ТекущаяУниверсальнаяДатаВМиллисекундах().
Она возвращает количество миллисекунд, прошедших с начала нашей эры (0001-01-01 00:00:00 UTC). Проанализируем пример ее использования для замера времени выполнения операции:
ВремяСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Выполняем полезную работу
ВыполнитьТяжелыйЗапрос();
ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЗатраченоМиллисекунд = ВремяОкончания - ВремяСтарта;
Сообщить("Операция выполнена за " + ЗатраченоМиллисекунд + " мс.");
Использование этого метода гарантирует высокую точность измерений и избавляет разработчика от необходимости обращаться к системному API операционной системы.
---
Подводя итоги, выделим ключевые правила изящного перевода дат в секунды в 1С:
СтроковыеФункцииКлиентСервер.СтрокаВДату() или каноническое приведение к строке ГГГГММДДЧЧММСС.УниверсальноеВремя() и МестноеВремя().ТекущаяУниверсальнаяДатаВМиллисекундах().