Работа с временными интервалами в 1С:Предприятие — одна из самых распространённых задач, с которыми сталкиваются и бухгалтеры, и программисты. Казалось бы, что может быть проще, чем сложить два временных значения? Но на практике даже опытные пользователи сталкиваются с неожиданными ошибками: от округлений до потери дней при переходе через полночь. Эта статья поможет разобраться, как правильно складывать время в разных версиях платформы 1С 8.3, избегая типовых ловушек.

Мы рассмотрим как стандартные методы (через встроенный язык и конструктор запросов), так и программные решения для сложных случаев — например, когда нужно учитывать рабочие смены или табель учёта времени. Особый акцент сделан на практические примеры с кодом, который можно сразу использовать в своих конфигурациях. А для тех, кто предпочитает визуальные инструменты, есть раздел про сложение времени без программирования — через отчёты и обработки.

Важно: если вы работаете с 1С:Зарплата и Управление Персоналом или 1С:ERP, некоторые методы могут требовать адаптации под специфику учёта рабочего времени. Об этом — в отдельном разделе.

1. Базовые способы сложения времени в 1С

Начнём с самого простого: как сложить два значения типа Час или ДатаВремя без написания кода. В платформе 1С 8.3 для этого предусмотрены встроенные функции и операторы.

Самый очевидный способ — использовать оператор +. Он работает и для типа Час, и для ДатаВремя, но есть нюансы:

  • Тип Час: хранит время в формате ЧЧ:ММ:СС без привязки к дате. При сложении двух значений этого типа результат также будет типом Час, но если сумма превышает 23:59:59, лишние часы просто отбрасываются. Например, 20:00:00 + 05:00:00 = 01:00:00 (а не 25:00:00!).
  • 📅 Тип ДатаВремя: хранит и дату, и время. Здесь сложение работает корректно, учитывая переход через полночь. Например, '2026-01-01 20:00:00' +'05:00:00' ='2026-01-02 01:00:00'.

Пример кода для сложения:

// Сложение типа Час (теряем дни!)

Результат = ВремяНачала + ВремяОкончания; // Например, 10:00 + 15:30 = 01:30 (а не 25:30)

// Сложение типа ДатаВремя (корректно)

ДатаНачала ='2026-01-01 10:00:00';

Результат = ДатаНачала + (ВремяОкончания - ВремяНачала); // Учитывает дату

Если вам нужно просто получить сумму часов/минут без привязки к дате, но с сохранением полного значения (например, 25:30:00), используйте тип Число и преобразуйте время в секунды:

Секунды1 = Время1.ВСекундах;

Секунды2 = Время2.ВСекундах;

СуммаСекунд = Секунды1 + Секунды2;

Результат = Формат(СуммаСекунд / 3600,"Ч=00:ММ:сс"); // 25:30:00

💡

Если вам нужно сложить время в отчёте 1С:ЗУП (например, для табеля), используйте поле типа Число(15,3) и храните время в часах с точностью до 3 знаков после запятой. Это избавит от проблем с округлением.

2. Сложение времени с учётом рабочих дней и смен

В задачах учёта рабочего времени (например, в 1С:Зарплата и Управление Персоналом) простое сложение часов может дать некорректный результат. Например, если сотрудник отработал с 22:00 до 02:00, то разница в 4 часа на самом деле относится к двум разным календарным дням. Здесь нужно учитывать:

  • 📆 График работы: ночные смены могут"разрывать" сутки.
  • Перерывы: обеденное время не должно учитываться в общей сумме.
  • 🔄 Перенос часов: при суммировании за месяц важно не потерять часы, перенесённые с предыдущего дня.

Для таких случаев в есть специальные механизмы:

  1. Функция РазницаДат — возвращает разницу между двумя моментами времени с учётом дат. Пример:
    Разница = РазницаДат('2026-01-02 02:00:00','2026-01-01 22:00:00', Час); // Вернёт 4
  2. Объект Календарь — позволяет учитывать рабочие/выходные дни. Пример:
    Календарь = Календари.РабочийКалендарь;
    

    РабочиеЧасы = Календарь.РабочееВремяМеждуДатами(ДатаНачала, ДатаОкончания);

