Как в СКД настроить разделитель между часами и минутами в вычисляемом поле?

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести длительность какого-либо процесса в привычном для пользователя формате ЧЧ:ММ. Однако при попытке написать простую формулу сложения строк, программисты часто сталкиваются с ошибками синтаксиса или некорректным расчетом итогов по группировкам. Разберем детально, как правильно реализовать этот функционал, сохранив работоспособность агрегатных функций и обеспечив красивое визуальное представление данных.

Анализ проблемы: почему стандартное сложение строк не работает?

Рассмотрим типичную ошибку начинающего разработчика. Попытка написать в вычисляемом поле выражение вида Строка(Часы) + ":" + Строка(Минуты) часто приводит к ошибке "Неверные параметры +". Это происходит по нескольким причинам:

  1. Типизация в СКД: В отличие от обычного кода 1С, выражения в СКД имеют свои особенности обработки типов данных. Платформа не всегда может неявно преобразовать результат математического выражения в строку внутри одной формулы.
  2. Проблема итогов: Если вычисляемое поле возвращает строку, вы не сможете рассчитать по нему итоги (сумму часов за день или месяц). СКД просто не поймет, как складывать текстовые значения "10:30" и "05:15".
  3. Выражение представления: Многие забывают о существовании отдельной колонки "Выражение представления", которая предназначена именно для визуализации, в то время как основное "Выражение" должно содержать данные для расчетов.

Проанализируем ситуацию и рассмотрим пошагово несколько надежных способов решения задачи.

Способ 1: Использование формата даты (для интервалов внутри одних суток)

Если мы точно знаем, что разница между временем начала и окончания работы не превышает 24 часов, мы можем воспользоваться встроенными функциями работы с датами. Рассмотрим этот метод.

В вычисляемом поле пропишем следующее выражение:


ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), "СЕКУНДА", РАЗНОСТЬДАТ(ВремяНачалаРаботы, ВремяОкончанияРаботы, "СЕКУНДА"))

Здесь мы создаем пустую дату 0001-01-01 и прибавляем к ней разницу в секундах. В результате получаем объект типа Дата, у которого время соответствует нашей длительности. Чтобы пользователь увидел только время, в колонке "Оформление" зададим параметр "Формат":

ДФ='HH:mm'

Важное ограничение: Этот метод "сбросит" часы, если длительность превысит 24 часа. Например, вместо 26 часов вы увидите 02:00, так как дата просто перейдет на следующие сутки.

Способ 2: Математическая подмена разделителя (через числовой формат)

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


РАЗНОСТЬДАТ(ВремяНачалаРаботы, ВремяОкончанияРаботы, "ЧАС") 
+ (РАЗНОСТЬДАТ(ВремяНачалаРаботы, ВремяОкончанияРаботы, "МИНУТА") % 60) / 100

В результате вычислений для интервала 1 час 30 минут мы получим число 1,30. Чтобы превратить запятую в двоеточие, перейдем в настройки оформления поля и установим формат:

ЧДЦ=2; ЧРД=:; ЧГ=0

Способ 3: Разделение логики расчета и представления (Рекомендуемый)

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

Шаг 1. Настройка вычисляемого поля

Создаем вычисляемое поле (например, ДлительностьСекунды). В колонке "Выражение" пишем простую разность в секундах:

РАЗНОСТЬДАТ(ВремяНачалаРаботы, ВремяОкончанияРаботы, "СЕКУНДА")

Шаг 2. Настройка ресурсов

Переходим на закладку "Ресурсы". Добавляем наше поле. В колонке "Выражение" оставляем СУММА(ДлительностьСекунды). А теперь самое важное — заполняем колонку "Выражение представления". Пропишем там формулу преобразования накопленных секунд в строку вида ЧЧ:ММ:


Строка(ЦелоеЧисло(Сумма(ДлительностьСекунды) / 3600)) 
+ ":" 
+ Формат((Сумма(ДлительностьСекунды) % 3600) / 60, "ЧЦ=2; ЧВН=; ЧГ=0")

Разберем, что делает эта формула:

  1. Сумма(ДлительностьСекунды) / 3600 — получаем общее количество целых часов.
  2. % 3600 — получаем остаток секунд после выделения целых часов.
  3. / 60 — переводим остаток в минуты.
  4. Формат(..., "ЧЦ=2; ЧВН=") — магический параметр ЧВН= (Число Ведущих Нулей) гарантирует, что если минут меньше 10, перед ними добавится ноль (например, "10:05" вместо "10:5").

Обработка сложных ситуаций: отрицательные значения и "ведущие нули"

Проанализируем ситуацию, когда ВремяОкончания может быть меньше ВремяНачала (например, ночные смены). Функция РАЗНОСТЬДАТ вернет отрицательное число, что может привести к появлению знака "минус" между часами и минутами (например, -2:-15), что выглядит некорректно.

Для решения этой проблемы в "Выражении представления" следует использовать конструкцию ВЫБОР. Рассмотрим улучшенный пример кода:


ВЫБОР 
    КОГДА Сумма(ДлительностьСекунды) < 0 
    ТОГДА "-" 
    ИНАЧЕ "" 
КОНЕЦ 
+ Строка(ЦелоеЧисло(Abs(Сумма(ДлительностьСекунды)) / 3600)) 
+ ":" 
+ Формат((Abs(Сумма(ДлительностьСекунды)) % 3600) / 60, "ЧЦ=2; ЧВН=; ЧГ=0")

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

Практические советы при работе с СКД

Подводя итог, приведем несколько рекомендаций, которые помогут вам избежать типичных ошибок при работе с разделителями времени:

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

← На главную