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

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

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

Как в запросе 1С получить время без даты: функции ЧАС, МИНУТА, СЕКУНДА, РАЗНОСТЬДАТ, преобразование в строку. Примеры кода, ошибки и проверка результата.

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

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

Почему в запросе 1С нет чистого времени

Тип «Дата» в 1С всегда содержит и календарную дату, и время с точностью до секунды. Значение «01.01.0001 14:30:00» — это, по сути, время без значимой даты, но платформа всё равно хранит его как полноценную дату. В языке запросов нет функции вида «ВРЕМЯ()», которая вернула бы отдельный объект времени.

Из этого следует главное практическое правило: «время без даты» в запросе — это либо набор чисел (часы, минуты, секунды), либо число секунд от начала суток, либо строка вида «14:30:00». Каждый вариант имеет свои ограничения при сравнении, сортировке и группировке, поэтому формат выбирают под конкретную задачу.

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

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

ВЫБРАТЬ

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

МИНУТА(Продажи.Период) КАК МинутаПродажи,

СЕКУНДА(Продажи.Период) КАК СекундаПродажи,

Продажи.Номенклатура КАК Номенклатура

ИЗ

РегистрНакопления.Продажи КАК Продажи

Такой запрос вернёт время разложенным по компонентам. Например, для периода «12.03.2026 09:45:17» поле ЧасПродажи будет равно 9, МинутаПродажи — 45, СекундаПродажи — 17. Дальше эти числа можно использовать в секции ГДЕ, СГРУППИРОВАТЬ ПО или УПОРЯДОЧИТЬ ПО.

Типичный сценарий — отчёт по почасовой загрузке: группировка по ЧАС(Период) показывает распределение операций по часам суток независимо от конкретных дат. Минус подхода в том, что три отдельных числа неудобно сравнивать с интервалом «с 09:30 до 18:15» — для этого лучше подходит приём из следующего раздела.

Время как число секунд от начала дня

Для сравнений и фильтрации по интервалу времени удобнее всего представить время одним числом — количеством секунд, прошедших от начала суток. Для этого из даты вычитают начало её дня через функцию РАЗНОСТЬДАТ.

ВЫБРАТЬ

РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ), Документ.Дата, СЕКУНДА) КАК СекундОтНачалаДня

ИЗ

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

Число «34200» здесь означает 09:30:00 (9 × 3600 + 30 × 60). Сравнение интервалов становится простым: условие «документ создан в рабочее время с 9:00 до 18:00» записывается как проверка, что секунды от начала дня лежат между 32400 и 64800.

ГДЕ

РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ), Документ.Дата, СЕКУНДА) МЕЖДУ 32400 И 64800

Когда нужны границы дня: НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА

Если задача обратная — отбросить время и оставить только дату, либо получить опорную точку суток, — используются функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА. НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) возвращает ту же дату с нулевым временем (00:00:00), а КОНЕЦПЕРИОДА(Дата, ДЕНЬ) — 23:59:59.

Эти функции часто идут в паре с предыдущим приёмом: начало дня служит базой для вычисления секунд, а конец дня — верхней границей при отборе «все документы за день до такого-то времени». Например, отбор «документы сегодня до 12:00» строится как Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) И ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), СЕКУНДА, 43200).

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

ЧАС / МИНУТА / СЕКУНДА

Подходит для группировок и вывода отдельных компонентов. Неудобно для сравнения с интервалом времени.

Секунды от начала дня (РАЗНОСТЬДАТ)

Лучший вариант для фильтрации по интервалу и сортировки. Требует пересчёта границ в секунды.

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

Подходит только для отображения. Строки нельзя корректно сравнивать и сортировать как время.

Получение времени в виде строки

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Документ.Дата) КАК ДатаСтрокой

ИЗ

Документ.ПриходныйОрдер КАК Документ

Более управляемый вариант — собрать строку в выражении через ВЫРАЗИТЬ и конкатенацию, дополняя однозначные числа нулями. Однако на практике форматирование времени чаще выполняют уже на стороне кода после выполнения запроса, через Формат(Значение, "ДФ=ЧЧ:мм:сс") — это проще и не перегружает текст запроса.

Если время нужно только для показа в отчёте на СКД, не мучайте запрос строковыми функциями: оставьте поле типа «Дата» и задайте форматную строку ДФ=ЧЧ:мм:сс в настройках поля — результат тот же, запрос проще.
ПЗ
Практическое замечание

Типовые сценарии и готовые решения

Фильтр документов по рабочему времени

Задача: выбрать документы, проведённые вне рабочего времени (например, ночью), для контроля. Решение — сравнение секунд от начала дня с границами.

ВЫБРАТЬ

Документ.Ссылка КАК Документ,

Документ.Дата КАК Дата

ИЗ

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

ГДЕ

РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ), Документ.Дата, СЕКУНДА) < 32400

ИЛИ РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ), Документ.Дата, СЕКУНДА) > 64800

Группировка продаж по часам

Для анализа почасовой нагрузки группируйте по ЧАС(Период) и суммируйте показатели. Такой отчёт показывает, в какие часы суток чаще совершаются операции, независимо от дат.

ВЫБРАТЬ

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

