Как рассчитать продолжительность и разницу между датами в 1С 8.3?

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

При разработке документов и справочников в платформе 1С часто возникает задача расчета длительности процесса (например, времени проведения проверки, длительности смены или выполнения задачи). Разберем, как правильно получить разницу между датой начала и датой окончания в часах и минутах, а также проанализируем подводные камни различных подходов.

Базовый принцип работы с датами в 1С

В платформе 1С вычитание одной даты из другой (Дата2 - Дата1) возвращает разницу в секундах. Это фундаментальное правило позволяет легко переводить интервал в любые другие единицы времени посредством стандартных математических операций.

Способ 1. Математический расчет часов и минут

Рассмотри наиболее надежный и универсальный способ расчета интервала. Чтобы перевести секунды в часы и минуты, достаточно применить функции целочисленного деления Цел() и остатка.

Разберем по шагам реализацию данного алгоритма:

  1. Вычисляем общую разницу между датами в секундах.
  2. Получаем количество полных часов, деля секунды на 3600 (60 секунд * 60 минут).
  3. Определяем остаток секунд и делим его на 60, чтобы получить количество минут.
  4. Формируем итоговую текстовую строку. Чтобы избежать некорректных окончаний (например, "1 часов 21 минут"), логично использовать нейтральные сокращения "ч." и "мин.".

Рассмотрим пример кода:


// Проверяем заполнение реквизитов перед расчетом
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) И ДатаОкончания >= ДатаНачала Тогда

    ИнтервалВСекундах = ДатаОкончания - ДатаНачала;
    
    // Вычисляем количество полных часов
    ИнтервалВЧасах = Цел(ИнтервалВСекундах / 3600);
    
    // Вычисляем оставшиеся минуты
    ОстатокСекунд = ИнтервалВСекундах - (ИнтервалВЧасах * 3600);
    ИнтервалВМинутах = Цел(ОстатокСекунд / 60);
    
    // Формируем представление
    СтрокаИнтервала = Строка(ИнтервалВЧасах) + " ч. " + Строка(ИнтервалВМинутах) + " мин.";

КонецЕсли;

Способ 2. Использование пустой даты (с ограничениями)

Существует альтернативный способ получения времени через прибавление секунд к пустой дате '00010101'. В этом случае платформа сформирует объект типа Дата, из которого с помощью стандартных функций Час() и Минута() можно извлечь составляющие интервала.

Посмотрим на пример кода:


РазницаВСекундах = ДатаОкончания - ДатаНачала;
ВременнаяДата = '00010101000000' + РазницаВСекундах;

Часов = Час(ВременнаяДата);
Минут = Минута(ВременнаяДата);

Критически важное ограничение данного способа: этот метод корректно работает только тогда, когда интервал проверки не превышает 24 часа (86 400 секунд). Если время проверки составит, например, 25 часов, то ВременнаяДата перейдет на следующие сутки (0001-01-02 01:00:00). Функция Час() вернет значение 1 вместо 25. Поэтому для длительных интервалов следует использовать математический способ (Способ 1).

Обязательные проверки и валидация данных

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

  1. Проверка заполнения: использовать функцию ЗначениеЗаполнено() для обеих дат. Если одна из дат не заполнена, вычитание приведет к некорректным миллионным значениям.
  2. Проверка хронологии: убедиться, что ДатаОкончания >= ДатаНачала. Если дата окончания меньше даты начала, результат вычитания станет отрицательным.

Расчет интервала времени в запросах 1С

В языке запросов 1С прямая арифметическая операция вычитания дат не поддерживается. Для этих целей применяется встроенная функция РАЗНОСТЬДАТ().

Проанализируем пример получения разницы в секундах через запрос:


ВЫБРАТЬ
    ДокументПроверка.Ссылка КАК Ссылка,
    РАЗНОСТЬДАТ(ДокументПроверка.ДатаНачала, ДокументПроверка.ДатаОкончания, СЕКУНДА) КАК ИнтервалВСекундах
ИЗ
    Документ.Проверка КАК ДокументПроверка

Дальнейшую раскладку полученных секунд на часы и минуты можно выполнить математически прямо в поле выражения СКД или при обработке результатов запроса в коде.

Дополнительные возможности: Учет рабочего времени и БСП

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

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

← На главную