В процессе разработки в системе 1С:Предприятие часто возникает задача представления длительности (выраженной в секундах) в человекочитаемом виде ЧЧ:ММ. Одной из неочевидных проблем при этом становится вывод лидирующих нулей, особенно когда само значение часа или минуты равно нулю. По умолчанию функция Формат() может возвращать пустую строку для нулевых значений, что не всегда подходит под требования интерфейса, где мы ожидаем увидеть "00".
В этой статье мы подробно разберем, как правильно сконструировать форматную строку, рассмотрим ограничения стандартных методов и выработаем универсальное решение для любых временных интервалов.
Разберем ситуацию, когда у нас уже есть числовое значение (например, количество минут или часов) и нам нужно вывести его строго двумя цифрами. Проблема автора заключалась в том, что при использовании кода Формат(0, "ЧЦ=2; ЧВН=") система возвращала пустую строку. Это происходит потому, что в 1С по умолчанию для нулевого значения не предусмотрено отображение, если не задан специальный параметр.
Проанализируем правильный состав форматной строки:
Для того чтобы ноль отображался как "00", необходимо явно указать это в параметре ЧН. Посмотрим на пример кода:
// Правильное форматирование числа для отображения 0 как "00"
Значение = 0;
Результат = Формат(Значение, "ЧЦ=2; ЧВН=; ЧН=00");
// Результат будет "00"
Значение5 = 5;
Результат5 = Формат(Значение5, "ЧЦ=2; ЧВН=; ЧН=00");
// Результат будет "05"
Если нам нужно быстро преобразовать общее количество секунд в строку времени, часто предлагают использовать тип Дата. Мы можем прибавить количество секунд к пустой дате (начало времен) и применить формат даты.
Рассмотрим этот способ по шагам:
КоличествоСекунд = 750; // 12 минут 30 секунд
ПустаяДата = '00010101'; // Минимальная дата в 1С
НужнаяДата = ПустаяДата + КоличествоСекунд;
// Используем форматную строку для даты
// ДФ (Формат Даты): мм - минуты, сс - секунды
СтрокаВремени = Формат(НужнаяДата, "ДФ=мм:сс");
Сообщить(СтрокаВремени); // Выведет "12:30"
Важное ограничение: Этот метод идеально подходит, если ваша длительность не превышает 23 часа 59 минут 59 секунд. Как только количество секунд перешагнет через отметку 86 400 (сутки), формат даты начнет показывать часы заново с нуля (или прибавит день к дате), что приведет к логической ошибке в отчете или интерфейсе.
Выясним причину, по которой профессиональные разработчики предпочитают математический расчет. Он лишен ограничений 24 часов и позволяет выводить любое количество часов (например, "150:30").
Разберем алгоритм вычисления:
ЧВН и ЧН.Пример реализации функции:
Функция ПреобразоватьСекундыВЧЧММ(ВсегоСекунд)
ЦелыхЧасов = Цел(ВсегоСекунд / 3600);
ЦелыхМинут = Цел((ВсегоСекунд % 3600) / 60);
// Форматируем часы (может быть больше 2-х знаков, поэтому ЧЦ не ограничиваем жестко)
СтрЧасы = Формат(ЦелыхЧасов, "ЧН=00; ЧВН=");
// Форматируем минуты (всегда 2 знака)
СтрМинуты = Формат(ЦелыхМинут, "ЧЦ=2; ЧН=00; ЧВН=");
Возврат СтрЧасы + ":" + СтрМинуты;
КонецФункции
Если вы не хотите запоминать названия параметров (ЧН, ЧВН), в 1С предусмотрен визуальный помощник. Рассмотрим, как им воспользоваться:
00)."ЧЦ=2; ЧН=00; ЧВН=".Существует еще один надежный способ гарантировать наличие нулей без использования форматной строки. Это строковые операции. Мы добавляем "00" в начало строки и обрезаем результат справа, оставляя только 2 символа. Проанализируем пример:
Минуты = 5;
// Превращаем число в строку, убираем пробелы, добавляем 00 слева
СтрМинуты = Прав("00" + СокрЛП(Минуты), 2);
// Результат: "05"
Минуты = 0;
СтрМинуты = Прав("00" + СокрЛП(Минуты), 2);
// Результат: "00"
Этот метод считается максимально "безопасным", так как на него никак не влияют региональные настройки операционной системы (например, разделители разрядов или группировка чисел), которые иногда могут искажать результат работы функции Формат().
Подведем итоги: Для вывода "00" при нулевом значении обязательно используйте параметр ЧН=00. Если же задача стоит в отображении длительности более суток, откажитесь от типа Дата в пользу математического расчета и склейки строк. Это гарантирует корректность данных в любых условиях эксплуатации программы.