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

Особенность заключается в том, что здесь время хранится не как отдельный тип данных, а как часть типа Дата. Это означает, что прибавление часов, минут или секунд требует специфических подходов. Мы рассмотрим не только стандартные функции встроенного языка, но и нюансы работы с неполными датами, периодами и регламентными задачами, где точность временных расчетов критически важна.

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. Работа с временными интервалами: секунды, миллисекунды

Для высокоточных расчетов (например, в регламентных заданиях или логировании событий) часто требуется оперировать секундами или миллисекундами. В для этого используют:

  • 🕒 ТекущаяУниверсальнаяДатаВМиллисекундах() — возвращает количество миллисекунд с 1970-01-01 (UNIX-время)
  • Миллисекунд() — преобразует дату в миллисекунды
  • ⏲️ ДобавитьСекунды() — прибавляет секунды к дате

Пример расчета времени выполнения операции:

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();

// ... выполнение кода ...

Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();

ДлительностьМс = Конец - Начало;

Сообщить("Операция выполнена за " + ДлительностьМс + " мс");

Критическая особенность: при работе с миллисекундами учитывайте, что 1С округляет временные значения до секунды при отображении в интерфейсе, но в коде оперирует полной точностью. Это важно для интеграций с внешними системами, где требуется синхронизация по времени с точностью до миллисекунд.

📊 Какой тип временных расчетов вам приходится использовать чаще?
Дни и часы
Минуты и секунды
Миллисекунды
Рабочие/выходные дни

4. Прибавление времени с учетом рабочего календаря

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

  1. Производственный календарь — стандартный механизм платформы, который хранит информацию о рабочих/выходных днях.
  2. Самостоятельные функции — если требуется учет специфических праздников (например, корпоративных выходных).

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

Функция ДобавьРабочиеДни(Дата, КоличествоДней)

Календарь = Календари.ПроизводственныйКалендарь();

Результат = Дата;

ОсталосьДобавь = КоличествоДней;

Пока ОсталосьДобавь > 0 Цикл

Результат = Результат + 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 → ошибка).
  2. Неучет часовых поясов: сравнение времени из разных источников без приведения к единому поясу.
  3. Округление временных значений: потеря точности при преобразовании в секунды/миллисекунды.
  4. Забытые выходные: прибавление календарных дней вместо рабочих.

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

  • 🔍 Всегда используйте тип Дата для временных переменных.
  • 📅 Для бизнес-логики применяйте ПроизводственныйКалендарь.
  • ⏱️ При работе с миллисекундами используйте ТекущаяУниверсальнаяДатаВМиллисекундах().
⚠️ Внимание: В версиях 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 февраля?

Это стандартное поведение функции ДобавьМесяц(). Платформа следит за корректностью дат: если в целевом месяце нет такого дня (например, 31 февраля), возвращается последний день месяца. Чтобы сохранить день, используйте:

Функция ДобавьМесяцСохраняяДень(Дата, Месяцев)

День = День(Дата);

Результат = НачалоМесяца(Дата) + Месяцев;

ПоследнийДеньМесяца = КонецМесяца(Результат);

Если День > День(ПоследнийДеньМесяца) Тогда

Возврат ПоследнийДеньМесяца;

Иначе

Возврат НачалоДня(Результат) + (День - 1);

КонецЕсли;

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

Как прибавить время в запросе 1С?

В языке запросов используйте функцию ДОБАВИТЬКДАТЕ():

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 5) КАК ДатаЧерез5Дней,

ДОБАВИТЬКДАТЕ(&Дата, ЧАС, 3) КАК ДатаЧерез3Часа

Поддерживаемые интервалы: ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА.

Можно ли прибавить отрицательное время (вычесть интервал)?

Да, просто используйте отрицательные значения:

  • Вычесть 2 дня: ТекущаяДата() - 2
  • Вычесть 5 часов: ТекущаяДата() - (5/24)

Для удобства создайте функцию ВычестьДни(Дата, Количество).

Как учитывать праздники при расчете сроков?

Используйте ПроизводственныйКалендарь с проверкой типа:

Календарь = Календари.ПроизводственныйКалендарь();

Если НЕ Календарь.РабочийДень(Дата) Тогда

// это выходной или праздник

КонецЕсли;

Для региональных праздников дополнительно проверяйте справочник ПраздничныеДни или интегрируйтесь с внешними календарными сервисами.