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

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

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

Базовая арифметика с типом Дата

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

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

ТекущаяДата = ТекущаяДата;

ВчерашняяДата = ТекущаяДата - 1;

В приведенном примере переменная ВчерашняяДата будет содержать дату ровно на 24 часа раньше значения ТекущаяДата. Важно отметить, что при этом сохраняется время суток. Если ТекущаяДата равна 15.05.2026 14:30:00, то результат вычитания будет 14.05.2026 14:30:00.

💡

Если вам нужно получить только дату без времени (начало дня), используйте функцию НачалоДня после вычитания: НачалоДня(ТекущаяДата - 1).

Также допустимо вычитать дробные числа, если требуется изменить дату на часть суток. Например, вычитание 0.5 уменьшит дату на 12 часов. Однако для задачи"вычесть день" использование целой единицы является наиболее читаемым и надежным вариантом.

Использование встроенных функций работы с датой

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

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

ИсходнаяДата ='20260515';

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

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

  • 📅 Период.Год — изменяет год в дате, сохраняя месяц и день.
  • 📅 Период.Квартал — сдвигает дату на три месяца вперед или назад.
  • 📅 Период.Месяц — изменяет месяц, корректно обрабатывая концы месяцев.
  • 📅 Период.День — сдвигает дату на указанное количество суток.

Стоит обратить внимание на поведение функции при переходе через конец месяца. Если вы используете Период.Месяц и вычитаете месяц из даты 31 марта, результатом будет 28 или 29 февраля, в зависимости от года. При использовании Период.День такой двусмысленности не возникает — вычитается строго календарный день.

Особенности функции ДобавитьКДате

Функция возвращает новое значение даты, не изменяя исходную переменную. Это соответствует принципу неизменяемости примитивных типов в 1С, что предотвращает случайные побочные эффекты в коде.

Вычитание дней в запросах 1С

Работа с датами в языке запросов 1С имеет свои особенности, отличные от встроенного языка. В тексте запроса нельзя просто написать арифметическое выражение в списке полей без использования специальных функций или конструкций. Для вычитания дней непосредственно в выборке данных используется функция ДАТАВРЕМЯ или арифметика в условиях.

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

ВЫБРАТЬ

Документ.Ссылка,

Документ.Дата

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

Метод Где применяется Производительность Читаемость
Арифметика (- 1) Встроенный язык, Запросы Высокая Отличная
ДобавитьКДате Встроенный язык Высокая Высокая
Параметры запроса Язык запросов Оптимальная Средняя
Функция ДАТАВРЕМЯ Язык запросов Средняя Низкая

При использовании вычитания в запросах стоит помнить о индексах. Если условие содержит сложное выражение над полем даты, сервер может не использовать индекс по дате, что замедлит выполнение запроса на больших объемах данных. Лучше вычислять граничные даты в коде и передавать их параметрами.

📊 Как вы чаще всего работаете с датами в запросах?
Передаю параметрами из кода
Использую арифметику в тексте запроса
Применяю виртуальные таблицы
Использую СКД

Работа с началом и концом дня

Частой ошибкой при вычитании дней является игнорирование временной составляющей. Тип Дата в 1С всегда содержит и дату, и время. Если вы получили дату из документа, где время установлено в 15:00, и вычли один день, вы получите вчерашний день также с временем 15:00.

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

ДатаДокумента ='15.05.2026 15:30:00';

// Получаем вчерашний день с тем же временем

ВчераТожеВремя = ДатаДокумента - 1;

// Получаем начало вчерашнего дня (00:00:00)

НачалоВчера = НачалоДня(ДатаДокумента - 1);

⚠️ Внимание: При сравнении дат в условиях отбора помните, что 14.05.2026 15:00 больше, чем 14.05.2026 00:00. Если вы ищете документы"за вчерашний день", использование просто Дата = Вчера может не сработать, если в документе стоит время. Используйте диапазоны: Между НачалоДня(Вчера) И КонецДня(Вчера).

Функция КонецДня также полезна при формировании периодов. Она возвращает время 23:59:59 указанной даты. Комбинация НачалоДня(Дата - 1) и КонецДня(Дата - 1) дает полный временной интервал предыдущих суток.

Понимание разницы между"датой со временем" и"границами дня" критически важно для корректной работы отчетов. Неправильная установка границ может привести к тому, что документы, созданные поздно вечером, не попадут в выборку за нужный день.

💡

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

Учет високосных лет и переходов через месяц

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

Если вы вычитаете один день из 1 марта 2026 года, система корректно вернет 28 февраля 2026 года, так как 2026 год не является високосным. Если же дата будет 1 марта 2026 года, результатом станет 29 февраля. Эта логика встроена в ядро платформы и работает одинаково во всех режимах.

  • 🗓 Переход через конец месяца обрабатывается автоматически.
  • 🗓 Високосные года учитываются без дополнительных проверок.
  • 🗓 Переход через границу года (31 декабря -> 30 декабря) не требует спец. кода.

Тем не менее, при работе с интервалами, кратными месяцам (например,"месяц назад"), поведение может отличаться от простого вычитания 30 дней. Функция ДобавитьКДате с параметром Период.Месяц старается сохранить номер дня. Если такого дня в целевом месяце нет (например, 31 января -> 28 февраля), она возвращает последний день месяца.

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

Практические примеры в типовых задачах

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

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

Функция РассчитатьПени(СуммаДолга, ДатаПлатежа, Ставка)

СрокОплаты = ДатаПлатежа + 5; // 5 дней льготного периода

Сегодня = ТекущаяДата;

Если Сегодня > СрокОплаты Тогда

ДнейПросрочки = Сегодня - СрокОплаты;

// Вычитаем 1, если считаем полные дни иначе

Пени = СуммаДолга ДнейПросрочки Ставка;

КонецЕсли;

Возврат Пени;

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

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

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

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

☑️ Проверка корректности работы с датами

Выполнено: 0 / 5
Можно ли вычесть дробное число дней из даты?

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

Что произойдет, если вычесть день из 1 января?

Система корректно обработает переход через год. Из даты 01.01.2026 будет вычтен один день, и результатом станет 31.12.2026. Время суток при этом сохранится.

В чем разница между Дата - 1 и ДобавитьКДате(Дата, День, -1)?

Функционально разницы нет, обе операции вернут одинаковый результат. Однако ДобавитьКДате считается более явным способом, указывающим на намерение работать именно с календарными днями, что улучшает читаемость кода.

Как вычесть день в СКД (Системе Компоновки Данных)?

В выражениях СКД можно использовать стандартные функции языка. Для вычитания дня используйте выражение &Дата - 1 в поле вычисляемого поля или в условии отбора, либо функцию ДобавитьКДате(&Дата,"День", -1).