При разработке механизмов загрузки данных (например, из внешних файлов Excel, CSV или внешних систем) часто возникает задача заполнения реквизитов документов, предназначенных исключительно для хранения времени (время прихода, время ухода, длительность смены). В платформе 1С:Предприятие отсутствует изолированный тип данных «Время» — такие поля всегда имеют тип Дата с установленным составом даты Время.
Разберем особенности работы с такими полями и выясним, как правильно сформировать значение времени из строковых или числовых данных.
Проанализируем специфику хранения времени в платформе 1С:
ГГГГММДДччммсс. По стандарту платформы дата в таких реквизитах всегда равна начальной (пустой) дате: 01.01.0001 00:00:00 (или '00010101').ДокументОбъект.Время = 5 * 3600 вызовет ошибку «Несоответствие типов». Прибавлять секунды можно только к уже существующему значению типа Дата.00:00:00 до 23:59:59. Значение 24:00:00 в рамках одних суток задать нельзя — прибавление 86400 секунд сместит дату на 02.01.0001 00:00:00.Рассмотрим самый быстрый и надежный способ получения значения времени. Для этого передадим в конструктор Дата(Год, Месяц, День, Час, Минута, Секунда) единицы в качестве года, месяца и дня, а также нужные часы и минуты.
Посмотрим на пример кода:
Часы = 5;
Минуты = 30;
// Конструируем дату с пустой датой (01.01.0001) и заданным временем
ВремяДляЗаписи = Дата(1, 1, 1, Часы, Минуты, 0);
ТабельОбъект = Документы.Табель.СоздатьДокумент();
ТабельОбъект.ВремяНачала = ВремяДляЗаписи;
ТабельОбъект.Записать();
Разберем математический вариант вычисления времени. В 1С прибавление числа к переменной типа Дата интерпретируется как добавление указанного количества секунд. Поэтому мы можем взять пустую дату '00010101' и прибавить к ней сумму секунд с начала суток.
Рассмотрим пример расчета:
Часы = 18;
Минуты = 0;
Секунды = 0;
// Вычисляем общее количество секунд с начала дня
СекундСНачалаСуток = (Часы * 3600) + (Минуты * 60) + Секунды;
// Прибавляем секунды к базовой пустой дате
ВремяДляЗаписи = Дата('00010101') + СекундСНачалаСуток;
ТабельОбъект = Документы.Табель.СоздатьДокумент();
ТабельОбъект.ВремяОкончания = ВремяДляЗаписи;
ТабельОбъект.Записать();
Посмотрим, как получить дату через преобразование строки фиксированного формата ГГГГММДДччммсс. Этот способ удобен, когда строковое представление времени формируется динамически.
Часы = 9;
Минуты = 0;
// Формируем строковое представление с лидирующими нулями
СтрокаЧасы = Формат(Часы, "ЧЦ=2; ЧВН=");
СтрокаМинуты = Формат(Минуты, "ЧЦ=2; ЧВН=");
СтрокаДаты = "00010101" + СтрокаЧасы + СтрокаМинуты + "00";
ВремяДляЗаписи = Дата(СтрокаДаты);
Выясним, как правильно обрабатывать входные значения из ячеек Excel. В файлах время часто хранится либо в виде чисел с десятичной частью (например, 5.30), либо в виде строк или долей суток.
5.3). Для корректного извлечения минут необходимо выделить дробную часть:
ЗначениеExcel = 5.30;
Часы = Цел(ЗначениеExcel);
Минуты = Окр((ЗначениеExcel - Часы) * 100);
ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, 0);
Ячейка.Value может возвращать числовое значение или долю суток. Для получения точного текстового формата времени рекомендуется использовать свойство Ячейка.Text, после чего разбить строку функцией СтрРазделить():
СтрокаВремени = "05:30"; // Значение свойства Text ячейки
МассивЧастей = СтрРазделить(СтрокаВремени, ":.");
Если МассивЧастей.Количество() >= 2 Тогда
Часы = Число(МассивЧастей[0]);
Минуты = Число(МассивЧастей[1]);
ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, 0);
ИначеЕсли МассивЧастей.Количество() = 1 Тогда
Часы = Число(МассивЧастей[0]);
ВремяРезультат = Дата(1, 1, 1, Часы, 0, 0);
КонецЕсли;