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

Разработка и Конфигурация · 9 мин

Как из даты взять время в 1С

Как в 1С извлечь время из даты: функции Час, Минута, Секунда, Формат, работа с запросами и типичные ошибки. Примеры кода для 1С 8.3.

В 1С:Предприятии дата и время хранятся в одном значении типа «Дата», поэтому задача «взять время из даты» сводится к извлечению отдельных компонентов — часа, минуты и секунды — либо к форматированию значения в строку вида «14:30:00». Встроенный язык предоставляет для этого стандартные функции, а язык запросов — собственные аналоги.

Выбор способа зависит от контекста: нужно ли получить числовое значение для расчётов, строку для вывода пользователю или отобрать записи по времени в запросе. Ниже разобраны все основные сценарии с примерами кода, которые работают на платформе 1С 8.3.

Как устроен тип «Дата» в 1С

Тип «Дата» в 1С всегда содержит и календарную дату, и время с точностью до секунды. Пустое значение даты — это 01.01.0001 00:00:00. Отдельного типа «время» в платформе нет, поэтому «взять время» означает либо извлечь числовые компоненты, либо отформатировать значение, отбросив календарную часть при выводе.

Важно понимать: нельзя присвоить переменной типа «Дата» только время без календарной части. Если нужно хранить время отдельно, обычно используют либо дату с фиксированной календарной частью (например, 01.01.0001 14:30:00), либо число секунд от начала дня, либо строку.

Извлечение часа, минуты и секунды функциями

Базовый способ — функции встроенного языка Час(), Минута() и Секунда(). Каждая принимает значение типа «Дата» и возвращает целое число: Час — от 0 до 23, Минута и Секунда — от 0 до 59.

ДатаДокумента = ТекущаяДата();

Часы = Час(ДатаДокумента); // например, 14

Минуты = Минута(ДатаДокумента); // например, 5

Секунды = Секунда(ДатаДокумента); // например, 42

Полученные числа удобны для сравнений и расчётов: проверить, попадает ли документ в рабочие часы, рассчитать длительность операции, отфильтровать события по времени суток.

Сборка строки времени вручную

Если из числовых компонентов нужно собрать строку вида «14:05:42», используйте конкатенацию с дополнением нулями. Функция Формат() делает это проще, но ручная сборка даёт полный контроль над видом результата.

ВремяСтрокой = Формат(Часы, "ЧЦ=2; ЧВН=") + ":"

+ Формат(Минуты, "ЧЦ=2; ЧВН=") + ":"

+ Формат(Секунды, "ЧЦ=2; ЧВН=");

// Результат: "14:05:42"

Получение времени строкой через функцию Формат

Чаще всего время нужно не для расчётов, а для показа пользователю — в сообщении, наименовании, печатной форме. Для этого предназначена функция Формат() с параметром форматной строки.

ДатаДокумента = ТекущаяДата();

ВремяКратко = Формат(ДатаДокумента, "ДЛФ=T"); // "14:05:42"

ВремяСвоё = Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "14:05"

ВремяПолное = Формат(ДатаДокумента, "ДФ='ЧЧ:мм:сс'"); // "14:05:42"

Параметр «ДЛФ=T» задаёт локальный формат времени — вид зависит от региональных настроек сеанса. Параметр «ДФ» позволяет задать шаблон явно: ЧЧ — часы с ведущим нулём, мм — минуты, сс — секунды. Символы, не относящиеся к шаблону, берите в одинарные кавычки внутри строки.

Обратите внимание на регистр в шаблоне «ДФ»: «ММ» — это месяц, а «мм» — минуты. Перепутанный регистр — одна из самых частых причин неверного результата: вместо минут выводится номер месяца.

Типичные ошибки
01
Шаблон "ДФ=ЧЧ:ММ" вместо "ДФ=ЧЧ:мм" — вместо минут выводится номер месяца
02
Попытка записать в реквизит типа «Дата» только время — сохранится дата 01.01.0001 с указанным временем, что потом ломает сравнения
03
Сравнение дат оператором «=» при разном времени — две даты одного дня с разным временем не равны
04
Использование ТекущаяДата() в цикле на сервере вместо однократного получения значения

Как взять время из даты в запросе

В языке запросов доступны одноимённые функции ЧАС, МИНУТА и СЕКУНДА. Они применяются к полям типа «Дата» и возвращают числа, которые можно выводить в выборку или использовать в условиях.

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

ЧАС(Реализация.Дата) КАК ЧасПроведения,

МИНУТА(Реализация.Дата) КАК МинутаПроведения

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

ЧАС(Реализация.Дата) >= 18

Функция форматирования в запросах недоступна, поэтому строку времени в запросе получить нельзя — только числовые компоненты. Если нужна строка, форматируйте результат уже после выборки, при обходе выборки.

Условия по ЧАС, МИНУТА в секции ГДЕ работают, но не используют индексы: на больших таблицах такой отбор будет медленным. Если отбор по времени выполняется часто, эффективнее сравнивать саму дату с границами интервала через параметры.

Отбор вида «документы после 18:00» через ЧАС(Дата) >= 18 удобен для разовых отчётов, но в регламентных заданиях по большим базам лучше сравнивать дату с вычисленными границами: Дата >= &НачалоПериода И Дата < &КонецПериода — так работает индекс.
ПЗ
Практическое замечание

