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

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

Как из даты получить часы в 1С

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

Во встроенном языке 1С значение типа «Дата» всегда содержит и дату, и время с точностью до секунды. Поэтому задача «из даты получить часы» решается не преобразованием строки, а извлечением компонента времени из готового значения. Основной инструмент для этого — функция Час(), которая принимает значение типа «Дата» и возвращает целое число от 0 до 23.

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

Ниже разобраны все рабочие способы: функция встроенного языка, извлечение часа в запросе, вывод через форматную строку, нюансы с пустыми датами и часовыми поясами, а также типичные ошибки, которые приводят к неверным значениям.

Функция Час() — основной способ в коде

Функция Час() доступна во всех контекстах встроенного языка: на сервере, на клиенте, в тонком и веб-клиенте. Она принимает один параметр — значение типа «Дата» — и возвращает число от 0 до 23, соответствующее часовой компоненте.

Процедура ПримерИзвлеченияЧаса()

ТекущаяДата = ТекущаяДатаСеанса();

ЧасИзДаты = Час(ТекущаяДата); // Например, 14

Сообщить("Час: " + ЧасИзДаты);

КонецПроцедуры

Функция не меняет исходное значение — она только читает компонент. Если нужно получить не только час, но и минуты с секундами, используются парные функции Минута() и Секунда(). Вместе они позволяют разложить время на составляющие для дальнейших вычислений, например для определения, попадает ли операция в ночную смену.

Обратите внимание: функция возвращает именно число, а не строку. Если результат нужен с ведущим нулём (например, «09» вместо «9»), форматируйте его отдельно через Формат() с форматной строкой "ЧЦ=2; ЧВН=".

bsl
ДатаДокумента = ДокументОбъект.Дата;
ЧасДокумента = Час(ДатаДокумента);
Если ЧасДокумента >= 22 ИЛИ ЧасДокумента < 6 Тогда
	// Ночная смена
КонецЕсли;

Получение часа в запросе

Когда часы нужны при выборке большого объёма данных — например, для группировки продаж по часам дня, — извлекать их следует прямо в запросе, а не в цикле обхода результата. Это снижает нагрузку: вычисление выполняется на сервере СУБД.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЧАС(Продажи.Период) КАК ЧасПродажи,

| СУММА(Продажи.СуммаОборот) КАК Сумма

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоДня, &КонецДня, Запись, ) КАК Продажи

|СГРУППИРОВАТЬ ПО

| ЧАС(Продажи.Период)

|УПОРЯДОЧИТЬ ПО

| ЧасПродажи";

Функция ЧАС() в языке запросов работает аналогично одноимённой функции встроенного языка и возвращает целое число. Рядом доступны МИНУТА(), СЕКУНДА(), ДЕНЬ(), МЕСЯЦ(), ГОД() — они применимы к полям типа «Дата» и к параметрам запроса соответствующего типа.

Типичное ограничение: функцию ЧАС() нельзя применить к полю составного типа, если в него могут попадать значения не типа «Дата». В таком случае сначала приведите значение через ВЫРАЗИТЬ(... КАК ДАТА) или отфильтруйте лишние типы.

Вывод времени через форматную строку

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

ВремяСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm");       // "14:35"

ВремяПолное = Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm:ss"); // "14:35:07"

ТолькоЧас = Формат(ТекущаяДатаСеанса(), "ДФ=HH"); // "14"

В форматной строке HH означает часы в 24-часовом формате, mm — минуты, ss — секунды. Регистр символов важен: MM (заглавные) в контексте даты означает месяц, а не минуты. Это одна из самых частых причин неверного вывода.

Поведение с пустой датой и особые случаи

Пустое значение даты в 1С — это 01.01.0001 0:00:00. Функция Час() от такой даты вернёт 0, что формально корректно, но может исказить логику: нулевой час трудно отличить от отсутствия данных. Перед извлечением часа из реквизитов, которые могут быть не заполнены, добавляйте проверку.

Если ЗначениеЗаполнено(ДатаОперации) Тогда

ЧасОперации = Час(ДатаОперации);

Иначе

// Дата не задана — обрабатываем отдельно

