Разработка и Конфигурация · 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 дней».
ВЫБРАТЬ РАЗНОСТЬДАТ(Партия.ДатаДокумента, &ТекущаяДата, ДЕНЬ) КАК ДнейНаСкладе ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиПередача дат через параметры и литералы
Дату в запрос можно передать тремя способами: полем таблицы, параметром или литералом ДАТАВРЕМЯ(год, месяц, день, час, минута, секунда). Ошибка в любом из них приводит либо к ошибке выполнения, либо к пустому результату.
При программной установке параметра используйте значение типа «Дата» встроенного языка: Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()). Передача строки вида «31.01.2026» вызовет ошибку несоответствия типов — функция РАЗНОСТЬДАТ требует именно даты.
Литерал удобен для фиксированных границ: РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2026, 1, 1); Заказ.Дата; ДЕНЬ). Обратите внимание: если время не указано, оно равно началу дня (00:00:00), что влияет на результат при единицах ЧАС и МИНУТА.
Альтернативы: ДОБАВИТЬКДАТЕ и вычисления вне запроса
Обратная задача — получить дату, сдвинутую на заданное число дней, — решается функцией ДОБАВИТЬКДАТЕ(Дата; Единица; Количество). Чтобы «отнять» период, передайте отрицательное количество: ДОБАВИТЬКДАТЕ(&ТекущаяДата; ДЕНЬ; -7) даст дату неделю назад. Это полезно для отборов по периоду прямо в запросе.
Если расчёт сложный (учёт производственного календаря, дробные периоды, нестандартное округление), часто рациональнее вычислить значения во встроенном языке и передать их в запрос параметрами, чем строить громоздкие конструкции из РАЗНОСТЬДАТ и ВЫБОР. В схеме компоновки данных часть вычислений можно вынести в вычисляемые поля — это разгружает сам запрос.
Сравнение подходов
Подходит для выборок, отборов и группировок по интервалам; ограничение — только целые единицы и только даты, без учёта календаря.
Нужна, когда требуется получить дату, сдвинутую на период; не вычисляет разность, а строит новую дату.
Гибче для сложной логики (календари, округления), но результат нельзя использовать в условиях соединения внутри запроса.
Проверка результата и типичные ошибки
Перед тем как встраивать выражение в рабочий отчёт, проверьте его в консоли запросов на контрольных примерах: даты в одном дне, даты через границу месяца и года, даты в обратном порядке. Сверьте результат с ручным подсчётом — расхождение почти всегда означает неверный порядок аргументов или неподходящую единицу измерения.
Как проверить результат
Положительный при Дата2 позже Дата1
Неожиданный минус — перепутан порядок аргументов
Разность в днях = 1, в месяцах = 0
В месяцах = 1 — значит, логика округления понята неверно
Исключены условием или обработаны через ВЫБОР
В отчёте встречаются значения в сотни тысяч дней
Часто задаваемые вопросы
Можно ли вычесть даты обычным минусом в запросе 1С?
Нет. Оператор «−» не определён для операндов типа «Дата» в языке запросов — попытка приведёт к ошибке при выполнении. Для разности используйте РАЗНОСТЬДАТ, для сдвига даты на период — ДОБАВИТЬКДАТЕ.
Как получить разность в днях с дробной частью, например 2,5 дня?
Возьмите разность в часах или минутах и разделите на 24 или 1440 соответственно. РАЗНОСТЬДАТ сама дробные значения не возвращает — она отбрасывает неполную единицу.
Почему РАЗНОСТЬДАТ в месяцах между 31 января и 28 февраля даёт 0?
Функция считает только полные месяцы между датами, а полный месяц между этими датами ещё не прошёл. Если нужно просто сравнить календарные месяцы, вычтите значения функции МЕСЯЦ() с поправкой на год либо используйте НАЧАЛОПЕРИОДА.
Как учесть только рабочие дни при вычитании дат?
РАЗНОСТЬДАТ считает календарное время и не знает о выходных. Для рабочих дней нужен регистр с производственным календарём: посчитайте количество записей календаря с признаком рабочего дня в нужном интервале через соединение с этим регистром.
Работает ли РАЗНОСТЬДАТ в СКД и в консоли запросов?
Да, функция является частью языка запросов платформы и одинаково доступна в консоли запросов, в тексте запроса схемы компоновки данных и в программно формируемых запросах. В СКД её также можно применять в вычисляемых полях.
Что вернёт функция, если одна из дат пустая?
Пустая дата в 1С — это 01.01.0001 00:00:00. Разность с ней вычислится корректно с точки зрения платформы, но даст огромное число, которое исказит отчёт. Такие строки следует отфильтровывать условием или обрабатывать через ВЫБОР.
Что важно запомнить
Вычитание дат в запросе 1С выполняется только функцией РАЗНОСТЬДАТ(Дата1; Дата2; Единица): она возвращает целое число полных единиц между датами, отрицательное — при обратном порядке дат. Для сдвига даты используйте ДОБАВИТЬКДАТЕ, для рабочих дней — производственный календарь, и всегда проверяйте запрос на граничных датах и пустых значениях.