Работа с интервалами времени в 1С часто вызывает вопросы, особенно когда дело касается суммирования разности между датами и вывода этих данных в печатные формы или отчеты СКД. Рассмотрим, как избежать типичных ошибок при преобразовании типов данных и правильно настроить расчеты.
Основная ошибка многих разработчиков заключается в попытке вернуть результат разности дат в виде типа Дата (например, Дата(1, 1, 1, Часы, Минуты, 0)). Функция Дата() предназначена для создания конкретной точки на временной шкале, а не для хранения длительности. При попытке сложить или вычесть такие «даты», 1С выходит за пределы допустимых значений, что приводит к ошибкам преобразования типов.
Самый надежный способ — хранить и суммировать время в секундах (числовой формат). Это позволяет легко выполнять любые арифметические операции. Разберем, как получить разность в секундах:
Разность = ДатаКонец - ДатаНачала; // Результат в секундах
Часов = Цел(Разность / 3600);
Минут = Цел((Разность - Часов * 3600) / 60);
При таком подходе вы получаете чистые числа, которые можно суммировать между документами, не боясь ошибок типизации. Чтобы в дальнейшем отобразить это значение, вы можете использовать простую математику или форматирование.
Если вам нужно получить разность времени непосредственно при формировании отчета, лучше всего использовать встроенный язык запросов 1С. Метод РАЗНОСТЬДАТ позволяет сразу получить результат в нужных единицах измерения (секундах, минутах, часах).
ВЫБРАТЬ
РАЗНОСТЬДАТ(Документ.ДатаНачала, Документ.ДатаОкончания, СЕКУНДА) КАК РазностьВСекундах
ИЗ
Документ.НашДокумент КАК Документ
Получив результат в секундах, вы можете легко управлять им в СКД.
Частая проблема возникает при выводе итогов в таблицах СКД: если просто пытаться «склеить» часы и минуты в строку, итоги по группе не будут суммироваться корректно (120 минут превратятся в 1 час 20 минут вместо 2 часов). Чтобы итоги считались правильно, используйте формулу для вычисляемых полей:
Формула для вывода времени (ЧЧ:мм):
Строка(Сумма(ЗатраченоВремениВЧасах) + (Сумма(ЗатраченоВремениВМинутах) -
Сумма(ЗатраченоВремениВМинутах) % 60) / 60) + ":" +
Строка(Сумма(ЗатраченоВремениВМинутах) % 60)
Разберем, что происходит в этой формуле:
Сумма(ЗатраченоВремениВМинутах) % 60 — вычисляет остаток минут после деления на 60 (то есть реальные минуты в часе).(Сумма - остаток) / 60 — переводит все накопленные минуты в целые часы.Чтобы избежать путаницы в будущем, придерживайтесь следующих правил:
СКД без предварительного преобразования.ЧЧ:мм без сложных формул, можно использовать функцию ДобавитьКДате(Дата(1, 1, 1), Секунда, Сумма(Секунды)), а в настройках поля СКД указать формат ДФ=ЧЧ:мм. Это позволит 1С автоматически обрабатывать переходы через час при суммировании итогов.Применяя данные методы, вы сможете настроить корректный учет отработанного времени, который будет учитывать все переработки и правильно отображать итоговые значения по сотрудникам или периодам.