Как программно сформировать и записать время в поле с типом Дата в 1С?

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

При разработке механизмов загрузки данных (например, из внешних файлов Excel, CSV или внешних систем) часто возникает задача заполнения реквизитов документов, предназначенных исключительно для хранения времени (время прихода, время ухода, длительность смены). В платформе 1С:Предприятие отсутствует изолированный тип данных «Время» — такие поля всегда имеют тип Дата с установленным составом даты Время.

Разберем особенности работы с такими полями и выясним, как правильно сформировать значение времени из строковых или числовых данных.

Особенности типа данных «Дата» при работе со временем

Проанализируем специфику хранения времени в платформе 1С:

  1. Дата всегда присутствует. Даже если в свойствах реквизита состав даты определен как Время, в базе данных хранится полная дата вида ГГГГММДДччммсс. По стандарту платформы дата в таких реквизитах всегда равна начальной (пустой) дате: 01.01.0001 00:00:00 (или '00010101').
  2. Строгая типизация. Нельзя присвоить полю даты обычное число (например, количество секунд или часов). Попытка выполнить команду вида ДокументОбъект.Время = 5 * 3600 вызовет ошибку «Несоответствие типов». Прибавлять секунды можно только к уже существующему значению типа Дата.
  3. Границы суток. Время в пределах суток лежит в интервале от 00:00:00 до 23:59:59. Значение 24:00:00 в рамках одних суток задать нельзя — прибавление 86400 секунд сместит дату на 02.01.0001 00:00:00.

Способ 1. Использование конструктора функции Дата()

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

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


Часы = 5;
Минуты = 30;

// Конструируем дату с пустой датой (01.01.0001) и заданным временем
ВремяДляЗаписи = Дата(1, 1, 1, Часы, Минуты, 0);

ТабельОбъект = Документы.Табель.СоздатьДокумент();
ТабельОбъект.ВремяНачала = ВремяДляЗаписи;
ТабельОбъект.Записать();

Способ 2. Прибавление секунд к пустой дате

Разберем математический вариант вычисления времени. В 1С прибавление числа к переменной типа Дата интерпретируется как добавление указанного количества секунд. Поэтому мы можем взять пустую дату '00010101' и прибавить к ней сумму секунд с начала суток.

Рассмотрим пример расчета:


Часы = 18;
Минуты = 0;
Секунды = 0;

// Вычисляем общее количество секунд с начала дня
СекундСНачалаСуток = (Часы * 3600) + (Минуты * 60) + Секунды;

// Прибавляем секунды к базовой пустой дате
ВремяДляЗаписи = Дата('00010101') + СекундСНачалаСуток;

ТабельОбъект = Документы.Табель.СоздатьДокумент();
ТабельОбъект.ВремяОкончания = ВремяДляЗаписи;
ТабельОбъект.Записать();

Способ 3. Формирование канонической строки даты

Посмотрим, как получить дату через преобразование строки фиксированного формата ГГГГММДДччммсс. Этот способ удобен, когда строковое представление времени формируется динамически.


Часы = 9;
Минуты = 0;

// Формируем строковое представление с лидирующими нулями
СтрокаЧасы = Формат(Часы, "ЧЦ=2; ЧВН=");
СтрокаМинуты = Формат(Минуты, "ЧЦ=2; ЧВН=");

СтрокаДаты = "00010101" + СтрокаЧасы + СтрокаМинуты + "00";
ВремяДляЗаписи = Дата(СтрокаДаты);

Нюансы разбора времени при загрузке из Excel

Выясним, как правильно обрабатывать входные значения из ячеек Excel. В файлах время часто хранится либо в виде чисел с десятичной частью (например, 5.30), либо в виде строк или долей суток.

  1. Если время представлено числом с плавающей точкой (например, 5.30):
    При чтении числа незначащие нули теряются (значение становится 5.3). Для корректного извлечения минут необходимо выделить дробную часть:
    
    ЗначениеExcel = 5.30;
    
    Часы = Цел(ЗначениеExcel);
    Минуты = Окр((ЗначениеExcel - Часы) * 100);
    
    ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, 0);
    
  2. Если данные читаются через COM-объект Excel:
    Использование свойства Ячейка.Value может возвращать числовое значение или долю суток. Для получения точного текстового формата времени рекомендуется использовать свойство Ячейка.Text, после чего разбить строку функцией СтрРазделить():
    
    СтрокаВремени = "05:30"; // Значение свойства Text ячейки
    МассивЧастей = СтрРазделить(СтрокаВремени, ":.");
    
    Если МассивЧастей.Количество() >= 2 Тогда
        Часы = Число(МассивЧастей[0]);
        Минуты = Число(МассивЧастей[1]);
        ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, 0);
    ИначеЕсли МассивЧастей.Количество() = 1 Тогда
        Часы = Число(МассивЧастей[0]);
        ВремяРезультат = Дата(1, 1, 1, Часы, 0, 0);
    КонецЕсли;
    
← На главную