В платформе 1С:Предприятие отсутствует отдельный примитивный тип данных для хранения исключительно времени. Значение времени всегда хранится внутри типа Дата, который содержит одновременно календарную дату и время с точностью до секунды. Когда перед разработчиком стоит задача сохранить или обработать только время (например, "10:00:00"), принято использовать пустую дату — 01.01.0001.
Разберем подробно несколько способов преобразования строкового времени в полноценный тип Дата, а также выясним причину возможных ошибок при нестандартном формате входящих данных.
Рассмотрим самый простой вариант, когда исходная строка гарантированно имеет формат "ЧЧ:ММ:СС". Встроенная функция Дата() умеет принимать строку в каноническом формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС" или "ГГГГММДДЧЧММСС".
Посмотрим на пример с конкатенацией даты по умолчанию:
ВремяСтрокой = "10:00:00";
ДатаСоВременем = Дата("01.01.0001 " + ВремяСтрокой);
Также можно предварительно удалить двоеточия и собрать компактную строку формата "ГГГГММДДЧЧММСС":
ВремяСтрокой = "10:00:00";
КомпактнаяСтрока = "00010101" + СтрЗаменить(ВремяСтрокой, ":", "");
ДатаСоВременем = Дата(КомпактнаяСтрока);
Обратите внимание: строковый конструктор крайне чувствителен к структуре переданных данных. Если строка не содержит ведущего нуля (например, передано "9:00:00" вместо "09:00:00"), платформа выдаст критическую ошибку выполнения.
Проанализируем ситуацию, когда на вход поступает значение без ведущего нуля в часах (например, длина строки составляет 7 символов вместо 8). В таком случае строку необходимо предварительно нормализовать.
Разберем по шагам, как дополнить строку нулем:
СтрДлина()."0".Дата().Посмотрим на пример кода:
ВремяСтрокой = "9:00:00";
Если СтрДлина(ВремяСтрокой) = 7 Тогда
ВремяСтрокой = "0" + ВремяСтрокой;
КонецЕсли;
ДатаСоВременем = Дата("01.01.0001 " + ВремяСтрокой);
Если входящий формат может быть произвольным (например, "9:5:0" или строка без указания секунд "14:30"), строковый конструктор не подойдет. В таких задачах надежнее использовать числовой конструктор Дата(Год, Месяц, День, Час, Минута, Секунда).
Разберем по шагам алгоритм безопасного разбора:
СтрРазделить() по символу-разделителю ":".Число.Посмотрим на реализацию универсальной функции:
Функция ПреобразоватьВремяВДату(Знач ВремяСтрокой) Экспорт
ЧастиВремени = СтрРазделить(СокрЛП(ВремяСтрокой), ":");
Если ЧастиВремени.Количество() < 2 Тогда
Возврат '00010101';
КонецЕсли;
Час = Число(ЧастиВремени[0]);
Минута = Число(ЧастиВремени[1]);
Секунда = ?(ЧастиВремени.Количество() > 2, Число(ЧастиВремени[2]), 0);
Попытка
Возврат Дата(1, 1, 1, Час, Минута, Секунда);
Исключение
Возврат '00010101';
КонецПопытки;
КонецФункции
Важно: использование блока Попытка ... Исключение защищает систему от аварийного завершения, если во входящей строке переданы недопустимые числовые значения (например, "25:00:00" или нечисловые символы).