Как изящно перевести дату и строку в секунды в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки интеграций с веб-сервисами, работы с API сторонних систем или при реализации собственных алгоритмов логирования программисты 1С часто сталкиваются с необходимостью перевода даты в секунды. Это может быть как расчет количества секунд, прошедших с начала текущего дня, так и вычисление стандартного временного штампа Unix Timestamp (количества секунд, прошедших с 1 января 1970 года). В этой статье мы подробно разберем, как решить эти задачи изящно, избегая громоздкого ручного парсинга строк и арифметических ошибок.

Понимание базового механизма работы с датами в 1С

Прежде чем переходить к алгоритмам преобразования, важно вспомнить фундаментальное свойство платформы 1С:Предприятие. При вычитании одной даты из другой платформа всегда возвращает разность в секундах (тип Число). Это избавляет нас от необходимости вручную переводить часы в минуты, а минуты в секунды.

Рассмотрим простейший пример, демонстрирующий это поведение:

РазностьВСекундах = ТекущаяДата() - НачалоДня(ТекущаяДата());

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

---

Преобразование исходной строки формата «ДД.ММ.ГГГГ ЧЧ:ММ» в дату

Часто исходные данные приходят к нам в текстовом виде — например, «25.10.2026 14:30». Прежде чем вычитать даты, нам нужно корректно преобразовать строку в объект типа Дата. Разберем три наиболее изящных способа сделать это.

Способ 1. Использование встроенных функций БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вам не нужно писать собственный велосипед для разбора строки. В составе БСП есть готовые надежные инструменты в общем модуле СтроковыеФункцииКлиентСервер.

Рассмотрим пример использования:


ИсходнаяСтрока = "25.10.2026 14:30";
// Функция автоматически распознает популярные разделители
НашаДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);

Этот метод безопасен, протестирован на множестве конфигураций и учитывает различные варианты заполнения строки (наличие или отсутствие секунд, разные разделители).

Способ 2. Приведение к каноническому виду 1С

Если БСП в вашей базе отсутствует (например, вы работаете в полностью самописной конфигурации), самым быстрым решением будет приведение строки к внутреннему стандарту платформы ГГГГММДДЧЧММСС. Для этого достаточно убрать лишние символы разделителей.

Разберем по шагам, как выполнить это преобразование:


ИсходнаяСтрока = "25.10.2026 14:30";

// Очищаем строку от точек, двоеточий и пробелов
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, ".", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");

// Теперь строка имеет вид "251020261430"
// Перегруппируем символы в формат ГГГГММДДЧЧММСС
КаноническаяСтрока = Сред(ЧистаяСтрока, 5, 4) // Год (2026)
                   + Сред(ЧистаяСтрока, 3, 2) // Месяц (10)
                   + Сред(ЧистаяСтрока, 1, 2) // День (25)
                   + Сред(ЧистаяСтрока, 9, 4) // Время (1430)
                   + "00";                    // Секунды по умолчанию

НашаДата = Дата(КаноническаяСтрока);

Этот способ работает очень быстро на уровне платформы и не требует обращения к сторонним библиотекам.

Способ 3. Использование стандартных форматов XML и JSON

Если вы получаете данные из внешних систем в стандартном международном формате (например, 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: классическая ошибка и правильное решение

Одной из наиболее частых задач перевода даты в секунды является получение 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С:

  1. Никогда не выполняйте умножение часов и минут вручную — всегда используйте разность дат.
  2. Для разбора нетипичных текстовых строк применяйте функции БСП СтроковыеФункцииКлиентСервер.СтрокаВДату() или каноническое приведение к строке ГГГГММДДЧЧММСС.
  3. При работе с Unix Timestamp всегда учитывайте часовые пояса и используйте связку функций УниверсальноеВремя() и МестноеВремя().
  4. Для задач точного замера производительности используйте ТекущаяУниверсальнаяДатаВМиллисекундах().
← На главную