Как преобразовать число минут в строку «часы и минуты» с правильным склонением в 1С?

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

В практике разработки на платформе 1С часто возникает задача визуализации длительности. Например, когда имеется числовое поле с количеством минут (скажем, 150), а пользователю необходимо вывести дружелюбный интерфейс с текстом «2 часа 30 минут». Основная сложность здесь заключается не столько в математике, сколько в правильном склонении существительных в зависимости от числительных. Мы разберем несколько эффективных способов решения этой задачи: от классических алгоритмов до использования встроенных функций платформы и механизмов БСП.

Способ 1: Классический математический расчет и логика склонения

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


КоличествоМинут = 150; // Исходное значение
Часы = Цел(КоличествоМинут / 60);
Минуты = КоличествоМинут % 60;

Теперь проанализируем задачу склонения. В русском языке существительные после числительных имеют три формы (например: 1 час, 2 часа, 5 часов). Правило выбора формы зависит от последней цифры числа, если только число не оканчивается на 11, 12, 13 или 14. Реализуем универсальную функцию для получения правильного окончания. Посмотрим на пример кода:


Функция ПолучитьФормуСклонения(Число, Форма1, Форма2, Форма5)
    Остаток100 = Число % 100;
    Остаток10 = Число % 10;
    
    Если Остаток100 >= 11 И Остаток100 <= 14 Тогда
        Возврат Форма5;
    ИначеЕсли Остаток10 = 1 Тогда
        Возврат Форма1;
    ИначеЕсли Остаток10 >= 2 И Остаток10 <= 4 Тогда
        Возврат Форма2;
    Иначе
        Возврат Форма5;
    КонецЕсли;
КонецФункции

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


ТекстЧасы = ПолучитьФормуСклонения(Часы, "час", "часа", "часов");
ТекстМинуты = ПолучитьФормуСклонения(Минуты, "минута", "минуты", "минут");

Результат = Строка(Часы) + " " + ТекстЧасы + " " + Строка(Минуты) + " " + ТекстМинуты;
// Результат: "2 часа 30 минут"

Способ 2: Использование системной функции ЧислоПрописью

Платформа 1С предоставляет мощный инструмент ЧислоПрописью(), который умеет склонять единицы измерения автоматически. Это один из самых элегантных способов, так как нам не нужно прописывать условия для исключений (типа «11 часов»). Выясним, как применить этот метод для нашей задачи.

Секрет заключается в параметре «ПараметрыПредметаИсчисления». Мы можем вызвать функцию так, чтобы она вернула нам только название единицы измерения в нужном падеже. Разберем по шагам реализацию через подмену строк:


Функция ВремяПрописью(КоличествоМинут)
    Часов = Цел(КоличествоМинут / 60);
    Минут = КоличествоМинут % 60;
    
    // Формат для часов: мужской род, формы для 1, 2, 5
    ПараметрыЧасов = "час, часа, часов, м,,,,,0";
    // Формат для минут: женский род, формы для 1, 2, 5
    ПараметрыМинут = "минута, минуты, минут, ж,,,,,0";
    
    СтрЧасы = ЧислоПрописью(Часов, "L=ru_RU", ПараметрыЧасов);
    СтрМинуты = ЧислоПрописью(Минут, "L=ru_RU", ПараметрыМинут);
    
    Возврат СтрЧасы + " " + СтрМинуты;
КонецФункции

Важный нюанс: Функция ЧислоПрописью по умолчанию выводит и само число словами (например, «Два часа тридцать минут»). Если нам нужны цифры, мы можем либо обрезать строку, либо использовать форматную строку БСП, о которой поговорим ниже.

Способ 3: Использование функций БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП, мы крайне рекомендуем использовать готовые механизмы. Это гарантирует отсутствие ошибок в склонениях и соответствие стандартам разработки 1С. Проанализируем наиболее подходящие функции:

  1. СтроковыеФункцииКлиентСервер.ПредставлениеВремени(Секунды) — эта функция принимает время в секундах и возвращает краткое представление, например «2 ч. 30 мин.».
  2. ОбщегоНазначенияКлиентСервер.ДлительностьВФорматеСлов(Минуты) (в некоторых версиях БСП) — позволяет получить полное текстовое описание.

Пример использования функции ПредставлениеВремени:


Секунды = 150 * 60;
ТекстВремени = СтроковыеФункцииКлиентСервер.ПредставлениеВремени(Секунды);
// На выходе получим стандартизированную строку

Способ 4: Реализация в языке запросов

Иногда требуется вывести длительность в правильном формате непосредственно в отчете, не прибегая к перебору результата в коде. В этом случае мы можем реализовать логику выбора окончаний прямо в запросе. Посмотрим на пример реализации логики склонения через оператор ВЫБОР:


ВЫБРАТЬ
    Данные.МинутыИсходные,
    ВЫРАЗИТЬ(Данные.МинутыИсходные / 60 - 0.5 КАК ЧИСЛО(10, 0)) КАК Часы,
    Данные.МинутыИсходные % 60 КАК Минуты,
    // Склонение для часов
    ВЫБОР 
        КОГДА (ВЫРАЗИТЬ(Данные.МинутыИсходные / 60 - 0.5 КАК ЧИСЛО(10, 0)) % 10 = 1) 
              И (ВЫРАЗИТЬ(Данные.МинутыИсходные / 60 - 0.5 КАК ЧИСЛО(10, 0)) % 100 <> 11) ТОГДА "час"
        КОГДА (ВЫРАЗИТЬ(Данные.МинутыИсходные / 60 - 0.5 КАК ЧИСЛО(10, 0)) % 10 В (2, 3, 4)) 
              И НЕ (ВЫРАЗИТЬ(Данные.МинутыИсходные / 60 - 0.5 КАК ЧИСЛО(10, 0)) % 100 В (12, 13, 14)) ТОГДА "часа"
        ИНАЧЕ "часов"
    КОНЕЦ КАК ЧасыСтрока
ИЗ
    РегистрНакопления.РабочееВремя КАК Данные

Хотя запрос выглядит громоздко из-за особенностей целочисленного деления в SQL (в 1С используется хитрость с ВЫРАЗИТЬ(... - 0.5)), этот метод позволяет максимально быстро формировать данные для больших отчетов.

Способ 5: Функция СтрокаСЧислом (современная платформа)

В последних версиях платформы 8.3 появилась замечательная функция СтрокаСЧислом. Она позволяет формировать сложные строки с автоматическим подбором слов из переданного шаблона. Рассмотрим, как это упрощает жизнь программисту:


// Шаблон содержит варианты для 1, 2, 5 и исключений
Шаблон = "нп=; %1 час;; %1 часа; %1 часов; %1 часа"; 
ТекстЧасы = СтрокаСЧислом(Шаблон, Часы, ВидЧисловогоЗначения.Количественное, "L=ru");

Этот метод является наиболее современным и предпочтительным, так как он поддерживает локализацию «из коробки» и избавляет от написания громоздких условий Если ... Тогда.

Подведем итоги

Для простых задач внутри формы оптимально использовать математический метод с функцией склонения или ЧислоПрописью. Если же вы работаете в современной конфигурации, всегда отдавайте предпочтение функциям БСП или СтрокаСЧислом — это сделает ваш код чище, надежнее и понятнее для других разработчиков. Для тяжелых отчетов лучше всего подготовить данные на уровне запроса или использовать вычисляемые поля в СКД.

← На главную