Разработка и Конфигурация · 10 мин
Как вытащить время из даты в 1С
Как извлечь время из даты в 1С 8.3: функции Час, Минута, Секунда, форматирование через Формат(), работа в запросах и типовые ошибки с примерами кода.
Во встроенном языке 1С нет отдельного типа «время» — и дата, и время хранятся в одном значении типа «Дата», которое включает год, месяц, день, часы, минуты и секунды. Поэтому задача «вытащить время из даты» решается двумя путями: либо извлечением числовых частей (часы, минуты, секунды), либо форматированием даты в строку вида «14:35:20».
Выбор способа зависит от того, что вы будете делать с результатом дальше. Если время нужно для сравнений, расчётов длительности или арифметики — работайте с числами через функции Час(), Минута(), Секунда(). Если время нужно показать пользователю в отчёте, печатной форме или сообщении — используйте функцию Формат() с подходящей форматной строкой.
Отдельный случай — получение времени в запросе. Там функции языка недоступны, и приходится применять функции языка запросов: ЧАС(), МИНУТА(), СЕКУНДА(), либо вычислять время как разность между полной датой и началом дня.
Как устроен тип «Дата» и почему времени отдельно нет
Тип «Дата» в 1С хранит момент времени с точностью до секунды: дату календаря и время суток одновременно. Значение '20260315143000' означает 15 марта 2026 года, 14 часов 30 минут 00 секунд. Любая дата, даже если вы задали только календарную часть, содержит время — по умолчанию это 00:00:00.
Из этого следует важное практическое свойство: «очистить» дату от времени можно функцией НачалоДня(), а «вытащить» время как самостоятельный объект нельзя — только как набор чисел или как строку. Понимание этого устройства избавляет от типичной ошибки, когда разработчик ищет несуществующий тип «Время» и пытается объявить переменную такого типа.
Проверить, содержит ли дата ненулевое время, можно простым сравнением: если Дата = НачалоДня(Дата), время равно полуночи. Это бывает нужно при контроле корректности ввода, когда документ должен иметь точное время, а пользователь оставил его пустым.
Извлечение часов, минут и секунд функциями языка
Базовый способ — три функции встроенного языка, каждая из которых возвращает число:
Час(Дата)— час в диапазоне от 0 до 23;Минута(Дата)— минуты от 0 до 59;Секунда(Дата)— секунды от 0 до 59.
Пример кода, который разбирает дату документа на составляющие:
ДатаДокумента = ДокументОбъект.Дата;
Часы = Час(ДатаДокумента); // например, 14
Минуты = Минута(ДатаДокумента); // например, 5
Секунды = Секунда(ДатаДокумента);// например, 30
Сообщить("Время документа: " + Часы + ":" + Минуты + ":" + Секунды);
Обратите внимание на деталь: числовые функции возвращают значения без ведущих нулей. Минута «05» вернётся как число 5, и при простой конкатенации строк вы получите «14:5:30» вместо «14:05:30». Если результат выводится пользователю, либо дополняйте нули вручную, либо используйте форматирование — о нём ниже.
Числовые части удобны для расчётов. Например, чтобы перевести время суток в общее количество секунд от полуночи: СекундСНачалаДня = Час(Дата) 3600 + Минута(Дата) 60 + Секунда(Дата). Такое представление удобно сравнивать и использовать в условиях.
ДатаДокумента = ТекущаяДатаСеанса();
Часы = Час(ДатаДокумента);
Минуты = Минута(ДатаДокумента);
СекундСНачалаДня = Часы <em> 3600 + Минуты </em> 60 + Секунда(ДатаДокумента);Вывод времени строкой через функцию Формат()
Когда время нужно показать пользователю, правильный инструмент — функция Формат() с параметром «ДФ» (формат даты). Она сразу возвращает строку с ведущими нулями и нужным разделителем:
ДатаДокумента = ДокументОбъект.Дата;
ВремяСтрокой = Формат(ДатаДокумента, "ДФ=ЧЧ:мм:сс"); // "14:05:30"
ТолькоЧасыМинуты = Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "14:05"
Здесь важен регистр и точные обозначения компонентов: ЧЧ — часы, мм — минуты, сс — секунды. Частая ошибка — написать ДФ=ЧЧ:ММ:сс с заглавными «ММ»: заглавная «М» в форматных строках 1С означает месяц, и вместо минут вы получите номер месяца. Проверяйте результат на тестовой дате, где месяц и минуты различаются.
Для локализованного вывода можно использовать параметр «ДЛФ» (локальный формат даты): Формат(Дата, "ДЛФ=T") вернёт время в формате, принятом для текущей региональной настройки. Это удобно в отчётах, где формат должен соответствовать ожиданиям пользователя, а не жёстко зашитой маске.
Как получить время в запросе
В языке запросов доступны аналогичные функции: ЧАС(), МИНУТА(), СЕКУНДА(). Они применяются к полям типа «Дата» и возвращают числа, которые затем можно группировать, фильтровать или выводить:
ВЫБРАТЬ
Продажи.Документ КАК Документ,
ЧАС(Продажи.Дата) КАК ЧасПродажи,
МИНУТА(Продажи.Дата) КАК МинутаПродажи
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
ЧАС(Продажи.Дата) >= 18
Такой запрос выберет документы, проведённые после 18:00. Обратите внимание: условие по времени через ЧАС() не использует индексы по полю даты, поэтому на больших таблицах сначала ограничивайте выборку по диапазону дат, а уже потом фильтруйте по времени.
Альтернативный приём — вычислить время как разность в секундах между датой и началом её дня: РАЗНОСТЬДАТЬ(НАЧАЛОПЕРИОДА(Продажи.Дата, ДЕНЬ), Продажи.Дата, СЕКУНДА). Результат — количество секунд от полуночи, которое удобно сортировать и сравнивать без разбора на часы и минуты.
Практические сценарии использования
Сравнение времени без учёта даты
Чтобы проверить, попадает ли момент в рабочий интервал, скажем с 9:00 до 18:00, переведите время в секунды от полуночи и сравните числа. Строковое сравнение «09:00» < «17:30» работает только при строго одинаковом формате с ведущими нулями и легко ломается — числовое сравнение надёжнее.
Подстановка времени в новую дату
Обратная задача — собрать дату с нужным временем — решается сложением: НоваяДата = НачалоДня(Дата) + 14 3600 + 30 60. К значению типа «Дата» можно прибавлять число секунд. Так удобно, например, переносить документ на то же время другого дня.
Время в печатных формах и отчётах СКД
В макетах печатных форм значение параметра типа «Дата» по умолчанию выводится полностью, с датой. Чтобы показать только время, заранее преобразуйте значение через Формат() в коде, либо задайте форматную строку в свойствах параметра макета. В СКД формат поля задаётся на закладке «Наборы данных» или через оформление поля — там же можно указать ДФ=ЧЧ:мм.
- 1Определите цель: время нужно для расчёта или для показа пользователю
- 2Для расчётов извлеките числа через Час(), Минута(), Секунда() или переведите время в секунды от полуночи
- 3Для вывода примените Формат(Дата, "ДФ=ЧЧ:мм:сс") — ведущие нули добавятся автоматически
- 4В запросе используйте ЧАС(), МИНУТА(), СЕКУНДА() и сначала ограничьте выборку по периоду
- 5Проверьте результат на дате с нулевым временем и на дате с минутами меньше 10
Проверка результата и граничные случаи
После реализации проверьте код на нескольких контрольных значениях. Дата с временем 00:00:00 должна дать «00:00:00», а не пустую строку и не ошибку. Дата с минутами 05 должна выводиться как «05», а не «5» — это сразу выявляет проблему ведущих нулей при ручной склейке строк.
Отдельно проверьте поведение с пустой датой. Значение '00010101' (пустая дата) формально содержит время 00:00:00, и функции вернут нули. Если в вашей логике пустая дата должна обрабатываться иначе, добавьте явную проверку Если Не ЗначениеЗаполнено(Дата) Тогда ....
Ещё один нюанс — часовые пояса. Функция ТекущаяДатаСеанса() возвращает время сеанса, а ТекущаяДата() на клиенте — время клиентского компьютера. Если время извлекается для бизнес-логики (например, «документы после 18:00»), используйте дату сеанса или дату документа, а не показания часов конкретного рабочего места.
Как проверить результат
Возвращается «00:00:00» или нулевые числа
Пустая строка, ошибка или пропуск записи
Выводится «14:05» с ведущим нулём
Выводится «14:5» — потерян ноль
В строке времени стоят минуты
Вместо минут подставлен номер месяца — ошибка в регистре «ММ»
Обрабатывается по задуманной логике
Молча возвращает 00:00:00 и искажает расчёты
Часто задаваемые вопросы
Можно ли объявить в 1С переменную типа «Время»?
Нет. Платформа 1С не имеет отдельного типа «Время» — время всегда является частью значения типа «Дата». Для хранения времени как самостоятельной величины используют либо дату с нулевой календарной частью, либо число секунд от полуночи, либо строку фиксированного формата.
Как вычесть время из даты, оставив только календарную часть?
Используйте функцию НачалоДня(Дата) — она возвращает ту же дату со временем 00:00:00. В запросе аналог — НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Это стандартный приём для сравнения дат без учёта времени.
Почему Формат(Дата, "ДФ=ЧЧ:ММ:сс") показывает неправильные минуты?
Потому что заглавные «ММ» в форматной строке обозначают месяц, а минуты записываются строчными «мм». Замените формат на ДФ=ЧЧ:мм:сс и проверьте результат на дате, где номер месяца и минуты различаются.
Как сравнить два момента времени без привязки к дате?
Переведите оба значения в секунды от полуночи: Час(Дата) 3600 + Минута(Дата) 60 + Секунда(Дата) — и сравните полученные числа. Сравнение строк вида «ЧЧ:мм» ненадёжно, а сравнение полных дат учитывает и календарную часть.
Как получить время в запросе сразу строкой «ЧЧ:мм»?
Язык запросов не имеет функции форматирования, поэтому строку собирают уже после выполнения запроса — при обходе выборки через Формат(). Внутри запроса выбирайте числовые значения ЧАС() и МИНУТА() или само поле даты целиком.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса() при работе со временем?
ТекущаяДатаСеанса() возвращает единое время сеанса на сервере, а ТекущаяДата() на клиенте — время конкретного компьютера, которое может отличаться из-за часовых поясов или неверных настроек. Для бизнес-логики и отборов по времени надёжнее использовать дату сеанса или дату самого документа.
Что важно запомнить
Отдельного типа «время» в 1С нет — время извлекают из даты функциями Час(), Минута(), Секунда() для расчётов и Формат(Дата, "ДФ=ЧЧ:мм:сс") для вывода. В запросах работают ЧАС(), МИНУТА(), СЕКУНДА(). Следите за регистром букв в форматной строке, ведущими нулями и обработкой пустых дат.