К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как в 1С отнять дату от даты в запросе

Как в запросе 1С отнять дату от даты с помощью функции РАЗНОСТЬДАТ: синтаксис, единицы измерения, примеры расчёта дней, месяцев и возраста, типичные ошибки.

Вычитание одной даты из другой — типовая задача при построении отчётов и выборок в 1С: посчитать срок хранения товара, возраст сотрудника, просрочку оплаты, количество дней между документами. В языке запросов 1С для этого существует специальная функция РАЗНОСТЬДАТ, потому что обычный оператор «минус» к полям типа «Дата» применить нельзя — запрос просто не выполнится.

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

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

Синтаксис функции РАЗНОСТЬДАТ

Общий вид вызова: РАЗНОСТЬДАТ(<Дата1>; <Дата2>; <ЕдиницаИзмерения>). Первые два параметра — выражения типа «Дата» (поля таблицы, параметры запроса, литералы вида ДАТАВРЕМЯ(2026, 1, 31)). Третий параметр — ключевое слово единицы измерения без кавычек.

Функция вычисляет, сколько целых единиц измерения прошло от первой даты до второй: Дата2 − Дата1. Если вторая дата раньше первой, результат будет отрицательным. Это удобно для определения просрочки: отрицательное значение сразу показывает, что срок уже прошёл.

ВЫБРАТЬ

РАЗНОСТЬДАТ(Заказ.Дата; &ТекущаяДата; ДЕНЬ) КАК ДнейСДатыЗаказа

ИЗ

Документ.ЗаказПокупателя КАК Заказ

Порядок аргументов легко запомнить: первым идёт «раньшая» дата, вторым — «поздняя», если нужен положительный результат. Перепутанный порядок — самая частая причина отрицательных чисел там, где ожидались положительные.

Единицы измерения и особенности округления

Третьим параметром передаётся одно из ключевых слов: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Важно понимать: функция считает полные единицы. Дробная часть отбрасывается, а не округляется по математическим правилам.

Например, между 10:00 утра и 18:30 того же дня разность в часах даст 8, хотя прошло 8,5 часа. А разность между 31 января и 1 февраля в месяцах даст 0 — полный месяц ещё не прошёл, хотя календарно даты попадают в разные месяцы. Для задач вроде «в каком месяце» используйте функции МЕСЯЦ(Дата) или НАЧАЛОПЕРИОДА, а не РАЗНОСТЬДАТ.

ЕдиницаЧто считаетТиповое применение
СЕКУНДАПолные секунды между датамиЗамеры длительности операций, логи
МИНУТАПолные минутыВремя обработки заказа, SLA
ЧАСПолные часыСмены, время реакции поддержки
ДЕНЬПолные суткиПросрочка оплаты, срок хранения
МЕСЯЦПолные месяцыСтаж, возраст товара на складе
КВАРТАЛПолные кварталыПлан-фактный анализ по кварталам
ГОДПолные годыВозраст сотрудника, стаж работы

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

Просрочка оплаты по счёту

Классическая задача — показать, на сколько дней просрочена оплата. Дату оплаты сравниваем с плановой датой, а отбор накладываем на отрицательный результат:

ВЫБРАТЬ

Счет.Номер,

РАЗНОСТЬДАТ(Счет.ДатаОплатыПлан; &ТекущаяДата; ДЕНЬ) КАК ДнейПросрочки

ИЗ

Документ.СчетНаОплату КАК Счет

ГДЕ

РАЗНОСТЬДАТ(Счет.ДатаОплатыПлан; &ТекущаяДата; ДЕНЬ) > 0

Здесь текущая дата передана параметром &ТекущаяДата — так запрос остаётся воспроизводимым и его можно тестировать на любую дату, подставляя нужное значение параметра.

Возраст сотрудника в полных годах

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

ВЫБРАТЬ

ФизЛицо.Наименование,

РАЗНОСТЬДАТ(ФизЛицо.ДатаРождения; &ТекущаяДата; ГОД) КАК Возраст

ИЗ

Справочник.ФизическиеЛица КАК ФизЛицо

Срок хранения товара на складе

Для анализа оборачиваемости удобно сгруппировать остатки по возрастным интервалам. Разность в днях от даты приходного документа помещается в вычисляемое поле, а затем через ВЫБОР раскладывается по корзинам «до 30 дней», «30–90 дней», «свыше 90 дней».

bsl
ВЫБРАТЬ РАЗНОСТЬДАТ(Партия.ДатаДокумента, &ТекущаяДата, ДЕНЬ) КАК ДнейНаСкладе ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

Передача дат через параметры и литералы

Дату в запрос можно передать тремя способами: полем таблицы, параметром или литералом ДАТАВРЕМЯ(год, месяц, день, час, минута, секунда). Ошибка в любом из них приводит либо к ошибке выполнения, либо к пустому результату.

