Разработка и Конфигурация · 10 мин
Как записать дату в запросе 1С
Как правильно записать дату в запросе 1С: функция ДАТАВРЕМЯ, параметры, пустая дата, сравнение периодов и типичные ошибки при работе с датами в запросах.
Дата — один из самых частых типов данных в запросах 1С: по ней отбираются документы, строятся отчёты за период, рассчитываются остатки. При этом синтаксис работы с датами в языке запросов отличается от встроенного языка, и ошибка в записи приводит либо к ошибке выполнения, либо к пустому результату без каких-либо сообщений.
В языке запросов 1С есть три основных способа указать дату: литерал через функцию ДАТАВРЕМЯ, параметр запроса и выражение над полем даты (НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ДОБАВИТЬКДАТЕ). Выбор зависит от того, известна ли дата заранее или передаётся из кода, а также от требуемой точности — до секунды или до границы дня.
Как записать дату литералом через ДАТАВРЕМЯ
В языке запросов нельзя написать дату в кавычках, как строку — конструкция вида ГДЕ Документ.Дата = "15.01.2026" вызовет ошибку. Для фиксированной даты используется функция ДАТАВРЕМЯ, которая принимает числовые аргументы: год, месяц, день, а затем необязательные час, минута и секунда.
ГДЕ РеализацияТоваров.Дата >= ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0)
Если время не указано, оно считается равным 00:00:00. Это важно: условие Дата <= ДАТАВРЕМЯ(2026, 1, 15) отберёт документы только до начала 15 января, а все документы, проведённые в течение 15 января, в выборку не попадут. Чтобы включить весь день, либо указывайте 23:59:59, либо используйте функцию КОНЕЦПЕРИОДА.
Месяц и день пишутся числами без ведущего нуля, допустимы оба варианта: ДАТАВРЕМЯ(2026, 1, 5) и ДАТАВРЕМЯ(2026, 01, 05) эквивалентны. Год указывается полностью, четырьмя цифрами.
Как передать дату через параметр запроса
Когда дата вычисляется в коде — например, выбрана пользователем в отчёте — её передают через параметр. В тексте запроса параметр начинается с символа амперсанда, а значение устанавливается методом УстановитьПараметр.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));
Обратите внимание на функции НачалоДня() и КонецДня() встроенного языка: они приводят дату к 00:00:00 и 23:59:59 соответственно. Если передать дату «как есть», в неё может оказаться текущее время, и границы периода сместятся — часть документов потеряется из выборки.
Параметры — предпочтительный способ в прикладном коде: текст запроса остаётся неизменным, его проще читать и отлаживать, а даты не нужно форматировать вручную. Подстановка даты в текст запроса через конкатенацию строк — плохая практика: она требует ручного форматирования и легко ломается при смене региональных настроек.
- 1Сформируйте значение даты во встроенном языке
- 2Приведите границы через НачалоДня() и КонецДня()
- 3Добавьте параметр с амперсандом в текст запроса
- 4Вызовите УстановитьПараметр с тем же именем
- 5Выполните запрос и проверьте число строк результата
Как задать пустую дату и проверить на неё
Пустая дата в 1С — это значение 01.01.0001 00:00:00. В запросе она записывается так же через ДАТАВРЕМЯ: ДАТАВРЕМЯ(1, 1, 1). Такая проверка нужна, когда поле даты необязательно для заполнения и требуется отобрать записи, где срок не указан.
ГДЕ Заказ.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Не путайте пустую дату со значением NULL. NULL возникает при левом соединении, если в присоединённой таблице нет подходящей строки, и сравнение с пустой датой его не найдёт. Для поиска NULL используется оператор ЕСТЬ NULL, а для подмены NULL конкретным значением — функция ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)).
Способы указать дату в запросе
Константная дата, известная на момент написания запроса. Не подходит для динамических значений.
Дата вычисляется в коде или выбирается пользователем. Универсальный вариант для отчётов и обработок.
Округление поля даты до границы дня, месяца, квартала, года. Нужна для группировок и сравнений без учёта времени.
Сдвиг даты на заданное число дней, месяцев и т.д. Используется для скользящих периодов.
Сравнение дат без учёта времени
Дата документа в 1С хранится с точностью до секунды, поэтому прямое сравнение Документ.Дата = ДАТАВРЕМЯ(2026, 1, 15) почти никогда не сработает — документ проведён в конкретное время, а не ровно в полночь. Чтобы отобрать документы за конкретный день, округлите поле даты функцией НАЧАЛОПЕРИОДА.
ГДЕ НАЧАЛОПЕРИОДА(РеализацияТоваров.Дата, ДЕНЬ) = ДАТАВРЕМЯ(2026, 1, 15)
Функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА принимают вторым аргументом тип периода: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Это позволяет, например, сгруппировать продажи по месяцам: НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) в секции СГРУППИРОВАТЬ ПО даст по одной строке на каждый месяц.
Для диапазонов надёжнее конструкция Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) — она корректно включает обе граничные даты целиком, независимо от времени в параметрах.
Как прибавить или вычесть время: ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ
Для арифметики с датами в языке запросов есть две функции. ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество) сдвигает дату вперёд или назад: ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -7) вернёт дату неделю назад. Отрицательное количество работает как вычитание.
РАЗНОСТЬДАТ(Дата1, Дата2, ТипПериода) возвращает число — сколько единиц периода помещается между датами. Типичное применение — найти документы с истёкшим сроком оплаты: ГДЕ РАЗНОСТЬДАТ(Заказ.Дата, &ТекущаяДата, ДЕНЬ) > 14.
Учитывайте, что РАЗНОСТЬДАТ считает в целых единицах указанного периода: разница между 23:59 и 00:01 следующего дня в днях равна единице, хотя прошло две минуты. Для точных расчётов используйте более мелкий тип периода — часы или секунды.
Даты в виртуальных таблицах регистров
Особый случай — виртуальные таблицы регистров накопления и сведений: Остатки, Обороты, СрезПоследних. Их параметры задаются в скобках после имени таблицы, и первым обычно идёт период. Например, остатки на конкретную дату:
РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодОстатков, ) КАК Остатки
Для таблицы Обороты параметры идут в порядке: начало периода, конец периода, периодичность, условие. СрезПоследних принимает период и условие. Если передать в параметр периода дату с временем, срез или остатки будут рассчитаны строго на этот момент — для отчётов «на конец дня» передавайте КонецДня(Дата) или границу периода.
Альтернатива — тип Граница во встроенном языке с видом «Включая» или «Исключая». Она важна для регистров, где несколько документов могут иметь одинаковую дату-время: граница «Исключая» отсекает движения самого граничного документа.
Как проверить результат
Включаются документы с любым временем внутри дня
Документы после 00:00:00 последнего дня отсутствуют
Начало 00:00:00, конец 23:59:59
В параметрах стоит текущее время
Находятся условием = ДАТАВРЕМЯ(1,1,1)
Записи с незаполненной датой не попадают в результат
Как отладить запрос с датами
Быстрее всего проверить условия по датам в консоли запросов — внешней обработке, которая позволяет выполнить запрос с произвольными параметрами и посмотреть значения параметров до выполнения. Убедитесь, что параметры содержат ожидаемые дату и время, а затем поэтапно упрощайте условие ГДЕ, пока не найдёте отсекающий фрагмент.
Полезный приём — вывести в запросе само отладочное выражение: добавьте в поля выборки НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) и сравните с ожидаемым значением. Так видно, как запрос «понимает» ваши данные, без догадок.
Что важно запомнить
Фиксированную дату пишите через ДАТАВРЕМЯ, вычисляемую — передавайте параметром с НачалоДня/КонецДня. Для сравнения по дню округляйте поле через НАЧАЛОПЕРИОДА, пустая дата — это ДАТАВРЕМЯ(1,1,1), а NULL проверяется отдельно.
Частые вопросы
Как записать текущую дату в запросе 1С?
В языке запросов нет функции «текущая дата». Получите её во встроенном языке функцией ТекущаяДатаСеанса() и передайте в запрос параметром. Использовать ТекущаяДата() в клиентском коде не рекомендуется — время клиента может отличаться от серверного.
Почему условие по дате не находит документы, хотя они есть?
Чаще всего дата документа содержит время, а в условии задана полночь. Округлите поле через НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) или задайте диапазон от начала до конца дня. Также проверьте, что документы проведены — непроведённые в выборку по регистрам не попадают.
Как отобрать документы за текущий месяц?
Передайте параметрами НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()) и используйте условие МЕЖДУ. Либо сравнивайте НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) с НАЧАЛОПЕРИОДА(&ТекущаяДата, МЕСЯЦ).
Чем отличается период в СрезПоследних от обычного условия?
Параметр периода в СрезПоследних определяет момент, на который берутся актуальные значения измерений, — он работает до фильтрации. Условие в ГДЕ применяется уже к полученному срезу и не влияет на то, какие записи считаются последними.
Можно ли форматировать дату прямо в запросе?
Нет, язык запросов не форматирует даты в строки. Получите дату в результате запроса и отформатируйте во встроенном языке функцией Формат(Дата, "ДЛФ=D") или в макете СКД через настройки оформления поля.
Как сравнить только время без даты?
Выньте время через РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), Дата, СЕКУНДА) — получите число секунд от начала дня, которое можно сравнивать с нужным порогом. Прямого типа «время» в запросах нет.