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

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

Базовые принципы работы с типом Дата в 1С

Тип данных Дата в 1С хранит информацию о конкретной точке во времени с точностью до секунды. Однако при операционных действиях часто требуется игнорировать время и работать только с календарными сутками.

Когда вы получаете текущую дату с помощью функции ТекущаяДата(), система возвращает момент "здесь и сейчас". Если ваша цель — получить дату завтрашнего дня, вам необходимо понять, как платформа обрабатывает переход через полночь. Простое сложение чисел может дать неожиданный результат, если не учесть временную составляющую.

Для корректной работы рекомендуется сначала привести дату к началу суток. Это устраняет влияние часов, минут и секунд на конечный результат. В противном случае, при добавлении одного дня к дате "15.05.2026 14:30", вы получите "16.05.2026 14:30", что может быть нежелательно для отчетов, формируемых строго по дням.

⚠️ Внимание: Никогда не используйте жестко заданные числовые константы для расчета дат в долгосрочной перспективе без проверки границ месяца. Алгоритм должен учитывать разное количество дней в месяцах (28, 29, 30, 31).

💡

Всегда приводите дату к началу суток с помощью функции НачалоДня(), если ваша логика зависит только от календарного дня, а не от конкретного времени.

Использование функции ДобавлениеДаты для сдвига времени

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

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

Преимущество этого подхода заключается в его "умности". Система автоматически корректно обрабатывает переходы через конец месяца и високосные годы. Вам не нужно писать дополнительные условия для проверки, является ли текущий месяц февралем или сколько дней в марте.

ИсходнаяДата = ТекущаяДата();

НоваяДата = ДобавлениеДаты(ИсходнаяДата, 1, ПериодДата.День);

Результатом выполнения такого кода будет дата, отстоящая ровно на 24 часа от исходной точки, с сохранением времени. Если же вам нужно сдвинуть именно календарный день, сохранив время на уровне 00:00:00, комбинация с функцией очистки времени будет идеальным решением.

💡

Функция ДобавлениеДаты является стандартом де-факто для работы с временными интервалами в 1С, так как она гарантирует корректность расчетов при любых календарных границах.

Арифметические операции и числовое представление

Поскольку дата в 1С внутренне представлена как количество секунд, прошедших с некой эпохи, к ней можно применять обычные математические операции. Однако здесь кроется подводный камень: единицей измерения является секунда, а не день.

Чтобы увеличить дату на один день методом сложения, необходимо знать точное количество секунд в сутках. В одних сутках содержится 86 400 секунд. Следовательно, для сдвига на 24 часа вперед нужно прибавить именно это число к исходной дате.

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

  • 📅 Один день равен 86 400 секундам.
  • ⏱️ Один час равен 3 600 секундам.
  • 🔄 Одна минута равна 60 секундам.

Пример кода для арифметического сдвига выглядит следующим образом:

СекундВДне = 86400;

Завтра = Сегодня + СекундВДне;

Главный недостаток такого подхода — читаемость кода. Сразу не очевидно, что число 86400 означает одни сутки, тогда как использование констант или функций делает код самодокументируемым. Кроме того, при работе с временными зонами могут возникнуть нюансы, которые лучше решать стандартными средствами платформы.

Почему не стоит использовать магические числа?

Использование чисел вроде 86400 усложняет поддержку кода. Другой разработчик может не знать, что это за число, и случайно изменить его при рефакторинге, что приведет к ошибкам в расчетах времени.

Корректная обработка переходов через месяц и год

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

Платформа 1С автоматически решает эту проблему при использовании функций ДобавлениеДаты или КонецДня. Если вы добавляете один день к 31 января, система сама переключит месяц на февраль и установит дату 1 февраля. Аналогично происходит переход через год: 31 декабря плюс один день даст 1 января следующего года.

В таблице ниже приведены примеры поведения системы при добавлении одного дня к различным датам конца периодов:

Исходная дата Операция Результат Особенность
31.01.2023 + 1 день 01.02.2023 Смена месяца
28.02.2023 + 1 день 01.03.2023 Обычный год
28.02.2026 + 1 день 29.02.2026 Високосный год
31.12.2023 + 1 день 01.01.2026 Смена года

Особое внимание следует уделить високосным годам. В 1С проверка на високосность встроена в логику календаря. Функция ДобавлениеДаты корректно определит, что в феврале 2026 года 29 дней, и переход на 1 марта произойдет только после 29-го числа.

⚠️ Внимание: При ручном конструировании даты через функцию Дата(Год, Месяц, День) передача несуществующего дня (например, 32 января) может привести к автоматическому сдвигу на следующий месяц в некоторых версиях, но полагаться на это поведение опасно. Всегда используйте стандартные функции сдвига.

📊 Какой метод сдвига даты вы используете чаще всего?
ДобавлениеДаты()
Арифметика секунд (+86400)
Ручное конструирование Дата()
Готовые обработки

Работа с началом и концом суток в контексте сдвига

