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