Разработка и Конфигурация · 9 мин
Как из даты получить часы в 1С
Как получить часы из даты в 1С: функция Час(), форматная строка, запросы, работа с часовыми поясами. Примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С значение типа «Дата» всегда содержит и дату, и время с точностью до секунды. Поэтому задача «из даты получить часы» решается не преобразованием строки, а извлечением компонента времени из готового значения. Основной инструмент для этого — функция Час(), которая принимает значение типа «Дата» и возвращает целое число от 0 до 23.
На практике потребность извлечь часы возникает при расчёте рабочего времени, группировке документов по времени суток, формировании отчётов по сменам и при выводе времени в печатные формы. В зависимости от контекста — модуль, запрос, форматированный вывод — применяются разные приёмы, и у каждого есть ограничения.
Ниже разобраны все рабочие способы: функция встроенного языка, извлечение часа в запросе, вывод через форматную строку, нюансы с пустыми датами и часовыми поясами, а также типичные ошибки, которые приводят к неверным значениям.
Функция Час() — основной способ в коде
Функция Час() доступна во всех контекстах встроенного языка: на сервере, на клиенте, в тонком и веб-клиенте. Она принимает один параметр — значение типа «Дата» — и возвращает число от 0 до 23, соответствующее часовой компоненте.
Процедура ПримерИзвлеченияЧаса()
ТекущаяДата = ТекущаяДатаСеанса();
ЧасИзДаты = Час(ТекущаяДата); // Например, 14
Сообщить("Час: " + ЧасИзДаты);
КонецПроцедуры
Функция не меняет исходное значение — она только читает компонент. Если нужно получить не только час, но и минуты с секундами, используются парные функции Минута() и Секунда(). Вместе они позволяют разложить время на составляющие для дальнейших вычислений, например для определения, попадает ли операция в ночную смену.
Обратите внимание: функция возвращает именно число, а не строку. Если результат нужен с ведущим нулём (например, «09» вместо «9»), форматируйте его отдельно через Формат() с форматной строкой "ЧЦ=2; ЧВН=".
ДатаДокумента = ДокументОбъект.Дата;
ЧасДокумента = Час(ДатаДокумента);
Если ЧасДокумента >= 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Убедитесь, что значение имеет тип «Дата» и заполнено
- 2В коде вызовите Час(ЗначениеДаты) и сохраните результат в числовую переменную
- 3В запросе используйте ЧАС(ПолеДаты) в списке выборки или группировки
- 4Для отображения примените Формат(Дата, "ДФ=HH:mm")
- 5Проверьте результат на граничных значениях: 00:00, 23:59, пустая дата
Проверка корректности
Проверяйте результат на контрольных примерах: для даты 15.03.2026 09:05:00 функция Час() обязана вернуть 9, для 31.12.2026 23:59:59 — 23. Если вместо ожидаемого часа вы получаете 0, чаще всего причина в том, что дата фактически не содержит времени (записана как начало дня) или не заполнена вовсе.
Что важно запомнить
Часы из даты извлекаются функцией Час() в коде, ЧАС() в запросе и форматной строкой "ДФ=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, и извлекать часы не из чего.