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

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

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

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

Тип «Дата» в 1С одновременно хранит и календарную дату, и время с точностью до секунды. Когда требуется получить только время — например, для расписания, журнала событий или сравнения накладных по часам отгрузки — программисту нужно извлечь часы, минуты и секунды из полного значения даты.

Встроенный язык 1С предоставляет несколько способов решения задачи: функции Час(), Минута(), Секунда(), форматирование через Формат(), вычисления в запросах и строковые преобразования. Выбор метода зависит от того, что нужно дальше: числовые компоненты для расчётов, строка для вывода пользователю или значение для сравнения в запросе.

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

Как устроен тип «Дата» и что именно мы выделяем

Значение типа «Дата» в 1С — это момент времени, включающий год, месяц, день, часы, минуты и секунды. Отдельного типа «Время» в платформе нет, поэтому «выделить время» означает либо получить числовые компоненты (час, минуту, секунду), либо сформировать строку вида «14:35:20», либо привести дату к началу дня и вычислить смещение в секундах.

Важно понимать: пустая дата в 1С — это 01.01.0001 00:00:00, а не NULL. Если переменная не заполнена, функции извлечения времени вернут нули, что может замаскировать ошибку в данных. Перед обработкой стоит проверять значение на заполненность через ЗначениеЗаполнено() или сравнение с '00010101'.

Выделение часов, минут и секунд функциями Час(), Минута(), Секунда()

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

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

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

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

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

Этот вариант подходит, когда компоненты времени нужны для дальнейших вычислений: проверки попадания в рабочий интервал, расчёта длительности, сортировки событий внутри одного дня. Числа легко сравнивать и складывать без дополнительных преобразований.

Обратите внимание: функции возвращают локальное время значения даты «как есть». Если дата получена из универсального времени (UTC) или из другого часового пояса, предварительно приведите её к нужному поясу функциями МестноеВремя() или УниверсальноеВремя(), иначе часы будут смещены.

Получение времени строкой через Формат()

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

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

// Результат: "14:35:20"

ВремяБезСекунд = Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm");

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

Символ HH в форматной строке означает часы в 24-часовом формате, mm — минуты, ss — секунды. Регистр букв важен: строчные «hh» в некоторых локалях могут трактоваться иначе, поэтому используйте заглавные HH для 24-часового формата.

Строковый результат удобен для отчётов, печатных форм и обменов, но не подходит для сравнений и арифметики. Сравнение строк «09:15» и «14:00» лексикографически даст верный результат только при одинаковой длине и ведущих нулях — именно поэтому формат с HH (с ведущим нулём) предпочтительнее формата без него.

Выделение времени в запросах

В языке запросов 1С есть собственные функции ЧАС(), МИНУТА(), СЕКУНДА(), которые работают прямо в тексте запроса и выполняются на сервере СУБД. Это быстрее, чем выгружать даты и обрабатывать их в цикле.

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

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

"ВЫБРАТЬ

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

| ЧАС(РеализацияТоваровУслуг.Дата) КАК ЧасОтгрузки,

| МИНУТА(РеализацияТоваровУслуг.Дата) КАК МинутаОтгрузки

|ИЗ

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

|ГДЕ

| ЧАС(РеализацияТоваровУслуг.Дата) >= &ЧасНачала";

Функции запроса возвращают числа, поэтому фильтрация вида «документы после 12 часов» записывается простым условием. Это удобно для анализа пиковых часов продаж или контроля ночных операций.

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

Альтернативные способы: разность дат и строковые методы

Смещение от начала дня в секундах

Иногда время удобно представить одним числом — количеством секунд с начала суток. Для этого из даты вычитают начало дня:

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

// Например, для 14:35:20 результат будет 52520 секунд

Такое представление компактно хранится, корректно сортируется и сравнивается. Из него легко восстановить часы и минуты целочисленным делением: часы = Цел(Секунды / 3600), минуты = Цел((Секунды % 3600) / 60).

Строковый разбор

Если дата уже представлена строкой (например, при загрузке из CSV), время выделяют функциями работы со строками: Сред(), СтрНайти(), СтрРазделить(). Для формата «31.12.2026 14:35:20» время начинается после пробела:

ПозицияПробела = СтрНайти(СтрокаДаты, " ");

ВремяСтрокой = Сред(СтрокаДаты, ПозицияПробела + 1);

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

Сравнение вариантов

