Разработка и Конфигурация · 10 мин
Как перевести время в 1С: функции, примеры и типичные ошибки
Как перевести время в 1С в часы, минуты, секунды и строки. Работа с типом Дата, форматирование, разница времени, типовые ошибки и примеры кода на встроенном языке.
Задача перевести время в 1С возникает в двух типовых ситуациях: когда нужно преобразовать значение типа «Дата» в строку нужного формата и когда требуется перевести часы, минуты и секунды в другую единицу измерения — например, десятичные часы для расчёта зарплаты или общее число секунд для сравнения интервалов. Встроенный язык 1С не имеет отдельного типа «Время»: время всегда хранится внутри типа «Дата» вместе с календарной датой.
Это порождает большинство ошибок у начинающих разработчиков: значение «14:30:00» на самом деле является датой 01.01.0001 14:30:00, и операции с ним ведут себя не так, как ожидается. Ниже разобраны рабочие приёмы: форматирование, извлечение компонентов времени, арифметика интервалов и перевод между единицами.
Как 1С хранит время и почему это важно
Тип «Дата» в 1С содержит и календарную дату, и время с точностью до секунды. Минимальное значение — 01.01.0001 00:00:00. Когда вы указываете только время, например через литерал '00010101143000', дата автоматически становится 1 января 0001 года. Именно поэтому сравнение двух «чистых» времён работает корректно только если у них одинаковая дата-основа.
Практическое следствие: нельзя напрямую сравнивать время из реквизита документа (где дата реальная) с константой '00010101143000' — сравнение всегда даст «ложь» или неожиданный результат. Сначала нужно извлечь компоненты времени функциями Час(), Минута(), Секунда() и сравнивать уже их.
Перевод даты и времени в строку функцией Формат()
Основной инструмент перевода времени в строку — функция Формат() с параметром форматной строки. Для времени используется шаблон с префиксом «ДФ» (формат даты):
ТекущееВремя = ТекущаяДатаСеанса();
СтрокаВремени = Формат(ТекущееВремя, "ДФ=ЧЧ:мм:сс");
// Результат: "14:30:05"
ТолькоЧасыМинуты = Формат(ТекущееВремя, "ДФ=ЧЧ:мм");
// Результат: "14:30"
Обратите внимание на регистр букв в шаблоне: «ЧЧ» — часы, «мм» — минуты, «сс» — секунды. Частая ошибка — написать «ДФ=ЧЧ:ММ», где прописные «ММ» могут интерпретироваться как месяц в некоторых контекстах локализации. Проверяйте результат на тестовом значении, где месяц и минуты различаются.
Для вывода времени пользователю в печатных формах часто удобнее параметр «ДЛФ=T» — локализованный формат времени:
СтрокаДляПечати = Формат(ТекущееВремя, "ДЛФ=T");
// Результат зависит от региональных настроек, например "14:30:05"
Извлечение часов, минут и секунд из значения даты
Для разборки значения типа «Дата» на компоненты платформа предоставляет три функции: Час(), Минута() и Секунда(). Каждая принимает дату и возвращает число:
ДатаВремя = '20260115143045';
Часы = Час(ДатаВремя); // 14
Минуты = Минута(ДатаВремя); // 30
Секунды = Секунда(ДатаВремя);// 45
Этот способ безопасен для сравнения времён с разными датами: вы сравниваете числа, а не даты. Например, проверка, попадает ли время документа в интервал с 9:00 до 18:00:
ВремяВМинутах = Час(ДатаДокумента) * 60 + Минута(ДатаДокумента);
Если ВремяВМинутах >= 540 И ВремяВМинутах <= 1080 Тогда
// время в пределах рабочего дня
КонецЕсли;
Перевод времени в секунды, минуты и десятичные часы
Перевод в секунды через арифметику дат
Разность двух дат в 1С даёт результат в секундах. Это базовый приём для вычисления длительности:
Начало = '20260115090000';
Конец = '20260115173000';
ДлительностьСекунд = Конец - Начало; // 30600
ДлительностьЧасов = ДлительностьСекунд / 3600; // 8,5
Десятичные часы (8,5 вместо 8:30) — стандартное представление для расчёта зарплаты, табеля и стоимости работ. Чтобы получить часы и минуты раздельно, используйте целочисленное деление и остаток:
ЧасыЦелые = Цел(ДлительностьСекунд / 3600);
МинутыОстаток = Цел((ДлительностьСекунд % 3600) / 60);
Перевод «чистого» времени в секунды от начала дня
Если время хранится как дата 01.01.0001 с временем, перевести его в секунды от полуночи можно вычитанием начала дня:
ВремяКакДата = '00010101143000';
СекундОтПолуночи = ВремяКакДата - НачалоДня(ВремяКакДата); // 52200
Функции НачалоДня() и КонецДня() полезны и в запросах: например, чтобы отобрать документы за сутки, сравнивают дату документа с границами НачалоДня(Период) и КонецДня(Период), а не с «круглой» датой — иначе документы, созданные после 00:00:00, выпадут из выборки.
- 1Получите два значения типа «Дата»: начало и конец интервала
- 2Вычтите начало из конца — результат в секундах
- 3Разделите на 3600 для десятичных часов или на 60 для минут
- 4При необходимости округлите функцией Окр() до нужной точности
- 5Проверьте результат на контрольном примере, например 1 час 30 минут = 1,5
Сложение и вычитание времени
Прибавить к дате секунды можно простым сложением, но для минут, часов, дней и месяцев корректнее использовать функции работы с датами. ДобавитьМесяц() учитывает разную длину месяцев, а для часов и минут удобно переводить всё в секунды:
НовоеВремя = ИсходнаяДата + 2 3600 + 45 60; // +2 часа 45 минут
Осторожность нужна при переходе через полночь: если к 23:30 прибавить 2 часа, дата изменится на следующий день. В учётных задачах (смены, ночные часы) это часто именно то, что нужно, но при отображении «только времени» пользователь увидит 01:30 без признака смены суток. Если смена даты нежелательна, проверяйте совпадение НачалоДня() до и после операции.
Перевод времени в запросах 1С
В языке запросов доступны свои функции извлечения компонентов: ЧАС(), МИНУТА(), СЕКУНДА(), а также НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() для округления дат. Типичная задача — сгруппировать документы по часам:
ВЫБРАТЬ
ЧАС(Продажи.Период) КАК ЧасПродажи,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
ЧАС(Продажи.Период)
Для отбора по интервалу времени внутри суток приведите обе стороны сравнения к секундам или минутам через ЧАС() и МИНУТА() — прямое сравнение с датой-константой 01.01.0001 в запросе громоздко и менее читаемо.
Как проверить результат
Минуты и месяц не перепутаны: на дате 15.03 14:05 строка содержит «05», а не «03»
В позиции минут отображается номер месяца
Разность 09:00 и 17:30 даёт 30600 секунд = 8,5 часа
Результат отрицательный или кратно больше ожидаемого
Сравниваются числа из Час() и Минута()
Сравниваются сами даты — условие никогда или всегда истинно
Типичные ошибки при работе со временем в 1С
Первая группа ошибок связана с форматными строками: перепутанные обозначения минут и месяца, использование «ДЛФ=D» (только дата) там, где нужно время, и забытый параметр локализации при обмене данными между системами с разными региональными настройками.
Вторая группа — арифметические: деление секунд на 60 вместо 3600 при переводе в часы, потеря остатка при целочисленном делении и округление до проверки на отрицательность. Третья группа — архитектурные: хранение времени строкой «14:30» в реквизите вместо типа «Дата», что ломает сортировку, сравнение и запросы.
Частые вопросы
Как в 1С получить только время без даты?
Типа «время без даты» в платформе нет. Для отображения используйте Формат(Дата, "ДФ=ЧЧ:мм:сс"), а для хранения «чистого» времени — дату 01.01.0001 с нужным временем. В реквизитах можно ограничить состав даты значением «Время», тогда платформа сама обнулит календарную часть.
Как перевести строку «14:30» обратно в дату?
Разберите строку функциями СтрРазделить() по двоеточию, преобразуйте части в числа и соберите дату функцией Дата(1, 1, 1, Часы, Минуты, 0). Либо склейте строку в формат «ГГГГММДДччммсс» и передайте в Дата() — платформа распознает строковый литерал даты.
Как посчитать разницу между двумя датами в минутах?
Вычтите одну дату из другой — результат будет в секундах — и разделите на 60. Для целого числа минут примените Цел() или Окр(). Помните, что если даты перепутаны местами, результат будет отрицательным — при необходимости возьмите модуль через Макс() и Мин().
Почему сравнение времени в запросе даёт неправильный результат?
Чаще всего вы сравниваете полные даты, у которых различается календарная часть. Приведите обе стороны к часам и минутам функциями ЧАС() и МИНУТА() либо сравнивайте с датой-константой, у которой та же календарная дата, что и у проверяемого значения.
Как округлить время до получаса или четверти часа?
Переведите время в секунды от начала дня, разделите на длительность шага (1800 для получаса, 900 для четверти), округлите функцией Окр() с нужным режимом и умножьте обратно, затем прибавьте к НачалоДня(). Проверьте граничные случаи: значения ровно на границе шага и переход через полночь.
Можно ли хранить длительность (например, 25 часов работы) в типе «Дата»?
Нежелательно. Тип «Дата» — это момент времени, а не интервал: при длительности больше суток календарная часть «уедет» на следующий день и запутает интерпретацию. Храните длительность числом в секундах, минутах или десятичных часах и форматируйте при выводе.
Что важно запомнить
Время в 1С — это часть типа «Дата». В строку переводите через Формат() с шаблоном «ДФ=ЧЧ:мм:сс», компоненты извлекайте функциями Час(), Минута(), Секунда(), длительность считайте разностью дат в секундах, а для учётных данных используйте ТекущаяДатаСеанса(). Длительность храните числом, а не датой.