В бухгалтерском и управленческом учете часто требуется оперировать понятиями "начало дня" и "конец дня". Увеличение даты на 1 день может подразумевать получение начала следующих суток или конца текущих, в зависимости от постановки задачи.

Функция НачалоДня() обнуляет время, оставляя только дату. Если применить к ней сдвиг на +1 день, мы получим 00:00:00 завтрашнего дня. Это критически важно для построения выборок из базы данных, где условия часто задаются в диапазоне от начала одного дня до начала следующего.

С другой стороны, функция КонецДня() устанавливает время на 23:59:59. Если вам нужно найти дату "завтра" для ограничения выборки "до конца завтрашнего дня", логика будет следующей: берем начало завтрашнего дня и добавляем к нему почти сутки, либо используем начало послезавтрашнего дня как верхнюю границу (не включительно).

Рассмотрим типовой пример формирования интервала для отчета за завтрашний день:

НачалоПериода = НачалоДня(ДобавлениеДаты(ТекущаяДата(), 1, ПериодДата.День));

КонецПериода = КонецДня(ДобавлениеДаты(ТекущаяДата(), 1, ПериодДата.День));

Такой подход гарантирует, что в выборку попадут все документы, проведенные в течение завтрашних суток, независимо от конкретной минуты их создания.

☑️ Проверка корректности интервала

Выполнено: 0 / 4

Особенности работы в запросах и СКД

При написании запросов к базе данных 1С логика работы с датами остается прежней, но синтаксис меняется на язык запросов. В тексте запроса также доступна функция ДАТАВГОД (аналог ДобавлениеДаты) и арифметические операции.

В языке запросов 1С можно напрямую писать выражения в конструкции ВЫБРАТЬ. Например, чтобы получить список документов с датой на день позже текущей, можно использовать выражение в поле выбора или в условии ГДЕ.

Важно учитывать, что в запросах тип ДатаВремя может вести себя специфично при сравнении. Если в условии вы пишете ГДЕ Дата = &ДатаЗавтра, а в параметре передана дата с временем 10:00, то документы с временем 11:00 не попадут в выборку, хотя календарно это тот же день.

  • 🔍 Используйте НАЧАЛОДНЯ() в запросах для нормализации дат перед сравнением.
  • 🚀 Вычисляйте сдвинутые даты в тексте запроса для оптимизации, если параметр не меняется.
  • ⚙️ В СКД (Система Компоновки Данных) используйте поля вычисляемые с выражением Дата + 1 (в днях, если настроено соответствующее представление).

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

ВЫБРАТЬ

ДокументРасходы.Ссылка КАК Ссылка,

ДОБАВИТЬКДАТЕ(ДокументРасходы.Дата, 1, ДЕНЬ) КАК ДатаЗавтра

ИЗ

Документ.Расходы КАК ДокументРасходы

ГДЕ

ДокументРасходы.Дата МЕЖДУ &НачалоДня И &КонецДня

Здесь параметры &НачалоДня и &КонецДня должны быть рассчитаны заранее в коде 1С и переданы в запрос, либо вычислены внутри запроса, если платформа позволяет использовать функции в условиях ГДЕ без потери индексов.

⚠️ Внимание: Интерфейс и доступные функции в конструкторе запросов могут незначительно отличаться в зависимости от версии платформы 1С (8.2, 8.3, 8.3.20+). Всегда проверяйте подсказки синтаксиса в вашей конкретной конфигурации.

Часто задаваемые вопросы (FAQ)

Как увеличить дату на 1 день, если сегодня 31 декабря?

При использовании функции ДобавлениеДаты(Дата, 1, ПериодДата.День) система автоматически определит конец года. К дате 31.12.2023 будет добавлен один день, и результат составит 01.01.2026. Год увеличится автоматически, вручную менять его не нужно.

В чем разница между добавлением 86400 секунд и 1 дня?

Физически это одно и то же время (24 часа). Однако функция ДобавлениеДаты с параметром День работает на уровне календаря, что делает код более читаемым. Арифметика с секундами требует запоминания константы 86400 и менее очевидна для стороннего разработчика.

Как получить вчерашнюю дату в 1С?

Логика полностью аналогична получению завтрашней даты, но интервал сдвига должен быть отрицательным. Используйте код: ДобавлениеДаты(ТекущаяДата(), -1, ПериодДата.День). Минус перед единицей сдвинет дату на одни сутки назад.

Можно ли складывать даты напрямую без функций?

Да, дата в 1С — это число секунд. Вы можете написать НоваяДата = СтараяДата + 1000. Но такой код сложно поддерживать. Рекомендуется использовать функции или именованные константы для количества секунд в сутках, чтобы избежать ошибок при чтении кода.

Как игнорировать время при сдвиге даты?

Перед операцией сдвига оберните дату в функцию НачалоДня(). Это обнулит часы, минуты и секунды. Пример: Завтра = НачалоДня(Сегодня) + 86400 или Завтра = НачалоДня(ДобавлениеДаты(Сегодня, 1, ПериодДата.День)).