При программной установке параметра используйте значение типа «Дата» встроенного языка: Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()). Передача строки вида «31.01.2026» вызовет ошибку несоответствия типов — функция РАЗНОСТЬДАТ требует именно даты.

Литерал удобен для фиксированных границ: РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2026, 1, 1); Заказ.Дата; ДЕНЬ). Обратите внимание: если время не указано, оно равно началу дня (00:00:00), что влияет на результат при единицах ЧАС и МИНУТА.

Альтернативы: ДОБАВИТЬКДАТЕ и вычисления вне запроса

Обратная задача — получить дату, сдвинутую на заданное число дней, — решается функцией ДОБАВИТЬКДАТЕ(Дата; Единица; Количество). Чтобы «отнять» период, передайте отрицательное количество: ДОБАВИТЬКДАТЕ(&ТекущаяДата; ДЕНЬ; -7) даст дату неделю назад. Это полезно для отборов по периоду прямо в запросе.

Если расчёт сложный (учёт производственного календаря, дробные периоды, нестандартное округление), часто рациональнее вычислить значения во встроенном языке и передать их в запрос параметрами, чем строить громоздкие конструкции из РАЗНОСТЬДАТ и ВЫБОР. В схеме компоновки данных часть вычислений можно вынести в вычисляемые поля — это разгружает сам запрос.

Сравнение подходов

РАЗНОСТЬДАТ в запросе

Подходит для выборок, отборов и группировок по интервалам; ограничение — только целые единицы и только даты, без учёта календаря.

ДОБАВИТЬКДАТЕ

Нужна, когда требуется получить дату, сдвинутую на период; не вычисляет разность, а строит новую дату.

Расчёт во встроенном языке

Гибче для сложной логики (календари, округления), но результат нельзя использовать в условиях соединения внутри запроса.

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Перепутан порядок дат — результат отрицательный там, где ожидалось положительное число.
02
Ожидание дробного результата — РАЗНОСТЬДАТ всегда отбрасывает дробную часть, для точности берите меньшую единицу и делите.
03
Передача строки вместо даты в параметр — запрос падает с ошибкой несоответствия типов.
04
Игнорирование пустых дат 01.01.0001 — в итогах появляются огромные искажённые значения.
05
Использование МЕСЯЦ для вычисления «в каком месяце» — для этого нужны функции МЕСЯЦ() или НАЧАЛОПЕРИОДА, а не разность.
Контрольные точки

Как проверить результат

Знак результата
Норма

Положительный при Дата2 позже Дата1

Тревожный признак

Неожиданный минус — перепутан порядок аргументов

Граничные даты (31.01 → 01.02)
Норма

Разность в днях = 1, в месяцах = 0

Тревожный признак

В месяцах = 1 — значит, логика округления понята неверно

Пустые даты в выборке
Норма

Исключены условием или обработаны через ВЫБОР

Тревожный признак

В отчёте встречаются значения в сотни тысяч дней

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

Можно ли вычесть даты обычным минусом в запросе 1С?

Нет. Оператор «−» не определён для операндов типа «Дата» в языке запросов — попытка приведёт к ошибке при выполнении. Для разности используйте РАЗНОСТЬДАТ, для сдвига даты на период — ДОБАВИТЬКДАТЕ.

Как получить разность в днях с дробной частью, например 2,5 дня?

Возьмите разность в часах или минутах и разделите на 24 или 1440 соответственно. РАЗНОСТЬДАТ сама дробные значения не возвращает — она отбрасывает неполную единицу.

Почему РАЗНОСТЬДАТ в месяцах между 31 января и 28 февраля даёт 0?

Функция считает только полные месяцы между датами, а полный месяц между этими датами ещё не прошёл. Если нужно просто сравнить календарные месяцы, вычтите значения функции МЕСЯЦ() с поправкой на год либо используйте НАЧАЛОПЕРИОДА.

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

РАЗНОСТЬДАТ считает календарное время и не знает о выходных. Для рабочих дней нужен регистр с производственным календарём: посчитайте количество записей календаря с признаком рабочего дня в нужном интервале через соединение с этим регистром.

Работает ли РАЗНОСТЬДАТ в СКД и в консоли запросов?

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

Что вернёт функция, если одна из дат пустая?

Пустая дата в 1С — это 01.01.0001 00:00:00. Разность с ней вычислится корректно с точки зрения платформы, но даст огромное число, которое исказит отчёт. Такие строки следует отфильтровывать условием или обрабатывать через ВЫБОР.

Итог

Что важно запомнить

Вычитание дат в запросе 1С выполняется только функцией РАЗНОСТЬДАТ(Дата1; Дата2; Единица): она возвращает целое число полных единиц между датами, отрицательное — при обратном порядке дат. Для сдвига даты используйте ДОБАВИТЬКДАТЕ, для рабочих дней — производственный календарь, и всегда проверяйте запрос на граничных датах и пустых значениях.