Если вам нужно сложить время по табелю с учётом графика, используйте регистр сведений ГрафикиРаботыСотрудников1С:ЗУП). Пример запроса:

ВЫБРАТЬ

Сумма(Табель.КоличествоЧасов) КАК ОбщиеЧасы

ИЗ

Документ.ТабельУчетаРабочегоВремени КАК Табель

ГДЕ

Табель.Сотрудник = &Сотрудник

И Табель.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

Что будет, если не учитывать график работы?

При сложении времени без учёта графика вы можете получить искажённые данные. Например, если сотрудник работал в ночную смену (22:00–06:00), простое вычитание дат даст 8 часов, но по графику это может быть 7 рабочих часов + 1 час переработки. В отчётах по оплате труда это приведёт к ошибкам в начислениях.

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

Если вам нужно сложить время в запросе (например, для отчёта), используйте функции работы с датами. Основные приёмы:

ЗадачаФункция в запросеПример
Сложить два интервалаДОБАВИТЬКДАТЕДОБАВИТЬКДАТЕ(ДатаНачала, МИНУТА, 30)
Разница между датамиРАЗНОСТЬДАТРАЗНОСТЬДАТ(ДатаОкончания, ДатаНачала, ЧАС)
Преобразовать в секундыВРЕМЯНАЧАЛАДНЯ + ВремяВСекундахВРЕМЯНАЧАЛАДНЯ + (Часы * 3600)

Пример запроса для суммирования отработанного времени по сотрудникам:

ВЫБРАТЬ

Табель.Сотрудник КАК Сотрудник,

СУММА(РАЗНОСТЬДАТ(Табель.Окончание, Табель.Начало, МИНУТА)) / 60 КАК Часы

ИЗ

Документ.ТабельУчетаРабочегоВремени КАК Табель

ГДЕ

Табель.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

СГРУППИРОВАТЬ ПО

Табель.Сотрудник

Важно: в запросах функция РАЗНОСТЬДАТ возвращает разницу в полных интервалах (например, если разница 1 час 59 минут, то РАЗНОСТЬДАТ(..., ЧАС) вернёт 1, а не 1.98). Чтобы получить точные значения, используйте разницу в секундах и делите на 3600.

4. Типовые ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с неожиданными результатами при работе со временем в . Вот наиболее распространённые ошибки:

  • Потеря дней при сложении типа Час: как упоминалось ранее, 20:00 + 05:00 даст 01:00, а не 25:00. Решение: используйте ДатаВремя или преобразуйте в секунды.
  • 🌍 Часовые пояса: если в базе хранятся данные с разными часовыми поясами, разница между датами может быть некорректной. Всегда приводите время к одному поясу с помощью ЧасовойПояс.
  • 🔢 Округление в отчётах: функции вроде РАЗНОСТЬДАТ в запросах округлит 1 час 59 минут до 1 часа. Для точности используйте секунды.

Пример кода для корректного сложения с учётом дней:

// Неправильно (теряем дни):

Результат = Время1 + Время2; // Тип Час

// Правильно (сохраняем полное значение):

Секунды1 = Время1.ВСекундах;

Секунды2 = Время2.ВСекундах;

Результат = Формат((Секунды1 + Секунды2) / 3600,"Ч=00:ММ:сс"); // Например,"25:30:00"

📊 Какой способ сложения времени вы используете чаще?
Встроенные функции 1С
Запросы с РАЗНОСТЬДАТ
Преобразование в секунды
Собственные обработки

5. Программные решения для сложных случаев

Если стандартных механизмов недостаточно (например, нужно учитывать перерывы, округления или специфические правила учёта времени), придётся писать собственные функции. Ниже — готовые решения для типовых задач.

1. Сложение времени с учётом перерывов

Допустим, у вас есть интервалы работы и перерывов, и нужно получить чистое рабочее время:

Функция СложитьВремяСПерерывами(МассивНачал, МассивОкончаний, МассивПерерывов) Экспорт

Итог = 0;

Для Индекс = 0 По МассивНачал.ВГраница - 1 Цикл

РабочееВремя = МассивОкончаний[Индекс] - МассивНачал[Индекс];

Если Индекс < МассивПерерывов.ВГраница Тогда

РабочееВремя = РабочееВремя - МассивПерерывов[Индекс];

