Работа с временными интервалами в 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 - Объект
Календарь— позволяет учитывать рабочие/выходные дни. Пример:Календарь = Календари.РабочийКалендарь;РабочиеЧасы = Календарь.РабочееВремяМеждуДатами(ДатаНачала, ДатаОкончания);
Если вам нужно сложить время по табелю с учётом графика, используйте регистр сведений ГрафикиРаботыСотрудников (в 1С:ЗУП). Пример запроса:
ВЫБРАТЬ
Сумма(Табель.КоличествоЧасов) КАК ОбщиеЧасы
ИЗ
Документ.ТабельУчетаРабочегоВремени КАК Табель
ГДЕ
Табель.Сотрудник = &Сотрудник
И Табель.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
Что будет, если не учитывать график работы?
При сложении времени без учёта графика вы можете получить искажённые данные. Например, если сотрудник работал в ночную смену (22:00–06:00), простое вычитание дат даст 8 часов, но по графику это может быть 7 рабочих часов + 1 час переработки. В отчётах по оплате труда это приведёт к ошибкам в начислениях.
3. Сложение времени в запросах 1С
Если вам нужно сложить время в запросе (например, для отчёта), используйте функции работы с датами. Основные приёмы:
| Задача | Функция в запросе | Пример |
|---|---|---|
| Сложить два интервала | ДОБАВИТЬКДАТЕ | ДОБАВИТЬКДАТЕ(ДатаНачала, МИНУТА, 30) |
| Разница между датами | РАЗНОСТЬДАТ | РАЗНОСТЬДАТ(ДатаОкончания, ДатаНачала, ЧАС) |
| Преобразовать в секунды | ВРЕМЯНАЧАЛАДНЯ + ВремяВСекундах | ВРЕМЯНАЧАЛАДНЯ + (Часы * 3600) |
Пример запроса для суммирования отработанного времени по сотрудникам:
ВЫБРАТЬ
Табель.Сотрудник КАК Сотрудник,
СУММА(РАЗНОСТЬДАТ(Табель.Окончание, Табель.Начало, МИНУТА)) / 60 КАК Часы
ИЗ
Документ.ТабельУчетаРабочегоВремени КАК Табель
ГДЕ
Табель.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
Табель.Сотрудник
Важно: в запросах функция РАЗНОСТЬДАТ возвращает разницу в полных интервалах (например, если разница 1 час 59 минут, то РАЗНОСТЬДАТ(..., ЧАС) вернёт 1, а не 1.98). Чтобы получить точные значения, используйте разницу в секундах и делите на 3600.
4. Типовые ошибки и как их избежать
Даже опытные разработчики иногда сталкиваются с неожиданными результатами при работе со временем в 1С. Вот наиболее распространённые ошибки:
- ⏰ Потеря дней при сложении типа
Час: как упоминалось ранее,20:00 + 05:00даст01:00, а не25:00. Решение: используйтеДатаВремяили преобразуйте в секунды. - 🌍 Часовые пояса: если в базе хранятся данные с разными часовыми поясами, разница между датами может быть некорректной. Всегда приводите время к одному поясу с помощью
ЧасовойПояс. - 🔢 Округление в отчётах: функции вроде
РАЗНОСТЬДАТв запросах округлит 1 час 59 минут до 1 часа. Для точности используйте секунды.
Пример кода для корректного сложения с учётом дней:
// Неправильно (теряем дни):
Результат = Время1 + Время2; // Тип Час
// Правильно (сохраняем полное значение):
Секунды1 = Время1.ВСекундах;
Секунды2 = Время2.ВСекундах;
Результат = Формат((Секунды1 + Секунды2) / 3600,"Ч=00:ММ:сс"); // Например,"25:30:00"
5. Программные решения для сложных случаев
Если стандартных механизмов 1С недостаточно (например, нужно учитывать перерывы, округления или специфические правила учёта времени), придётся писать собственные функции. Ниже — готовые решения для типовых задач.
1. Сложение времени с учётом перерывов
Допустим, у вас есть интервалы работы и перерывов, и нужно получить чистое рабочее время:
Функция СложитьВремяСПерерывами(МассивНачал, МассивОкончаний, МассивПерерывов) Экспорт
Итог = 0;
Для Индекс = 0 По МассивНачал.ВГраница - 1 Цикл
РабочееВремя = МассивОкончаний[Индекс] - МассивНачал[Индекс];
Если Индекс < МассивПерерывов.ВГраница Тогда
РабочееВремя = РабочееВремя - МассивПерерывов[Индекс];
КонецЕсли;
Итог = Итог + РабочееВремя.ВСекундах;
КонецЦикла;
Возврат Формат(Итог / 3600,"Ч=00:ММ:сс");
КонецФункции
2. Округление времени до заданного интервала
Часто в табелях время округляется до 15 минут. Вот функция для этого:
Функция ОкруглитьВремя(Время, ИнтервалМинут = 15) Экспорт
Секунды = Время.ВСекундах;
ИнтервалСекунд = ИнтервалМинут * 60;
Остаток = Секунды % ИнтервалСекунд;
Если Остаток >= ИнтервалСекунд / 2 Тогда
Секунды = Секунды + (ИнтервалСекунд - Остаток);
Иначе
Секунды = Секунды - Остаток;
КонецЕсли;
Возврат НачалоДня(ТекущаяДата) + Секунды;
КонецФункции
✅ Убедитесь, что входные параметры имеют тип ДатаВремя, а не строку
✅ Проверьте обработку ночных смен (переход через 00:00)
✅ Учтите часовые пояса, если данные приходят из разных источников
✅ Протестируйте на граничных значениях (например, 23:59 + 00:01)-->
6. Визуальные инструменты: сложение времени без программирования
Не все задачи требуют написания кода. В 1С есть встроенные инструменты для работы со временем без программирования:
- 📊 Отчёты и обработки: в 1С:ЗУП используйте отчёт
"Анализ учёта времени", где суммирование происходит автоматически с учётом графика. - 📋 Документы"Табель": при проведении документа время суммируется по правилам, заданным в настройках расчёта зарплаты.
- ⚙️ Конструктор запросов: позволяют построить запрос с суммированием времени без ручного кода (см. раздел 3).
Пример настройки отчёта для суммирования времени:
- Откройте отчёт
"Анализ учёта времени"(Зарплата → Отчёты по зарплате). - В настройках выберите группировку по
"Сотруднику"и"Виду времени". - Добавьте ресурс
"Количество часов"с функцией"Сумма". - Установите фильтр по периоду и сотрудникам.
Если вам нужно сложить время в ручном режиме (например, в документе "Табель"), используйте кнопку "Заполнить" → "По графику". Система автоматически рассчитает норму часов и фактическое время.
Для бухгалтеров и кадровиков самый надёжный способ — использовать стандартные отчёты 1С:ЗУП. Они уже учитывают все нюансы учёта рабочего времени, включая ночные смены и переработки.
7. Работа с временными зонами и летним временем
Если ваша компания работает в нескольких часовых поясах или учитывает переход на летнее/зимнее время, стандартные функции 1С могут давать сбои. Например, разница между '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"), стандартные функции 1С не смогут его корректно обработать. В этом случае сначала разбейте строку на часы/минуты/секунды и преобразуйте в числовой формат.
FAQ: Частые вопросы по сложению времени в 1С
Как сложить время, если результат превышает 24 часа?
Используйте один из двух способов:
- Преобразуйте время в секунды, сложите, затем обратно в формат
ЧЧ:ММ:СС:СуммаСекунд = (Время1.ВСекундах + Время2.ВСекундах);Результат = Формат(СуммаСекунд / 3600,"Ч=00:ММ:сс"); // Например,"25:30:00"
- Используйте тип
ДатаВремяи прибавляйте ко времени начала дня:Результат = НачалоДня(ТекущаяДата) + Время1 + Время2;
Почему при сложении двух значений типа Час получается неверный результат?
Тип Час в 1С не хранит информацию о дате, поэтому при превышении 23:59:59 часы"сбрасываются". Например, 20:00 + 05:00 = 01:00. Чтобы избежать этого, используйте:
- Тип
ДатаВремя(сохраняет дату). - Преобразование в секунды (как в предыдущем ответе).
Как в запросе получить сумму времени в формате ЧЧ:ММ:СС?
В запросах нет прямой возможности вывести время в таком формате, но можно:
- Получить сумму в секундах:
СУММА(РАЗНОСТЬДАТ(Окончание, Начало, СЕКУНДА)) КАК СуммаСекунд - В обработке результата запроса преобразовать секунды в строку:
Часы = Цел(СуммаСекунд / 3600);Остаток = СуммаСекунд % 3600;
Минуты = Цел(Остаток / 60);
Секунды = Остаток % 60;
Результат = Формат(Часы,"Ч=00") +":" + Формат(Минуты,"Ч=00") +":" + Формат(Секунды,"Ч=00");
Как учитывать перерывы при суммировании рабочего времени?
Если у вас есть интервалы работы и перерывов, используйте следующий алгоритм:
Функция ПолучитьЧистоеВремя(Начало, Окончание, ПерерывНачало, ПерерывОкончание)
ПолноеВремя = Окончание - Начало;
ВремяПерерыва = ПерерывОкончание - ПерерывНачало;
Возврат ПолноеВремя - ВремяПерерыва;
КонецФункции
Для нескольких интервалов используйте цикл, как в разделе 5.
Можно ли сложить время в отчёте"Табель учёта рабочего времени" без программирования?
Да, в стандартных конфигурациях (1С:ЗУП, 1С:ERP) суммирование происходит автоматически:
- Откройте отчёт
"Табель учёта рабочего времени". - В настройках добавьте ресурс
"Количество часов"с функцией"Сумма". - Установите нужные группировки (по сотрудникам, подразделениям и т.д.).
Система сама учтёт график работы, ночные часы и переработки.