Как преобразовать секунды в формат ЧЧ:ММ и корректно отображать лидирующие нули для нулевых значений в 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

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

Способ 1. Использование форматной строки для чисел

Разберем ситуацию, когда у нас уже есть числовое значение (например, количество минут или часов) и нам нужно вывести его строго двумя цифрами. Проблема автора заключалась в том, что при использовании кода Формат(0, "ЧЦ=2; ЧВН=") система возвращала пустую строку. Это происходит потому, что в 1С по умолчанию для нулевого значения не предусмотрено отображение, если не задан специальный параметр.

Проанализируем правильный состав форматной строки:

Для того чтобы ноль отображался как "00", необходимо явно указать это в параметре ЧН. Посмотрим на пример кода:


// Правильное форматирование числа для отображения 0 как "00"
Значение = 0;
Результат = Формат(Значение, "ЧЦ=2; ЧВН=; ЧН=00"); 
// Результат будет "00"

Значение5 = 5;
Результат5 = Формат(Значение5, "ЧЦ=2; ЧВН=; ЧН=00");
// Результат будет "05"

Способ 2. Преобразование через тип Дата (для коротких интервалов)

Если нам нужно быстро преобразовать общее количество секунд в строку времени, часто предлагают использовать тип Дата. Мы можем прибавить количество секунд к пустой дате (начало времен) и применить формат даты.

Рассмотрим этот способ по шагам:


КоличествоСекунд = 750; // 12 минут 30 секунд
ПустаяДата = '00010101'; // Минимальная дата в 1С
НужнаяДата = ПустаяДата + КоличествоСекунд;

// Используем форматную строку для даты
// ДФ (Формат Даты): мм - минуты, сс - секунды
СтрокаВремени = Формат(НужнаяДата, "ДФ=мм:сс");
Сообщить(СтрокаВремени); // Выведет "12:30"

Важное ограничение: Этот метод идеально подходит, если ваша длительность не превышает 23 часа 59 минут 59 секунд. Как только количество секунд перешагнет через отметку 86 400 (сутки), формат даты начнет показывать часы заново с нуля (или прибавит день к дате), что приведет к логической ошибке в отчете или интерфейсе.

Способ 3. Универсальный математический расчет длительности

Выясним причину, по которой профессиональные разработчики предпочитают математический расчет. Он лишен ограничений 24 часов и позволяет выводить любое количество часов (например, "150:30").

Разберем алгоритм вычисления:

  1. Вычисляем количество целых часов путем деления общего числа секунд на 3600.
  2. Вычисляем остаток секунд и делим его на 60 для получения минут.
  3. Форматируем каждое число отдельно с использованием параметров ЧВН и ЧН.

Пример реализации функции:


Функция ПреобразоватьСекундыВЧЧММ(ВсегоСекунд)
    
    ЦелыхЧасов = Цел(ВсегоСекунд / 3600);
    ЦелыхМинут = Цел((ВсегоСекунд % 3600) / 60);
    
    // Форматируем часы (может быть больше 2-х знаков, поэтому ЧЦ не ограничиваем жестко)
    СтрЧасы = Формат(ЦелыхЧасов, "ЧН=00; ЧВН=");
    
    // Форматируем минуты (всегда 2 знака)
    СтрМинуты = Формат(ЦелыхМинут, "ЧЦ=2; ЧН=00; ЧВН=");
    
    Возврат СтрЧасы + ":" + СтрМинуты;
    
КонецФункции

Способ 4. Использование конструктора форматной строки

Если вы не хотите запоминать названия параметров (ЧН, ЧВН), в 1С предусмотрен визуальный помощник. Рассмотрим, как им воспользоваться:

  1. В конфигураторе в модуле нажмите правой кнопкой мыши внутри пустых кавычек.
  2. Выберите пункт "Конструктор форматной строки".
  3. Перейдите на закладку "Число".
  4. Установите флажок "Выводить лидирующие нули".
  5. В поле "Представление нуля" введите нужную строку (например, 00).
  6. Нажмите "ОК", и система сама сгенерирует код типа "ЧЦ=2; ЧН=00; ЧВН=".

Способ 5. Программный метод "дополнения слева"

Существует еще один надежный способ гарантировать наличие нулей без использования форматной строки. Это строковые операции. Мы добавляем "00" в начало строки и обрезаем результат справа, оставляя только 2 символа. Проанализируем пример:


Минуты = 5;
// Превращаем число в строку, убираем пробелы, добавляем 00 слева
СтрМинуты = Прав("00" + СокрЛП(Минуты), 2);
// Результат: "05"

Минуты = 0;
СтрМинуты = Прав("00" + СокрЛП(Минуты), 2);
// Результат: "00"

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

Подведем итоги: Для вывода "00" при нулевом значении обязательно используйте параметр ЧН=00. Если же задача стоит в отображении длительности более суток, откажитесь от типа Дата в пользу математического расчета и склейки строк. Это гарантирует корректность данных в любых условиях эксплуатации программы.

← На главную