К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как сложить время в 1С: практические способы и примеры кода

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

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

Ключевой момент: значение типа Дата встроенным оператором «+» с другой датой не складывается. Попытка написать Дата1 + Дата2 приведёт к ошибке исполнения. Зато к дате можно прибавить число — и оно будет трактоваться как количество секунд. Именно на этом основаны все приёмы сложения времени во встроенном языке.

Если же длительность хранится в виде строки «02:30» или в виде числа часов с дробной частью (2,5 часа), сначала её нужно привести к секундам, а уже потом суммировать. Ниже разобраны все сценарии с готовым кодом.

Как 1С хранит дату и время

Тип Дата в 1С — это момент времени, включающий дату и время с точностью до одной секунды. Минимальное значение — 01.01.0001 00:00:00, именно оно считается «пустой датой». Отдельного типа «только время» или «только интервал» в платформе нет, поэтому длительность приходится хранить либо в числе (секунды, минуты, часы), либо в дате с условной датой-основанием.

Получить текущий момент можно функцией ТекущаяДата() (на клиенте — с точностью клиентского компьютера) или ТекущаяДатаСеанса() (время сервера, предпочтительнее в серверном коде). Извлечь компоненты помогают функции Час(), Минута(), Секунда(), День() и другие.

Прибавление времени к дате через секунды

Самый простой и надёжный способ — прибавить к дате число секунд. Час — это 3600 секунд, минута — 60. Платформа сама корректно обработает переход через сутки, месяц и год.

ДатаНачала = ТекущаяДатаСеанса();

ДатаОкончания = ДатаНачала + 2 3600 + 30 60; // +2 часа 30 минут

Сообщить(ДатаОкончания);

Если нужно вычесть время — прибавляется отрицательное число: Дата - 86400 вернёт тот же момент сутки назад. Разность двух дат также даёт число секунд, что удобно для измерения длительности операций:

Начало = ТекущаяДатаСеанса();

// ... выполнение операции ...

ДлительностьСек = ТекущаяДатаСеанса() - Начало;

Функция ДобавитьКДате для часов, дней и месяцев

Когда интервал задан не в секундах, а в часах, днях или месяцах, удобнее функция ДобавитьКДате(Дата, ТипИнтервала, Количество). Она корректно работает с календарными особенностями — например, добавление месяца к 31 января даст последний день февраля, а не несуществующую дату.

ДатаОплаты = ДобавитьКДате(ДатаДокумента, "ДЕНЬ", 10);

СледующийЧас = ДобавитьКДате(ТекущаяДатаСеанса(), "ЧАС", 1);

ЧерезКвартал = ДобавитьКДате(ДатаНачала, "КВАРТАЛ", 1);

Допустимые типы интервала: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД. Для вычитания передаётся отрицательное количество.

Сравнение вариантов

Дата + число секунд

Подходит для точных интервалов в секундах и минутах; требует ручного пересчёта часов в секунды

ДобавитьКДате()

Подходит для календарных интервалов (дни, месяцы, годы); корректно обрабатывает концы месяцев

Запрос с РАЗНОСТЬДАТ и ДОБАВИТЬКДАТЕ

Подходит для массовых вычислений в выборках без обхода результата в коде

Сложение длительностей в формате ЧЧ:ММ

Типичная задача учёта рабочего времени: пользователь вводит часы и минуты в поля «08:30», «01:45», а нужно получить сумму. Здесь дата не нужна вовсе — достаточно разобрать строки, перевести в секунды (или минуты), сложить и отформатировать результат.

Функция ВремяВСекунды(СтрокаВремени)

Части = СтрРазделить(СтрокаВремени, ":");

Возврат Число(Части[0]) 3600 + Число(Части[1]) 60;

КонецФункции

ИтогоСек = ВремяВСекунды("08:30") + ВремяВСекунды("01:45"); // 36900

Часов = Цел(ИтогоСек / 3600);

Минут = (ИтогоСек - Часов * 3600) / 60;

Результат = Строка(Часов) + ":" + Формат(Минут, "ЧЦ=2; ЧВН=; ЧГ=0");

Обратите внимание: сумма длительностей может превышать 24 часа (например, табель за месяц), и это нормально — не приводите её к типу Дата, иначе получите «лишние сутки» в виде даты. Держите итог в числе секунд до самого конца и форматируйте только при выводе.

Порядок суммирования ЧЧ:ММ
  1. 1
    Разбейте каждую строку по двоеточию на часы и минуты
  2. 2
    Переведите каждое значение в секунды: часы × 3600 + минуты × 60
  3. 3
    Сложите все значения как числа
  4. 4
    Разделите итог: целая часть от деления на 3600 — часы, остаток — минуты
  5. 5
    Отформатируйте результат с ведущим нулём у минут

Сложение времени в запросах

В языке запросов арифметика дат выполняется функциями ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ. Это удобно, когда нужно суммировать длительность по множеству строк — например, по табличной части документов.

