К статье
Практический материал

Разработка и Конфигурация · 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. 1
    Получите два значения типа «Дата»: начало и конец интервала
  2. 2
    Вычтите начало из конца — результат в секундах
  3. 3
    Разделите на 3600 для десятичных часов или на 60 для минут
  4. 4
    При необходимости округлите функцией Окр() до нужной точности
  5. 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» в реквизите вместо типа «Дата», что ломает сортировку, сравнение и запросы.

Типичные ошибки
01
Хранить время строкой — теряется сортировка и сравнение в запросах; используйте тип «Дата» с составом «Время»
02
Сравнивать даты с разной календарной частью напрямую — условие работает неверно; извлекайте Час() и Минута()
03
Перепутать «мм» и «ММ» в форматной строке — вместо минут выводится месяц
04
Использовать ТекущаяДата() на клиенте для учётных данных — время разных пользователей расходится; берите ТекущаяДатаСеанса()
05
Делить секунды на 60 вместо 3600 при переводе в часы — результат завышен в 60 раз

Частые вопросы

Как в 1С получить только время без даты?

Типа «время без даты» в платформе нет. Для отображения используйте Формат(Дата, "ДФ=ЧЧ:мм:сс"), а для хранения «чистого» времени — дату 01.01.0001 с нужным временем. В реквизитах можно ограничить состав даты значением «Время», тогда платформа сама обнулит календарную часть.

Как перевести строку «14:30» обратно в дату?

Разберите строку функциями СтрРазделить() по двоеточию, преобразуйте части в числа и соберите дату функцией Дата(1, 1, 1, Часы, Минуты, 0). Либо склейте строку в формат «ГГГГММДДччммсс» и передайте в Дата() — платформа распознает строковый литерал даты.

Как посчитать разницу между двумя датами в минутах?

Вычтите одну дату из другой — результат будет в секундах — и разделите на 60. Для целого числа минут примените Цел() или Окр(). Помните, что если даты перепутаны местами, результат будет отрицательным — при необходимости возьмите модуль через Макс() и Мин().

Почему сравнение времени в запросе даёт неправильный результат?

Чаще всего вы сравниваете полные даты, у которых различается календарная часть. Приведите обе стороны к часам и минутам функциями ЧАС() и МИНУТА() либо сравнивайте с датой-константой, у которой та же календарная дата, что и у проверяемого значения.

Как округлить время до получаса или четверти часа?

Переведите время в секунды от начала дня, разделите на длительность шага (1800 для получаса, 900 для четверти), округлите функцией Окр() с нужным режимом и умножьте обратно, затем прибавьте к НачалоДня(). Проверьте граничные случаи: значения ровно на границе шага и переход через полночь.

Можно ли хранить длительность (например, 25 часов работы) в типе «Дата»?

Нежелательно. Тип «Дата» — это момент времени, а не интервал: при длительности больше суток календарная часть «уедет» на следующий день и запутает интерпретацию. Храните длительность числом в секундах, минутах или десятичных часах и форматируйте при выводе.

Итог

Что важно запомнить

Время в 1С — это часть типа «Дата». В строку переводите через Формат() с шаблоном «ДФ=ЧЧ:мм:сс», компоненты извлекайте функциями Час(), Минута(), Секунда(), длительность считайте разностью дат в секундах, а для учётных данных используйте ТекущаяДатаСеанса(). Длительность храните числом, а не датой.