Как вывести время в 1С с лидирующим нулем в формате ЧЧ:мм:сс?

Программист IT и автоматизация бизнеса
← На главную

При разработке интерфейсов и формировании текстовых сообщений в системе 1С:Предприятие 8.3 часто возникает задача корректного отображения времени. Одной из самых распространенных проблем является вывод «коротких» часов (от 0 до 9) без ведущего нуля. Например, вместо эстетичного 09:12:17 система может выдать 9:12:17. В этой статье мы подробно разберем, как управлять форматом времени, какие функции использовать и каких критических ошибок стоит избегать.

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

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

Проанализируем пример кода, который решает поставленную задачу:


ТекущийМомент = ТекущаяДата(); // Например, 05.12.2023 09:05:07
СтрокаВремени = Формат(ТекущийМомент, "ДФ=ЧЧ:mm:сс");
Сообщить(СтрокаВремени); // Результат: "09:05:07"

В данном примере крайне важна часть ДФ=. Разберем по шагам, что означают эти символы в форматной строке:

  1. ДФ (Дата Формат) — это префикс, который указывает системе, что далее следует пользовательский шаблон отображения даты/времени.
  2. ЧЧ (HH) — двухзначный формат часа (от 00 до 23). Именно двойное написание символа «Ч» заставляет систему добавлять лидирующий ноль.
  3. mm — минуты с лидирующим нулем.
  4. сс — секунды с лидирующим нулем.

Почему важно указывать префикс ДФ?

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

Критическое различие между «мм» и «ММ»

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

Если вы ошибочно напишете "ДФ=ЧЧ:ММ:сс" в июне месяце, то для времени 09:12:17 вы получите результат 09:06:17, где «06» — это порядковый номер июня, а не количество минут. Поэтому при работе со временем всегда проверяйте регистр символов.

Альтернативный способ: ручное формирование строки

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


ВыбраннаяДата = ТекущаяДата();
Часы   = Прав("0" + Час(ВыбраннаяДата), 2);
Минуты = Прав("0" + Минута(ВыбраннаяДата), 2);
Секунды = Прав("0" + Секунда(ВыбраннаяДата), 2);

Результат = Часы + ":" + Минуты + ":" + Секунды;
Сообщить(Результат);

Разберем логику этого метода: мы принудительно добавляем символ «0» перед числом и с помощью функции Прав() берем только два правых знака. Если час был 5, то "05" превратится в 05. Если час был 12, то "012" после обрезки справа также превратится в 12. Этот метод более громоздкий, но он наглядно показывает механизм управления строками.

Работа с 12-часовым форматом (AM/PM)

Если ваша задача требует вывода времени в международном стандарте (например, для англоязычных пользователей), стоит рассмотреть использование индикаторов AM и PM. В 1С это реализуется следующими кодами:

Посмотрим на пример:


// Для времени 21:00:00
ТекстВремени = Формат(ТекущаяДата(), "ДФ='ч:мм:сс вв'"); 
// Результат будет "9:00:00 PM"

Особенности форматирования в отчетах (СКД)

Рассмотрим ситуацию, когда время нужно вывести не в коде, а в отчете, созданном через Систему компоновки данных (СКД). Программисту не обязательно писать код для каждого поля. В СКД на вкладке «Наборы данных» или «Вычисляемые поля» есть колонка «Оформление». Там можно нажать на кнопку выбора в параметре «Формат» и открыть визуальный конструктор, который сам сформирует нужную строку ДФ=....

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

Обработка пустой даты

Проанализируем еще один важный нюанс — работу с незаполненными значениями. В 1С «пустая» дата соответствует значению 01.01.0001 00:00:00. Если вы примените формат ДФ=ЧЧ:mm:сс к такой дате, система выведет 00:00:00. В некоторых бизнес-задачах вместо нулей логичнее показывать пустую строку. Выясним, как это реализовать:


ДатаДляВывода = ?(ЗначениеЗаполнено(Объект.ДатаВремя), 
                  Формат(Объект.ДатаВремя, "ДФ=ЧЧ:mm:сс"), 
                  "");

Использование тернарного оператора ?() позволяет избежать вывода нулевого времени там, где данные еще не были введены пользователем.

Использование локальных настроек (ДЛФ)

Если ваше приложение используется в разных регионах, бывает полезно доверить форматирование операционной системе пользователя. Для этого используется код ДЛФ (Дата Локальный Формат). Рассмотрим пример:


// Вывод только времени согласно настройкам Windows/Linux
СтрокаВремени = Формат(ТекущаяДата(), "ДЛФ=В"); 

Параметр ДЛФ=В (Время) автоматически подберет разделители (двоеточие или точка) и порядок следования компонентов, принятый в конкретной стране. Это делает интерфейс программы более дружелюбным для конечного пользователя.

Подводя итог, можно сказать, что наиболее универсальным и производительным способом вывода времени с лидирующими нулями является функция Формат(Дата, "ДФ=ЧЧ:mm:сс"). Она покрывает 90% задач разработчика, обеспечивая корректное и профессиональное отображение данных в интерфейсе.

← На главную