Час(), Минута(), Секунда()

Подходит для вычислений и сравнений в коде; возвращает числа, не даёт готовую строку.

Формат() с ДФ=HH:mm:ss

Подходит для вывода пользователю и выгрузки; результат — строка, не пригодна для арифметики.

ЧАС()/МИНУТА() в запросе

Подходит для отбора и группировки на сервере СУБД; может отключать индексы на больших таблицах.

Разность с НачалоДня()

Подходит для хранения времени одним числом и сортировки; требует пересчёта для отображения.

Практический сценарий: проверка попадания в рабочее время

Типовая задача — определить, создан ли документ в рабочие часы, например с 9:00 до 18:00. Последовательность действий:

Порядок действий
  1. 1
    Получите дату документа и проверьте её на заполненность: ЗначениеЗаполнено(ДатаДокумента).
  2. 2
    Извлеките час функцией Час(ДатаДокумента).
  3. 3
    Сравните час с границами интервала: РабочееВремя = (ЧасДокумента >= 9) И (ЧасДокумента < 18).
  4. 4
    Если границы заданы с точностью до минут, вычислите секунды с начала дня и сравнивайте их с границами в секундах.
  5. 5
    Выведите результат пользователю или запишите признак в дополнительный реквизит.
Функция ЭтоРабочееВремя(ПроверяемаяДата)

Если Не ЗначениеЗаполнено(ПроверяемаяДата) Тогда

Возврат Ложь;

КонецЕсли;

СекундСНачалаДня = ПроверяемаяДата - НачалоДня(ПроверяемаяДата);

НачалоРаботы = 9 * 3600; // 09:00

КонецРаботы = 18 * 3600; // 18:00

Возврат СекундСНачалаДня >= НачалоРаботы

И СекундСНачалаДня < КонецРаботы;

КонецФункции

Сравнение через секунды надёжнее сравнения только часов: оно корректно обрабатывает границы вида «9:30» и не требует отдельной проверки минут.

Контроль результата и типичные ошибки

После внедрения кода проверьте его на граничных значениях: полночь (00:00:00), конец дня (23:59:59), пустая дата, дата без времени (ровно полночь у документов, где время не заполнялось). Убедитесь, что строковый формат содержит ведущие нули, а числовые функции возвращают ожидаемый диапазон.

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

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

Полночь 00:00:00
Норма

Час() возвращает 0, строка — "00:00:00"

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

Пустая строка или ошибка преобразования

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

Код отрабатывает проверку ЗначениеЗаполнено() и не падает

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

Функции возвращают нули, что принимается за реальное время

Формат вывода
Норма

Часы и минуты с ведущими нулями: 09:05

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

Значения вида 9:5, ломающие сортировку строк

Типичные ошибки
01
Сравнение времени строками без ведущих нулей — «9:15» оказывается «больше» «14:00», и сортировка нарушается.
02
Игнорирование пустой даты — значение 01.01.0001 даёт нулевое время, которое выглядит как полночь и искажает статистику.
03
Использование ТекущаяДата() в серверном коде — на сервере функция недоступна или даёт время сервера; применяйте ТекущаяДатаСеанса().
04
Забытый часовой пояс — время из UTC или другого пояса выводится без приведения, и часы смещаются на несколько часов.
05
Фильтрация по ЧАС() в запросе к большой таблице — индекс по дате не используется, запрос выполняется долго.

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

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

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

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

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

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

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

Как сравнить два времени, если даты разные?

Приведите обе даты к секундам с начала дня: В1 = Дата1 - НачалоДня(Дата1), В2 = Дата2 - НачалоДня(Дата2), и сравнивайте полученные числа. Так сравнение не зависит от календарной части.

Почему Формат() выводит время с AM/PM вместо 24-часового формата?

Это происходит при использовании форматной строки по умолчанию или строчных букв в шаблоне под влиянием региональных настроек. Задайте шаблон явно: Формат(Дата, "ДФ='HH:mm:ss'") — заглавные HH гарантируют 24-часовой формат.

Как выделить время из даты при загрузке из Excel или CSV?

Если значение пришло строкой, сначала преобразуйте его в тип «Дата» (например, через разбор строки или функции работы с датами), а затем применяйте Час(), Минута(), Секунда(). Прямой разбор строки функцией Сред() допустим, но только при строго фиксированном формате исходного файла.

Итог

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

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