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