КонецЕсли;

Итог = Итог + РабочееВремя.ВСекундах;

КонецЦикла;

Возврат Формат(Итог / 3600,"Ч=00:ММ:сс");

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

2. Округление времени до заданного интервала

Часто в табелях время округляется до 15 минут. Вот функция для этого:

Функция ОкруглитьВремя(Время, ИнтервалМинут = 15) Экспорт

Секунды = Время.ВСекундах;

ИнтервалСекунд = ИнтервалМинут * 60;

Остаток = Секунды % ИнтервалСекунд;

Если Остаток >= ИнтервалСекунд / 2 Тогда

Секунды = Секунды + (ИнтервалСекунд - Остаток);

Иначе

Секунды = Секунды - Остаток;

КонецЕсли;

Возврат НачалоДня(ТекущаяДата) + Секунды;

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

✅ Убедитесь, что входные параметры имеют тип ДатаВремя, а не строку

✅ Проверьте обработку ночных смен (переход через 00:00)

✅ Учтите часовые пояса, если данные приходят из разных источников

✅ Протестируйте на граничных значениях (например, 23:59 + 00:01)-->

6. Визуальные инструменты: сложение времени без программирования

Не все задачи требуют написания кода. В есть встроенные инструменты для работы со временем без программирования:

  • 📊 Отчёты и обработки: в 1С:ЗУП используйте отчёт "Анализ учёта времени", где суммирование происходит автоматически с учётом графика.
  • 📋 Документы"Табель": при проведении документа время суммируется по правилам, заданным в настройках расчёта зарплаты.
  • ⚙️ Конструктор запросов: позволяют построить запрос с суммированием времени без ручного кода (см. раздел 3).

Пример настройки отчёта для суммирования времени:

  1. Откройте отчёт "Анализ учёта времени" (Зарплата → Отчёты по зарплате).
  2. В настройках выберите группировку по "Сотруднику" и "Виду времени".
  3. Добавьте ресурс "Количество часов" с функцией "Сумма".
  4. Установите фильтр по периоду и сотрудникам.

Если вам нужно сложить время в ручном режиме (например, в документе "Табель"), используйте кнопку "Заполнить""По графику". Система автоматически рассчитает норму часов и фактическое время.

💡

Для бухгалтеров и кадровиков самый надёжный способ — использовать стандартные отчёты 1С:ЗУП. Они уже учитывают все нюансы учёта рабочего времени, включая ночные смены и переработки.

7. Работа с временными зонами и летним временем

Если ваша компания работает в нескольких часовых поясах или учитывает переход на летнее/зимнее время, стандартные функции могут давать сбои. Например, разница между '2026-03-31 01:00:00' и '2026-03-31 03:00:00' в Москве составит 1 час (из-за перехода на летнее время), а не 2.

Чтобы избежать ошибок:

  • 🕒 Всегда указывайте часовый пояс при работе с датами:
    ДатаСПоясом = ЧасовойПояс(ТекущаяДата,"Europe/Moscow");
  • 🔄 Используйте УниверсальноеВремя для сравнения моментов времени из разных поясов:
    Если УниверсальноеВремя(Дата1) > УниверсальноеВремя(Дата2) Тогда...
  • ⚠️ Проверяйте переходы на летнее/зимнее время в критичных расчётах (например, при начислении ночных часов).

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

Пояс = ЧасовойПояс(,"Europe/Moscow");

Дата1 = ЧасовойПояс('2026-03-31 01:00:00', Пояс);

Дата2 = ЧасовойПояс('2026-03-31 03:00:00', Пояс);

Разница = РазницаДат(Дата2, Дата1, Секунда) / 3600; // Вернёт 1 (а не 2!)

💡

В 1С:ERP и 1С:ЗУП часовые пояса сотрудников хранятся в справочнике "Физические лица". Всегда сверяйтесь с этим справочником при работе с временными данными.

8. Интеграция с внешними системами

