В процессе разработки часто возникает задача представить некий временной интервал, хранящийся в секундах, в удобном для пользователя виде. Например, вместо "7265 секунд" показать "02 часа 01 минута 05 секунд" или "2 часа 1 минута 5 секунд". Разберем, как реализовать такое преобразование в 1С, рассмотрев два основных подхода: использование стандартной функции платформы и создание собственного, более гибкого механизма.
Самый простой и быстрый способ для форматирования длительности — это встроенная функция Формат(). Она идеально подходит, когда вам нужно получить строку стандартного вида, например, ЧЧ:ММ:СС, а визуально настроить шаблон поможет генератор форматированной строки.
Принцип работы:
Функция Формат() принимает два параметра: само значение (в нашем случае — общее количество секунд) и строку формата. Для работы с длительностью используется специальный параметр форматной строки — ДЛФ (Длительность, Локальный Формат).
Посмотрим на практический пример. Допустим, у нас есть интервал в 90061 секунду. Это 1 день, 1 час, 1 минута и 1 секунда.
// Исходные данные
КоличествоСекунд = 90061;
// Используем функцию Формат для представления в виде ЧЧ:ММ:СС
// Важно: ЧЧ здесь обозначает общее количество часов, а не часы в сутках.
// Поэтому 1 день и 1 час превратятся в 25 часов.
ПредставлениеВремени = Формат(КоличествоСекунд, "ДЛФ=ЧЧ:мм:сс");
// В результате получим строку "25:01:01"
Сообщить(ПредставлениеВремени);
Можно также добавить текстовые пояснения прямо в строку формата. Для этого литералы (неизменяемые строки) нужно заключать в одинарные кавычки.
// Добавляем текстовые пояснения
КоличествоСекунд = 90061;
ПредставлениеВремени = Формат(КоличествоСекунд, "ДЛФ=""ЧЧ 'часов' мм 'минут' сс 'секунд'""");
// Результат: "25 часов 01 минут 01 секунд"
Сообщить(ПредставлениеВремени);
Важный момент: этот способ не выделяет дни как отдельную единицу. Он показывает общее количество часов. Если вам нужно получить именно формат «Дни, Часы, Минуты», то стандартная функция Формат() в чистом виде не подойдет. В этом случае необходимо переходить ко второму, более универсальному решению.
Когда требуется гибкость, например, для правильного склонения слов («1 час», «2 часа», «5 часов») или для вывода количества дней, лучшим решением будет написать собственную функцию. Разберем этот процесс по шагам.
В основе лежит простая арифметика. Нам нужно последовательно вычислить количество дней, часов, минут и секунд, каждый раз вычитая уже посчитанную часть из общего интервала.
Давайте оформим эту логику в виде функции, возвращающей структуру с вычисленными значениями.
// Функция принимает общее количество секунд и возвращает структуру
// с разложенными значениями дней, часов, минут и секунд.
Функция РазложитьПериодНаСоставляющие(Знач ОбщееКоличествоСекунд)
Результат = Новый Структура("Дни, Часы, Минуты, Секунды", 0, 0, 0, 0);
// Рассчитываем количество полных дней
Результат.Дни = Цел(ОбщееКоличествоСекунд / 86400);
ОстатокСекунд = ОбщееКоличествоСекунд % 86400;
// Из остатка рассчитываем количество полных часов
Результат.Часы = Цел(ОстатокСекунд / 3600);
ОстатокСекунд = ОстатокСекунд % 3600;
// Из нового остатка рассчитываем количество полных минут
Результат.Минуты = Цел(ОстатокСекунд / 60);
// Все, что осталось - это секунды
Результат.Секунды = ОстатокСекунд % 60;
Возврат Результат;
КонецФункции
Теперь, когда у нас есть компоненты времени (дни, часы и т.д.), нам нужно собрать их в одну строку. Простое сложение "2" + "часы" даст неверный результат, если у нас будет "1 час" или "5 часов". Для решения этой задачи создадим вспомогательную функцию для склонения существительных.
Эта функция будет принимать число и три формы слова (например, для одного, для двух и для пяти).
// Универсальная функция для склонения слов в зависимости от числа
// Форма1: для чисел, оканчивающихся на 1 (кроме 11), например, "день".
// Форма2: для чисел, оканчивающихся на 2, 3, 4 (кроме 12, 13, 14), например, "дня".
// Форма5: для всех остальных случаев, например, "дней".
Функция Склонять(Знач Число, Форма1, Форма2, Форма5)
Если Число % 100 > 10 И Число % 100 < 15 Тогда
Возврат Форма5;
КонецЕсли;
Остаток = Число % 10;
Если Остаток = 1 Тогда
Возврат Форма1;
ИначеЕсли Остаток > 1 И Остаток < 5 Тогда
Возврат Форма2;
Иначе
Возврат Форма5;
КонецЕсли;
КонецФункции
Осталось собрать все вместе. Создадим финальную функцию, которая будет вызывать две предыдущие и формировать итоговую строку. Мы будем добавлять в результирующую строку только ненулевые значения, чтобы не выводить "0 дней", если интервал меньше суток.
// Основная функция, преобразующая секунды в читаемую строку
Функция ПредставлениеПериода(Знач ОбщееКоличествоСекунд)
Если ОбщееКоличествоСекунд = 0 Тогда
Возврат "0 секунд";
КонецЕсли;
// Получаем структуру с разложенным временем
СоставляющиеВремени = РазложитьПериодНаСоставляющие(ОбщееКоличествоСекунд);
// Собираем результат в массив строк
МассивСтрок = Новый Массив;
Если СоставляющиеВремени.Дни > 0 Тогда
МассивСтрок.Добавить(Строка(СоставляющиеВремени.Дни) + " " + Склонять(СоставляющиеВремени.Дни, "день", "дня", "дней"));
КонецЕсли;
Если СоставляющиеВремени.Часы > 0 Тогда
МассивСтрок.Добавить(Строка(СоставляющиеВремени.Часы) + " " + Склонять(СоставляющиеВремени.Часы, "час", "часа", "часов"));
КонецЕсли;
Если СоставляющиеВремени.Минуты > 0 Тогда
МассивСтрок.Добавить(Строка(СоставляющиеВремени.Минуты) + " " + Склонять(СоставляющиеВремени.Минуты, "минута", "минуты", "минут"));
КонецЕсли;
Если СоставляющиеВремени.Секунды > 0 Тогда
МассивСтрок.Добавить(Строка(СоставляющиеВремени.Секунды) + " " + Склонять(СоставляющиеВремени.Секунды, "секунда", "секунды", "секунд"));
КонецЕсли;
// Объединяем массив в одну строку через пробел
Возврат СтрСоединить(МассивСтрок, " ");
КонецФункции
Пример использования:
Сообщить(ПредставлениеПериода(90061)); // Результат: "1 день 1 час 1 минута 1 секунда"
Сообщить(ПредставлениеПериода(7200)); // Результат: "2 часа"
Сообщить(ПредставлениеПериода(125)); // Результат: "2 минуты 5 секунд"
Мы рассмотрели два эффективных способа форматирования длительности в 1С. Выбор зависит от вашей задачи:
ЧЧ:ММ:СС без учета дней, используйте встроенную функцию Формат(Секунды, "ДЛФ=ЧЧ:мм:сс"). Это просто, быстро и надежно.