Как преобразовать строку со временем в тип Дата в 1С?

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

В платформе 1С:Предприятие отсутствует отдельный примитивный тип данных для хранения исключительно времени. Значение времени всегда хранится внутри типа Дата, который содержит одновременно календарную дату и время с точностью до секунды. Когда перед разработчиком стоит задача сохранить или обработать только время (например, "10:00:00"), принято использовать пустую дату — 01.01.0001.

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

Способ 1. Преобразование через строковый конструктор с датой по умолчанию

Рассмотрим самый простой вариант, когда исходная строка гарантированно имеет формат "ЧЧ:ММ:СС". Встроенная функция Дата() умеет принимать строку в каноническом формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС" или "ГГГГММДДЧЧММСС".

Посмотрим на пример с конкатенацией даты по умолчанию:


ВремяСтрокой = "10:00:00";
ДатаСоВременем = Дата("01.01.0001 " + ВремяСтрокой);

Также можно предварительно удалить двоеточия и собрать компактную строку формата "ГГГГММДДЧЧММСС":


ВремяСтрокой = "10:00:00";
КомпактнаяСтрока = "00010101" + СтрЗаменить(ВремяСтрокой, ":", "");
ДатаСоВременем = Дата(КомпактнаяСтрока);

Обратите внимание: строковый конструктор крайне чувствителен к структуре переданных данных. Если строка не содержит ведущего нуля (например, передано "9:00:00" вместо "09:00:00"), платформа выдаст критическую ошибку выполнения.

Способ 2. Обработка строк без ведущего нуля

Проанализируем ситуацию, когда на вход поступает значение без ведущего нуля в часах (например, длина строки составляет 7 символов вместо 8). В таком случае строку необходимо предварительно нормализовать.

Разберем по шагам, как дополнить строку нулем:

  1. Проверяем длину исходной строки с помощью функции СтрДлина().
  2. Если длина строки равна 7 символам, добавляем спереди "0".
  3. Передаем дополненную строку в конструктор Дата().

Посмотрим на пример кода:


ВремяСтрокой = "9:00:00";

Если СтрДлина(ВремяСтрокой) = 7 Тогда
    ВремяСтрокой = "0" + ВремяСтрокой;
КонецЕсли;

ДатаСоВременем = Дата("01.01.0001 " + ВремяСтрокой);

Способ 3. Универсальный разбор строки через числовой конструктор

Если входящий формат может быть произвольным (например, "9:5:0" или строка без указания секунд "14:30"), строковый конструктор не подойдет. В таких задачах надежнее использовать числовой конструктор Дата(Год, Месяц, День, Час, Минута, Секунда).

Разберем по шагам алгоритм безопасного разбора:

  1. Разбиваем исходную строку на составляющие с помощью функции СтрРазделить() по символу-разделителю ":".
  2. Получаем значения часов, минут и секунд, приводя их к типу Число.
  3. Если секунды отсутствуют, подставляем значение по умолчанию (0).
  4. Создаем итоговую дату через числовые параметры.

Посмотрим на реализацию универсальной функции:


Функция ПреобразоватьВремяВДату(Знач ВремяСтрокой) Экспорт
    ЧастиВремени = СтрРазделить(СокрЛП(ВремяСтрокой), ":");
    
    Если ЧастиВремени.Количество() < 2 Тогда
        Возврат '00010101';
    КонецЕсли;
    
    Час = Число(ЧастиВремени[0]);
    Минута = Число(ЧастиВремени[1]);
    Секунда = ?(ЧастиВремени.Количество() > 2, Число(ЧастиВремени[2]), 0);
    
    Попытка
        Возврат Дата(1, 1, 1, Час, Минута, Секунда);
    Исключение
        Возврат '00010101';
    КонецПопытки;
КонецФункции

Важно: использование блока Попытка ... Исключение защищает систему от аварийного завершения, если во входящей строке переданы недопустимые числовые значения (например, "25:00:00" или нечисловые символы).

← На главную