СУММА(Продажи.Количество) КАК Количество

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

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

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

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

Час

Параметр-время в запросе

Если время приходит параметром из кода, передавайте его как дату с нулевой календарной частью (Дата(1,1,1,9,30,0)) либо сразу как число секунд. Число надёжнее: оно не зависит от того, как платформа интерпретирует «пустую» дату.

Порядок действий
  1. 1
    Определите цель: отображение, фильтрация или группировка по времени.
  2. 2
    Для группировки используйте ЧАС(), для фильтрации — РАЗНОСТЬДАТ от начала дня в секундах.
  3. 3
    Пересчитайте границы интервала в секунды и проверьте их на калькуляторе.
  4. 4
    Выполните запрос в консоли запросов и сверьте результат с известным документом.
  5. 5
    Если время нужно только показать — задайте форматную строку вместо строковых функций.

Частые ошибки и как их проверить

Первая ошибка — попытка сравнивать дату со строкой времени напрямую, например ГДЕ Документ.Дата > "18:00". Запрос либо не выполнится, либо даст непредсказуемый результат, потому что типы несовместимы. Сравнивать нужно либо числа с числами, либо даты с датами.

Вторая ошибка — забыть, что функции ЧАС/МИНУТА/СЕКУНДА возвращают число без ведущего нуля: 9 утра — это «9», а не «09». При склейке строки вида ЧАС + ":" + МИНУТА получится «9:5» вместо «09:05», что ломает сортировку и выглядит некорректно.

Третья ошибка — использование РАЗНОСТЬДАТ с единицей ЧАС и ожидание дробного результата. Функция возвращает целое число полных единиц: разница в 1 час 59 минут в часах даст 1. Для точных интервалов всегда берите СЕКУНДА.

Типичные ошибки
01
Сравнение даты со строкой времени — запрос падает или возвращает неверный результат; сравнивайте секунды с секундами.
02
Ожидание дробного результата от РАЗНОСТЬДАТ в часах — функция отбрасывает дробную часть, используйте СЕКУНДА.
03
Склейка строки времени без ведущих нулей — получается «9:5» вместо «09:05», ломается сортировка.
04
Ошибка в пересчёте границ интервала в секунды — проверяйте: часы × 3600 + минуты × 60.
Контрольные точки

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

Значение секунд от начала дня для известного документа
Норма

Совпадает с расчётом: часы × 3600 + минуты × 60 + секунды

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

Число не сходится — проверьте аргументы НАЧАЛОПЕРИОДА и единицу измерения

Группировка по ЧАС(Период)
Норма

Часы в диапазоне 0–23, итоги сходятся с общей суммой

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

Появляются значения вне диапазона или теряются строки

Фильтр по интервалу времени
Норма

В выборку попадают документы строго внутри интервала, граничные значения включены

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

Граничные документы отсутствуют — проверьте МЕЖДУ и точность до секунд

Ограничения и альтернативы

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

Альтернатива запросным функциям — обработка результата в коде: выбрать дату как есть, а время извлечь через Формат() или вычисления после выполнения запроса. Это оправдано, когда время нужно в одном-двух местах отчёта и не участвует в отборах.

Итог

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

Чистого типа «время» в запросах 1С нет. Для группировки берите ЧАС/МИНУТА/СЕКУНДА, для фильтрации по интервалу — РАЗНОСТЬДАТ от начала дня в секундах, для отображения — форматную строку. Границы интервалов пересчитывайте в секунды и проверяйте на известных документах.

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

Можно ли сравнить время двух документов напрямую, без пересчёта в секунды?

Напрямую сравнить «время без даты» нельзя, потому что сравнивается вся дата целиком. Приведите оба значения к секундам от начала дня через РАЗНОСТЬДАТ и сравнивайте числа — это корректно и работает в условиях и соединениях.

Почему РАЗНОСТЬДАТ в минутах даёт не тот результат, что я ожидаю?

Функция возвращает целое число полных единиц и отбрасывает остаток. Разница 1 час 59 минут в часах равна 1, а не 2. Для точных расчётов берите самую мелкую единицу — СЕКУНДА — и при необходимости делите результат сами.

Как вывести время в отчёте на СКД в формате ЧЧ:ММ?

Оставьте в запросе поле типа «Дата», а в настройках СКД для этого поля задайте форматную строку ДФ=ЧЧ:мм. СКД отобразит только время, не меняя текст запроса.

Работают ли ЧАС, МИНУТА, СЕКУНДА в секции ГДЕ?

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

Как передать в запрос время «18:30» параметром?

Надёжнее всего передать число секунд от начала дня (18 × 3600 + 30 × 60 = 66600) и сравнивать с РАЗНОСТЬДАТ. Альтернатива — дата Дата(1,1,1,18,30,0), но тогда в запросе придётся извлекать из неё компоненты, что усложняет условие.

Есть ли разница между версиями платформы 8.3 в этих функциях?

Функции ЧАС, МИНУТА, СЕКУНДА, РАЗНОСТЬДАТ, НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА стабильно присутствуют в языке запросов платформы 8.3 и ведут себя одинаково в актуальных релизах. Специфические отличия возможны только в режиме совместимости со старыми версиями, что встречается редко.