ВЫБРАТЬ

СУММА(РАЗНОСТЬДАТ(Таб.ВремяНачала, Таб.ВремяОкончания, СЕКУНДА)) КАК ИтогоСекунд

ИЗ

Документ.НарядНаРаботы.Работы КАК Таб

Результат снова получается в секундах — дальше его можно вывести в отчёт, разделив на 3600 для получения часов с дробной частью. Если длительность хранится в реквизите как число часов, суммируйте его обычной агрегатной функцией СУММА без всяких преобразований.

Хранение длительности в реквизитах: какой тип выбрать

Для полей вроде «Отработано часов» чаще всего выбирают Число с дробной частью (например, 10 разрядов, 2 знака) — тогда 1,5 означает полтора часа. Это самый простой вариант для суммирования, отчётов и СКД. Минус — пользователю нужно вводить 0,5 вместо привычных «0:30».

Альтернатива — реквизит типа Дата с составом «Время». Он удобен для ввода момента времени (начало смены), но плохо подходит для длительности: платформа всё равно хранит его относительно даты 01.01.0001, а сумма двух «времён» снова потребует пересчёта через секунды. Для длительностей свыше суток такой реквизит не подходит вовсе.

Маршрут решения

Как выбрать подход

Нужно прибавить интервал к конкретной датеИспользуйте ДобавитьКДате() или прибавление секунд
Нужно суммировать длительности ЧЧ:ММ из пользовательского вводаПереводите строки в секунды, суммируйте числа, форматируйте при выводе
Длительность нужна в отчётах и СКДХраните её числом (часы или секунды) — агрегаты работают без преобразований
Нужна массовая обработка по таблицеСчитайте РАЗНОСТЬДАТ и СУММА прямо в запросе

Типичные ошибки и как их проверить

Самая распространённая ошибка — попытка сложить две даты оператором «+». Вторая по частоте — форматирование суммы длительностей через Формат(Дата, "ДЛФ=T"): как только сумма превысит 24 часа, результат «перескочит» на следующие сутки и покажет неверное время. Третья — потеря точности при делении: используйте Цел() для часов и остаток для минут, а не округление.

После реализации проверьте граничные случаи: сумма ровно 24:00, сумма больше суток, пустое значение (пустая дата 01.01.0001 даст огромную разность), ввод «9:5» без ведущих нулей. Функция СтрРазделить корректно разберёт и такой ввод, но Число() упадёт на пустой строке — добавьте проверку количества частей.

Типичные ошибки
01
Сложение двух значений типа Дата оператором «+» — ошибка исполнения, складывать можно только дату и число секунд
02
Форматирование суммы длительностей как времени суток — при превышении 24 часов результат становится неверным
03
Хранение длительности в реквизите типа Дата — затрудняет суммирование в запросах и отчётах
04
Игнорирование пустой даты 01.01.0001 — разность с ней даёт огромные значения и искажает итоги
Контрольные точки

Как проверить результат

Сумма 08:30 + 01:45
Норма

10:15 (36900 секунд)

Тревожный признак

09:75 или дата со сдвигом на день

Прибавление часа к 23:30
Норма

00:30 следующего дня

Тревожный признак

Ошибка или 24:30

Сумма длительностей за месяц
Норма

Число часов больше 24, например 152:30

Тревожный признак

Значение «обнулено» до времени суток

Итог

Что важно запомнить

В 1С время складывается через секунды: к дате прибавляют число или используют ДобавитьКДате, длительности ЧЧ:ММ переводят в секунды и суммируют как числа, а для отчётов длительность лучше хранить числом.

Частые вопросы

Можно ли в 1С сложить две даты оператором «+»?

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

Как прибавить к дате 15 минут?

Либо Дата + 15 * 60, либо ДобавитьКДате(Дата, "МИНУТА", 15). Оба способа корректно обработают переход через границу часа и суток.

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

Вычтите одну дату из другой — получите секунды — и разделите на 3600. В запросе используйте РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС), но учтите, что она возвращает целое число полных часов.

Как сложить время больше 24 часов, например табель за месяц?

Не используйте тип Дата для итога. Суммируйте длительности как число секунд или часов, а при выводе форматируйте вручную: часы = Цел(Секунды / 3600), минуты = остаток. Так сумма 152:30 отобразится корректно.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

ТекущаяДата() на клиенте возвращает время компьютера пользователя, которое может отличаться от серверного. ТекущаяДатаСеанса() всегда даёт время сервера с учётом часового пояса сеанса — для расчётов длительности и сложения времени в серверной логике используйте её.

Как вывести длительность в виде «2 ч 30 мин»?

Разделите суммарные секунды на часы и минуты через Цел() и остаток, затем соберите строку: Строка(Часы) + " ч " + Минуты + " мин". Для формата с ведущими нулями используйте Формат с параметром ЧЦ=2 и ЧВН.