Разработка и Конфигурация · 8 мин
1С: как число перевести во время
Как в 1С преобразовать число во время: функция Формат, форматная строка ЧС, ДФ, работа с секундами и часами. Примеры кода, типичные ошибки и проверка результата.
В 1С:Предприятии тип «Число» и тип «Дата» (время — часть типа Дата) не преобразуются друг в друга напрямую присваиванием. Чтобы показать число как время — например, превратить 1,5 в «1 ч 30 мин» или 3661 секунды в «01:01:01», — используют функцию Формат() с форматной строкой, арифметические вычисления или конструктор даты. Выбор способа зависит от того, что хранится в числе: секунды, часы, минуты или дробная часть суток.
Чаще всего задача возникает в отчётах по учёту рабочего времени, расчётах длительности операций, загрузке данных из внешних систем, где время хранится числом, и при выводе продолжительности в печатные формы. Ниже разобраны рабочие приёмы с примерами кода на встроенном языке 1С.
Как хранится время в 1С и почему число нельзя просто присвоить
В 1С время как самостоятельный тип отсутствует: оно всегда является частью типа «Дата». Значение Дата(1, 1, 1, 14, 30, 0) означает 14 часов 30 минут при нулевой календарной дате (1 января 0001 года). Именно так платформа хранит «чистое» время — через дату с минимальным значением календарной части.
Число же — это просто количество: секунд, минут, часов. Присваивание вида Время = 3600; не создаёт время, а оставляет число. Поэтому задача «перевести число во время» распадается на две: либо получить значение типа Дата из числа, либо отобразить число в виде строки «ЧЧ:ММ:СС» без смены типа.
Способ 1: сформировать дату из числа секунд
Если число содержит количество секунд от начала суток, разложите его на часы, минуты и секунды и передайте в конструктор даты:
ЧислоСекунд = 3661; // 1 час 1 минута 1 секунда
Часы = Цел(ЧислоСекунд / 3600);
Минуты = Цел((ЧислоСекунд - Часы * 3600) / 60);
Секунды = ЧислоСекунд - Часы 3600 - Минуты 60;
ЗначениеВремени = Дата(1, 1, 1, Часы, Минуты, Секунды);
// Результат: 01.01.0001 1:01:01
Для вывода только времени без даты примените форматную строку:
СтрокаВремени = Формат(ЗначениеВремени, "ДЛФ=T");
// Результат: "1:01:01"
Параметр ДЛФ=T выводит локальный формат времени. Если нужен строгий вид «ЧЧ:ММ:СС» с ведущими нулями, используйте ДФ:
СтрокаВремени = Формат(ЗначениеВремени, "ДФ=HH:mm:ss");
// Результат: "01:01:01"
Способ 2: вывести число как время через форматную строку
Если тип менять не нужно, а требуется только красиво показать число (например, 2,5 часа как «2 ч 30 мин»), достаточно функции Формат() с параметрами группы Ч (число):
Значение = 2,5;
Часы = Цел(Значение);
Минуты = (Значение - Часы) * 60;
Результат = Строка(Часы) + " ч " + Формат(Минуты, "ЧЦ=2; ЧВН=") + " мин";
// Результат: "2 ч 30 мин"
Полезные параметры форматной строки для чисел:
ЧЦ— общее количество знаков, напримерЧЦ=2дополнит значение до двух разрядов;ЧВН=— вывод ведущих нулей, чтобы получить «05» вместо «5»;ЧН=— представление нуля, напримерЧН=00выведет «00» вместо пустой строки;ЧГ=0— убрать разделитель групп разрядов (пробелы) в больших числах.
Формат(Минуты, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=")Способ 3: длительность больше суток
Конструктор Дата(1,1,1,...) не принимает часы больше 23 — при переполнении возникнет ошибка или неверный результат. Если число описывает длительность, которая может превышать 24 часа (например, суммарная наработка оборудования 75,5 часов), формируйте строку вручную:
ДлительностьЧасов = 75,5;
Часы = Цел(ДлительностьЧасов);
Минуты = Окр((ДлительностьЧасов - Часы) * 60, 0);
Результат = Формат(Часы, "ЧГ=0") + ":" + Формат(Минуты, "ЧЦ=2; ЧВН=");
// Результат: "75:30"
Такой подход корректно отображает любую длительность, потому что часы здесь — обычное число без ограничения в 24. Это стандартное решение для отчётов по сверхурочным, простоям и наработке.
Перевод времени обратно в число
Обратная задача — получить из значения типа Дата число секунд или часов — решается функциями Час(), Минута(), Секунда():
ЗначениеВремени = Дата(1, 1, 1, 1, 30, 0);
СекундВсего = Час(ЗначениеВремени) * 3600
+ Минута(ЗначениеВремени) * 60
+ Секунда(ЗначениеВремени);
// Результат: 5400
ЧасовДробное = СекундВсего / 3600;
// Результат: 1,5
Разность двух дат в 1С сама по себе даёт число — количество секунд между моментами. Это удобно для замера длительности операций: Длительность = ТекущаяДата() - НачалоОперации; вернёт число секунд, которое затем можно отформатировать как время способами выше.
Работа в запросах и СКД
В языке запросов 1С функций форматирования нет, поэтому число во время в запросе обычно не переводят — вычисляют числовые поля (секунды, часы), а форматирование выполняют на уровне компоновки данных или при выводе. В СКД для поля можно задать форматную строку на закладке «Наборы данных» или в настройках оформления поля.
Если в запросе нужно выделить часы и минуты из числа секунд, используйте целочисленное деление через ВЫРАЗИТЬ и остаток:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Секунды / 3600 КАК ЧИСЛО(10, 0)) КАК Часы,
ВЫРАЗИТЬ((Таблица.Секунды - ВЫРАЗИТЬ(Таблица.Секунды / 3600 КАК ЧИСЛО(10, 0)) * 3600) / 60 КАК ЧИСЛО(10, 0)) КАК Минуты
ИЗ
РегистрСведений.Длительности КАК Таблица
Затем в модуле формирования отчёта или в вычисляемом поле СКД соберите строку вида «ЧЧ:ММ» уже встроенным языком.
Сравнение способов
Подходит для времени в пределах суток; даёт настоящий тип Дата, удобен для сравнений. Не работает при длительности более 24 часов.
Универсально для любых длительностей, включая сотни часов. Результат — строка, сортировка и сравнение как время недоступны.
Быстрый вывод числа с ведущими нулями без смены типа. Подходит для отдельных полей, но не собирает полное время сам.
Проверка результата и типичные ошибки
После преобразования всегда проверяйте результат на граничных значениях: 0, 59 секунд, 3600 секунд (ровно час), 86399 (конец суток) и значении больше суток. Округление минут лучше выполнять через Окр(..., 0), иначе при дробных часах возможны хвосты вида «29,999999 мин».
Как проверить результат
Строка «01:01:01»
«1:1:1» без ведущих нулей или неверные минуты
«2 ч 30 мин» или «02:30»
«2 ч 50 мин» — признак умножения дробной части на 100 вместо 60
«75:30»
Ошибка выполнения или часы по модулю 24
FAQ
Можно ли в 1С объявить переменную типа «Время»?
Нет, отдельного типа «Время» в платформе нет. Время хранится как значение типа Дата с календарной частью 01.01.0001, например Дата(1,1,1,14,30,0). В реквизитах объектов для хранения времени выбирают тип Дата с составом «Время».
Как вывести время с ведущими нулями, например 08:05?
Для значения типа Дата используйте Формат(Значение, "ДФ=HH:mm"). Для отдельных числовых часов и минут добавьте в форматную строку параметры ЧЦ=2 и ЧВН=, которые дополнят значение нулём слева.
Что вернёт выражение ТекущаяДата() - ДатаНачала?
Разность двух дат в 1С — это число секунд между моментами. Полученное число можно разложить на часы, минуты и секунды арифметикой и отформатировать как длительность.
Как преобразовать время из строки «14:30» в число?
Разбейте строку функцией СтрРазделить по символу «:», преобразуйте части в числа функцией Число(), затем вычислите секунды: Часы 3600 + Минуты 60. Перед вычислением проверяйте, что строка содержит корректные цифры.
Почему Формат(Время, "ДФ=HH:mm") выводит месяц вместо минут?
Потому что в форматной строке регистр имеет значение: mm — минуты, а MM — месяц. Проверьте, что минуты записаны строчными буквами, а часы — заглавными HH.
Как показать длительность больше 24 часов, например 120 часов?
Тип Дата для этого не подходит — часы ограничены сутками. Вычислите целые часы и минуты арифметикой из исходного числа и соберите строку вида «120:00» через Формат с параметрами ЧГ=0 и ЧВН=.