Если вам нужно сложить время, полученное из внешних источников (например, из систем контроля доступа или Excel), учитывайте формат данных:

  • 📑 Импорт из Excel: время в Excel хранится как дробное число (1 = 24 часа). Для преобразования используйте:
    Время1С = НачалоДня(ТекущаяДата) + (ЧислоИзExcel * 86400); // 86400 секунд в дне
  • 🔌 Обмен с оборудованием: многие системы (например, турникеты) передают время в формате HH:MM:SS или UNIX-time. Для конвертации:
    // Из UNIX-time (секунды с 1970 года)
    

    Дата1С = Дата(1970, 1, 1) + UNIXВремя;

    // Из строки"HH:MM:SS"

    Время1С = Время(Час(Строка), Минута(Строка), Секунда(Строка));

Пример обработки данных из Excel:

// Предположим, что в табличном документе время в колонке"A" в формате Excel

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Отчёт.xlsx");

Для КаждаяСтрока Из ТабДок.Область("A2:A100").Выбрать Цикл

ЗначениеExcel = Значение(КаждаяСтрока.Текст); // Например, 0.541666667 (13:00)

Время1С = НачалоДня(ТекущаяДата) + (ЗначениеExcel * 86400);

Сообщить(Формат(Время1С,"Ч=HH:MM:ss"));

КонецЦикла;

💡

При интеграции всегда проверяйте, в каком формате передаётся время. Например, некоторые системы передают время в миллисекундах, а не в секундах (UNIX-time обычно в секундах, а JavaScript использует миллисекунды).

⚠️ Внимание: Если вы импортируете данные из внешних систем, где время хранится в формате строки (например,"25:30:00"), стандартные функции не смогут его корректно обработать. В этом случае сначала разбейте строку на часы/минуты/секунды и преобразуйте в числовой формат.

FAQ: Частые вопросы по сложению времени в 1С

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

Используйте один из двух способов:

  1. Преобразуйте время в секунды, сложите, затем обратно в формат ЧЧ:ММ:СС:
    СуммаСекунд = (Время1.ВСекундах + Время2.ВСекундах);
    

    Результат = Формат(СуммаСекунд / 3600,"Ч=00:ММ:сс"); // Например,"25:30:00"

  2. Используйте тип ДатаВремя и прибавляйте ко времени начала дня:
    Результат = НачалоДня(ТекущаяДата) + Время1 + Время2;
Почему при сложении двух значений типа Час получается неверный результат?

Тип Час в не хранит информацию о дате, поэтому при превышении 23:59:59 часы"сбрасываются". Например, 20:00 + 05:00 = 01:00. Чтобы избежать этого, используйте:

  • Тип ДатаВремя (сохраняет дату).
  • Преобразование в секунды (как в предыдущем ответе).
Как в запросе получить сумму времени в формате ЧЧ:ММ:СС?

В запросах нет прямой возможности вывести время в таком формате, но можно:

  1. Получить сумму в секундах:
    СУММА(РАЗНОСТЬДАТ(Окончание, Начало, СЕКУНДА)) КАК СуммаСекунд
  2. В обработке результата запроса преобразовать секунды в строку:
    Часы = Цел(СуммаСекунд / 3600);
    

    Остаток = СуммаСекунд % 3600;

    Минуты = Цел(Остаток / 60);

    Секунды = Остаток % 60;

    Результат = Формат(Часы,"Ч=00") +":" + Формат(Минуты,"Ч=00") +":" + Формат(Секунды,"Ч=00");

Как учитывать перерывы при суммировании рабочего времени?

Если у вас есть интервалы работы и перерывов, используйте следующий алгоритм:

Функция ПолучитьЧистоеВремя(Начало, Окончание, ПерерывНачало, ПерерывОкончание)

ПолноеВремя = Окончание - Начало;

ВремяПерерыва = ПерерывОкончание - ПерерывНачало;

Возврат ПолноеВремя - ВремяПерерыва;

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

Для нескольких интервалов используйте цикл, как в разделе 5.

Можно ли сложить время в отчёте"Табель учёта рабочего времени" без программирования?

Да, в стандартных конфигурациях (1С:ЗУП, 1С:ERP) суммирование происходит автоматически:

  1. Откройте отчёт "Табель учёта рабочего времени".
  2. В настройках добавьте ресурс "Количество часов" с функцией "Сумма".
  3. Установите нужные группировки (по сотрудникам, подразделениям и т.д.).

Система сама учтёт график работы, ночные часы и переработки.