Отбросить дату и оставить только время: практические приёмы

Иногда требуется «очистить» дату от календарной части — например, чтобы сравнивать время разных дней между собой. Универсальный приём — перенести время на фиксированную дату или перевести его в секунды от начала дня.

// Время в секундах от начала дня

СекундОтНачалаДня = Час(ДатаДокумента) * 3600

+ Минута(ДатаДокумента) * 60

+ Секунда(ДатаДокумента);

// Дата с «обнулённым» временем — начало дня

НачалоДняДокумента = НачалоДня(ДатаДокумента);

// Время, перенесённое на пустую дату 01.01.0001

ТолькоВремя = '00010101' + СекундОтНачалаДня;

Представление времени числом секунд особенно удобно для хранения в реквизитах типа «Число» и для арифметики: разность двух таких значений сразу даёт длительность в секундах без дополнительных преобразований.

Порядок действий
  1. 1
    Определите цель: число для расчётов, строка для вывода или отбор в запросе
  2. 2
    Для чисел используйте Час(), Минута(), Секунда()
  3. 3
    Для строки — Формат(Дата, "ДФ=ЧЧ:мм:сс") или "ДЛФ=T"
  4. 4
    В запросе применяйте ЧАС(), МИНУТА(), СЕКУНДА() к полю даты
  5. 5
    Проверьте результат на граничных значениях: полночь 00:00:00 и конец дня 23:59:59

Работа с часовыми поясами

Если база обслуживает пользователей в разных часовых поясах, функция ТекущаяДата() на сервере вернёт время сервера, а на клиенте — время компьютера пользователя. Извлечённое из такой даты время может отличаться от ожидаемого.

Для единообразия используйте ТекущаяДатаСеанса() — она возвращает дату и время сеанса с учётом пояса, заданного в настройках информационной базы. При выводе времени из документов учитывайте, в каком поясе документ создавался: платформа хранит дату как есть, без автоматической конвертации.

Проверка результата и граничные случаи

Проверяйте код на краевых значениях: полночь (00:00:00) функциями выводится как 0 часов, 0 минут — при ручной сборке строки без форматирования получится «0:0:0» вместо «00:00:00». Функция Формат с шаблоном ЧЧ:мм:сс такой проблемы не имеет.

Отдельный случай — пустая дата. Час('00010101') вернёт 0, а Формат('00010101', "ДЛФ=T") вернёт пустую строку или значение по умолчанию в зависимости от настроек. Перед форматированием проверяйте заполненность даты через ЗначениеЗаполнено(), чтобы не выводить пользователю нулевое время.

Контрольные точки

Как проверить результат

Вывод времени строкой
Норма

Формат "14:05:42" с ведущими нулями

Тревожный признак

"14:5:42" или номер месяца вместо минут

Сравнение времени документов
Норма

Сравниваются секунды от начала дня или полные даты

Тревожный признак

Сравниваются строки времени — сортировка ломается

Пустая дата
Норма

Проверка ЗначениеЗаполнено() до форматирования

Тревожный признак

В отчёте выводится 00:00:00 для незаполненных дат

FAQ

Как вывести только часы и минуты без секунд?

Используйте Формат(Дата, "ДФ=ЧЧ:мм") — получите строку вида «14:05». Если нужны числа, возьмите только Час() и Минута() и соберите строку вручную с дополнением нулей.

Можно ли сохранить время в реквизит без даты?

Напрямую нет — типа «время» в платформе нет. Храните либо дату с фиксированной календарной частью (например, 01.01.0001 14:30:00), либо число секунд от начала дня в реквизите типа «Число», либо строку «14:30».

Почему Формат выводит месяц вместо минут?

В шаблоне «ДФ» регистр букв имеет значение: «ММ» — месяц, «мм» — минуты. Проверьте, что в форматной строке минуты записаны строчными буквами: "ДФ=ЧЧ:мм:сс".

Как сравнить время двух документов, созданных в разные дни?

Переведите время каждого документа в секунды от начала дня: Час(Дата)*3600 + Минута(Дата)*60 + Секунда(Дата). Сравнение чисел даст корректный результат независимо от календарной части.

Работают ли функции Час и Минута в тонком и веб-клиенте?

Да, функции Час(), Минута(), Секунда() и Формат() доступны во всех клиентах и на сервере без ограничений. Ограничение касается только ТекущаяДата() — в серверном контексте она возвращает время сервера.

Как в запросе отобрать документы за конкретный час?

Добавьте условие ГДЕ ЧАС(Таблица.Дата) = &Час. Учтите, что такой отбор не использует индекс и на больших таблицах выполняется медленно; для регулярных отборов лучше сравнивать дату с границами интервала через параметры.

Итог

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

Время из даты в 1С извлекается функциями Час(), Минута(), Секунда() для чисел и Формат() с шаблоном "ДФ=ЧЧ:мм:сс" или "ДЛФ=T" для строки. В запросах работают ЧАС, МИНУТА, СЕКУНДА. Следите за регистром букв в шаблоне, проверяйте пустые даты и не смешивайте время клиента и сервера в разных часовых поясах.