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