КонецЕсли;

Отдельный случай — значения, полученные из строки. Если дата пришла из файла или веб-сервиса в текстовом виде, сначала преобразуйте её в тип «Дата» (через Дата() с параметрами или XMLЗначение для формата ISO 8601), и только потом извлекайте час. Вызов Час() от строки вызовет ошибку выполнения.

Часовые пояса: от какой даты вы получаете часы

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

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

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

Определение смены по часу документа

Частая задача — отнести операцию к дневной или ночной смене. Здесь достаточно сравнения числового результата Час() с границами интервалов. Границы смен задавайте константами или в настройках, а не «зашивайте» в код, чтобы их можно было менять без доработки конфигурации.

Группировка данных в отчётах

В СКД час извлекается так же, как в запросе: в наборе данных добавьте вычисляемое поле с выражением ЧАС(Период) и используйте его как измерение группировки. Это позволяет строить отчёты вида «нагрузка по часам» без дополнительного кода.

Порядок действий
  1. 1
    Убедитесь, что значение имеет тип «Дата» и заполнено
  2. 2
    В коде вызовите Час(ЗначениеДаты) и сохраните результат в числовую переменную
  3. 3
    В запросе используйте ЧАС(ПолеДаты) в списке выборки или группировки
  4. 4
    Для отображения примените Формат(Дата, "ДФ=HH:mm")
  5. 5
    Проверьте результат на граничных значениях: 00:00, 23:59, пустая дата

Проверка корректности

Проверяйте результат на контрольных примерах: для даты 15.03.2026 09:05:00 функция Час() обязана вернуть 9, для 31.12.2026 23:59:59 — 23. Если вместо ожидаемого часа вы получаете 0, чаще всего причина в том, что дата фактически не содержит времени (записана как начало дня) или не заполнена вовсе.

Типичные ошибки
01
Вызов Час() от строки с датой — ошибка выполнения; сначала преобразуйте строку в тип «Дата»
02
Использование Формат() с "MM" вместо "mm" для минут — в вывод попадает номер месяца
03
Отсутствие проверки на пустую дату — пустые значения дают час 0 и искажают статистику
04
Сравнение строкового результата Формат() с числом — условие работает неверно или падает с ошибкой
05
Использование клиентского времени для учётных данных при работе в разных часовых поясах
Итог

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

Часы из даты извлекаются функцией Час() в коде, ЧАС() в запросе и форматной строкой "ДФ=HH:mm" для вывода. Перед извлечением проверяйте тип и заполненность значения, а для учётных данных опирайтесь на дату сеанса, а не на время клиентского компьютера.

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

Что вернёт Час() от пустой даты?

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

Как получить часы и минуты одним числом, например 14.5?

Переведите компоненты в дробное значение: Час(Дата) + Минута(Дата) / 60. Такой приём удобен для расчёта продолжительности в часах, но для хранения времени лучше сохранять исходное значение типа «Дата».

Можно ли извлечь час из даты в СКД без изменения запроса?

Да, но проще всего добавить вычисляемое поле или поле с выражением ЧАС(Период) прямо в наборе данных. Альтернатива — ресурс или вычисляемое поле на закладке «Вычисляемые поля» с тем же выражением языка запросов.

Почему Формат(Дата, "ДФ=hh:mm") выводит не то время?

Строчные hh в 1С не поддерживаются как в некоторых других языках — используйте заглавные HH для 24-часового формата. Также проверьте, что mm написано строчными: заглавные MM означают месяц.

Как получить час из даты, пришедшей из веб-сервиса в формате ISO?

Сначала преобразуйте строку: XMLЗначение(Тип("Дата"), СтрокаИзСервиса). Затем применяйте Час() к полученному значению. Учтите, что в строке ISO может быть указано смещение часового пояса — оно влияет на итоговое значение времени.

Час() возвращает 0, хотя в документе время указано. В чём причина?

Чаще всего реквизит имеет состав даты «Дата» без времени — проверьте свойство «Состав даты» в конфигураторе. Если там выбрано «Дата», время при записи обрезается до 00:00:00, и извлекать часы не из чего.