Работа с датами и временем в 1С:Предприятие 8.3 — одна из самых востребованных задач как для бухгалтеров, так и для программистов. Некорректное сложение временных интервалов может привести к ошибкам в отчетах, нарушению графиков документов или сбоям в бизнес-процессах. В этой статье разберем все возможные способы прибавления времени — от простых арифметических операций до сложных алгоритмов с учетом рабочих дней, праздников и часовых поясов.
Особенность 1С заключается в том, что здесь время хранится не как отдельный тип данных, а как часть типа Дата. Это означает, что прибавление часов, минут или секунд требует специфических подходов. Мы рассмотрим не только стандартные функции встроенного языка, но и нюансы работы с неполными датами, периодами и регламентными задачами, где точность временных расчетов критически важна.
1. Базовые операции: прибавление дней, часов, минут
Самый простой способ изменить дату или время в 1С — использовать оператор + с числовыми значениями. Plattform автоматически преобразует числа в дни, если операнд слева имеет тип Дата.
Примеры базовых операций:
- 📅 Прибавить 5 дней:
ТекущаяДата + 5 - ⏰ Прибавить 3 часа:
ТекущаяДата + (3/24)(так как 1 день = 24 часа) - ⏱️ Прибавить 30 минут:
ТекущаяДата + (30/(24*60)) - ⚡ Прибавить 15 секунд:
ТекущаяДата + (15/(24*60*60))
Важно понимать, что такие операции не учитывают рабочие/выходные дни и могут давать некорректные результаты для бизнес-логики. Например, прибавление 1 дня к пятнице вернет субботу, что не всегда приемлемо для расчета сроков выполнения заказов.
Для удобства создайте в глобальном модуле функции-помощники вроде ДобавьЧасы(Дата, Часы) или ДобавьМинуты(Дата, Минуты), чтобы не считать дроби каждый раз.
2. Функции встроенного языка: НачалоДня(), КонецДня(), ДобавьМесяц()
1С:Предприятие предоставляет специализированные функции для работы с датами, которые упрощают манипуляции со временем:
| Функция | Описание | Пример использования |
|---|---|---|
НачалоДня(Дата) |
Возвращает дату с временем 00:00:00 | НачалоДня(ТекущаяДата()) → 2026-05-15 00:00:00 |
КонецДня(Дата) |
Возвращает дату с временем 23:59:59 | КонецДня(ТекущаяДата()) → 2026-05-15 23:59:59 |
ДобавьМесяц(Дата, Количество) |
Прибавляет указанное количество месяцев | ДобавьМесяц(ТекущаяДата(), 3) → +3 месяца |
ДеньНедели(Дата) |
Возвращает номер дня недели (1=понедельник) | ДеньНедели(ТекущаяДата()) = 3 → среда |
Для прибавления времени эти функции часто комбинируют с арифметическими операциями. Например, чтобы получить конец следующего рабочего дня, можно использовать:
Функция КонецСледующегоРабочегоДня(Дата)
Результат = КонецДня(Дата);
Если ДеньНедели(Результат) = 5 Тогда // если пятница
Результат = КонецДня(Результат + 3); // пропускаем выходные
ИначеЕсли ДеньНедели(Результат) = 6 Тогда // если суббота
Результат = КонецДня(Результат + 2);
Иначе
Результат = КонецДня(Результат + 1);
КонецЕсли;
Возврат Результат;
КонецФункции
⚠️ Внимание: Функция ДобавьМесяц() корректно обрабатывает переходы между месяцами разной длины (например, 31 января + 1 месяц = 28/29 февраля), но может давать неожиданные результаты при добавлении больших интервалов (например, +12 месяцев к 31 января).
3. Работа с временными интервалами: секунды, миллисекунды
Для высокоточных расчетов (например, в регламентных заданиях или логировании событий) часто требуется оперировать секундами или миллисекундами. В 1С для этого используют:
- 🕒
ТекущаяУниверсальнаяДатаВМиллисекундах()— возвращает количество миллисекунд с 1970-01-01 (UNIX-время) - ⏳
Миллисекунд()— преобразует дату в миллисекунды - ⏲️
ДобавитьСекунды()— прибавляет секунды к дате
Пример расчета времени выполнения операции:
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... выполнение кода ...
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
ДлительностьМс = Конец - Начало;
Сообщить("Операция выполнена за " + ДлительностьМс + " мс");
Критическая особенность: при работе с миллисекундами учитывайте, что 1С округляет временные значения до секунды при отображении в интерфейсе, но в коде оперирует полной точностью. Это важно для интеграций с внешними системами, где требуется синхронизация по времени с точностью до миллисекунд.
4. Прибавление времени с учетом рабочего календаря
В бизнес-задачах часто требуется прибавлять время исключая выходные и праздники. Например, расчет сроков доставки или выполнения заказов. Для этого в 1С используют:
- Производственный календарь — стандартный механизм платформы, который хранит информацию о рабочих/выходных днях.
- Самостоятельные функции — если требуется учет специфических праздников (например, корпоративных выходных).
Пример кода с использованием производственного календаря:
Функция ДобавьРабочиеДни(Дата, КоличествоДней)
Календарь = Календари.ПроизводственныйКалендарь();
Результат = Дата;
ОсталосьДобавь = КоличествоДней;
Пока ОсталосьДобавь > 0 Цикл
Результат = Результат + 1;
Если Календарь.РабочийДень(Результат) Тогда
ОсталосьДобавь = ОсталосьДобавь - 1;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
⚠️ Внимание: Производственный календарь в 1С может не учитывать региональные праздники (например, День города). Для точных расчетов дополнительно проверяйте такие дни через справочник ПраздничныеДни или внешние сервисы.
Проверьте заполненность производственного календаря|Учтите региональные праздники|Протестируйте функцию на граничных датах (31 декабря, 1 января)|Обработайте исключения для предпраздничных дней (сокращенный рабочий день)-->
5. Сложные сценарии: часовые пояса и летнее время
При работе с распределенными системами или международными компаниями возникает необходимость учитывать часовые пояса и переходы на летнее/зимнее время. В 1С:Предприятие 8.3 для этого предназначены:
- 🌍
ЧасовойПояс()— возвращает текущий часовой пояс сеанса - ⏰
ВремяСУчетомЧасовыхПоясов()— преобразует время между поясами - 🔄
ИспользоватьЛетнееВремя()— проверяет действующее время (устарело в новых версиях)
Пример преобразования времени между часовыми поясами:
// Преобразовать московское время в екб время (UTC+5)
МoskvaTime = ТекущаяДата();
EkaterinburgTime = ВремяСУчетомЧасовыхПоясов(
MoskvaTime,
ЧасовойПояс("UTC+3"), // Москва
ЧасовойПояс("UTC+5") // Екатеринбург
);
Важно: начиная с версии 8.3.18, платформа автоматически учитывает переходы на летнее/зимнее время согласно базе данных часовых поясов IANA. Однако для старых версий может потребоваться ручная корректировка через механизм РегламентныеЗадания.
Как проверить поддерживаемые часовые пояса в вашей версии 1С?
Откройте справочник ЧасовыеПояса в конфигураторе или выполните запрос:
Выборка = ЧасовыеПояса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " (" + Выборка.Смещение + ")");
КонецЦикла;
Список поддерживаемых поясов зависит от версии платформы и операционной системы сервера.
6. Практическое применение: примеры для бухгалтеров и программистов
Рассмотрим реальные кейсы, где прибавление времени критично для бизнес-процессов:
Для бухгалтеров:
- 📊 Сроки уплаты налогов: автоматически рассчитывать дату платежа с учетом выходных и переносов.
- 💼 Графики авансов/зарплат: прибавлять фиксированные интервалы (например, "выплатить аванс за 5 рабочих дней до конца месяца").
Для программистов:
- 🤖 Регламентные задания: запускать обработки в строго определенное время с учетом задержек.
- 🔄 Интеграции: синхронизировать данные с внешними системами, учитывая временные зоны.
Пример расчета срока уплаты налога (с учетом переноса на следующий рабочий день):
Функция СрокУплатыНалога(ДатаНачисления, СрокВДнях)
Срок = ДатаНачисления + СрокВДнях;
Календарь = Календари.ПроизводственныйКалендарь();
Пока НЕ Календарь.РабочийДень(Срок) Цикл
Срок = Срок + 1;
КонецЦикла;
Возврат КонецДня(Срок); // срок истекает в 23:59:59
КонецФункции
Всегда проверяйте результаты временных расчетов на граничных датах: конец месяца, конец года, переходы между часовыми поясами. Ошибка в один день может привести к штрафам или сбоям в бизнес-процессах.
Частые ошибки и как их избежать
При работе со временем в 1С программисты и пользователи часто сталкиваются с типичными ошибками:
- Игнорирование типа данных: попытка прибавить число к строковому представлению даты (
"2026-05-15" + 1→ ошибка). - Неучет часовых поясов: сравнение времени из разных источников без приведения к единому поясу.
- Округление временных значений: потеря точности при преобразовании в секунды/миллисекунды.
- Забытые выходные: прибавление календарных дней вместо рабочих.
Чтобы избежать ошибок:
- 🔍 Всегда используйте тип
Датадля временных переменных. - 📅 Для бизнес-логики применяйте
ПроизводственныйКалендарь. - ⏱️ При работе с миллисекундами используйте
ТекущаяУниверсальнаяДатаВМиллисекундах().
⚠️ Внимание: В версиях 1С:Предприятие ниже 8.3.10 функция ДобавитьСекунды() может давать неточные результаты при добавлении больших интервалов (более 86400 секунд = 1 день). В таких случаях разбивайте интервал на дни и остаток секунд.
FAQ: Ответы на частые вопросы
Как прибавить 2 часа 30 минут к текущему времени?
Используйте дробное сложение: ТекущаяДата() + (2 + 30/60)/24. Здесь:
- 2 часа = 2/24 дня
- 30 минут = 30/(24*60) дня
Или создайте функцию-помощник:
Функция ДобавьВремя(Дата, Часы, Минуты=0)
Возврат Дата + (Часы + Минуты/60)/24;
КонецФункции
Почему при прибавлении 1 месяца к 31 января получаю 28 февраля?
Это стандартное поведение функции ДобавьМесяц(). Платформа 1С следит за корректностью дат: если в целевом месяце нет такого дня (например, 31 февраля), возвращается последний день месяца. Чтобы сохранить день, используйте:
Функция ДобавьМесяцСохраняяДень(Дата, Месяцев)
День = День(Дата);
Результат = НачалоМесяца(Дата) + Месяцев;
ПоследнийДеньМесяца = КонецМесяца(Результат);
Если День > День(ПоследнийДеньМесяца) Тогда
Возврат ПоследнийДеньМесяца;
Иначе
Возврат НачалоДня(Результат) + (День - 1);
КонецЕсли;
КонецФункции
Как прибавить время в запросе 1С?
В языке запросов используйте функцию ДОБАВИТЬКДАТЕ():
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 5) КАК ДатаЧерез5Дней,
ДОБАВИТЬКДАТЕ(&Дата, ЧАС, 3) КАК ДатаЧерез3Часа
Поддерживаемые интервалы: ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА.
Можно ли прибавить отрицательное время (вычесть интервал)?
Да, просто используйте отрицательные значения:
- Вычесть 2 дня:
ТекущаяДата() - 2 - Вычесть 5 часов:
ТекущаяДата() - (5/24)
Для удобства создайте функцию ВычестьДни(Дата, Количество).
Как учитывать праздники при расчете сроков?
Используйте ПроизводственныйКалендарь с проверкой типа:
Календарь = Календари.ПроизводственныйКалендарь();
Если НЕ Календарь.РабочийДень(Дата) Тогда
// это выходной или праздник
КонецЕсли;
Для региональных праздников дополнительно проверяйте справочник ПраздничныеДни или интегрируйтесь с внешними календарными сервисами.