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

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

Базовые операторы сравнения временных меток

В языке запросов 1С для сопоставления значений типа Дата используются стандартные математические операторы. Синтаксически они ничем не отличаются от сравнения чисел или строк, однако семантика их работы имеет свои нюансы из-за высокой точности хранения времени (до миллисекунд). Для проверки равенства или неравенства применяются знаки = и <> соответственно.

Когда необходимо отфильтровать данные, наступившие после или до определенного момента, используются операторы больше и меньше..)) является строгим. Если в базе есть запись с точным совпадением времени до миллисекунды, она не попадет в выборку при использовании строгого неравенства.

Для включения граничных значений в выборку разработчики используют составные условия с операторами >= (больше или равно) и <= (меньше или равно). Это наиболее распространенный паттерн при формировании отчетов за период, где пользователю важно видеть документы, проведенные ровно в 00:00:00 первого дня и в 23:59:59 последнего дня.

⚠️ Внимание: При сравнении дат, полученных из интерфейса (где время часто усечено до дня) с датами из базы (где есть время), строгое равенство = сработает только в редких случаях. Всегда учитывайте временную составляющую.

💡

Используйте параметры запроса вместо подстановки значений прямо в текст запроса. Это не только защищает от SQL-инъекций, но и позволяет механизму 1С оптимизировать план выполнения запроса, кэшируя его структуру.

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

Платформа 1С предлагает уникальные ключевые слова, специально разработанные для работы с периодами: НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА. Эти функции позволяют динамически вычислять границы временных отрезков прямо в тексте запроса, что делает код более читаемым и независимым от ручных вычислений в коде управляемого приложения.

Функция НАЧАЛОПЕРИОДА принимает два аргумента: дату и тип периода (День, Неделя, Месяц, Квартал, Год). Она возвращает дату начала указанного интервала. Например, для даты 15.05.2026 и периода Месяц результат будет 01.05.2026 00:00:00. Это идеально подходит для установки нижней границы выборки.

Аналогично работает функция КОНЕЦПЕРИОДА, которая возвращает последнюю миллисекунду указанного интервала. Использование этих функций гарантирует, что вы захватите весь диапазон данных, не пропустив документы, проведенные в самые первые или последние мгновения отчетного периода.

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоПериода, МЕСЯЦ)

И КОНЕЦПЕРИОДА(&КонецПериода, МЕСЯЦ)

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

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

Оператор МЕЖДУ и его особенности

Оператор МЕЖДУ (или BETWEEN в терминологии SQL) является синтаксическим сахаром для записи двойного условия сравнения. Он позволяет компактно указать диапазон значений, в который должно попадать поле даты. Запись ГДЕ Дата МЕЖДУ Начало И Конец эквивалентна конструкции ГДЕ Дата >= Начало И Дата <= Конец.

Главное преимущество этого оператора — читаемость кода. При взгляде на запрос сразу понятно, что выбирается непрерывный отрезок времени. Однако важно помнить о включении граничных точек: оператор МЕЖДУ в 1С всегда включает оба предела диапазона в результат выборки.

Использование МЕЖДУ особенно удобно в сочетании с параметрами, передаваемыми из формы отчета. Это позволяет избежать громоздких конструкций с множественными условиями И и ИЛИ, когда нужно отфильтровать данные по нескольким временным отрезкам одновременно.

Оператор / Функция Описание действия Включает границы
>= и <= Стандартное сравнение больше/меньше или равно Да, при использовании знаков равенства
МЕЖДУ Проверка вхождения в диапазон Да, всегда включает начало и конец
НАЧАЛОПЕРИОДА Вычисление старта интервала Н/Д (возвращает дату)
КОНЕЦПЕРИОДА Вычисление финиша интервала Н/Д (возвращает дату)
📊 Какой способ сравнения дат вы используете чаще всего?
Ручное сравнение (>= и <=)
Оператор МЕЖДУ
Функции НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА
Смешанный подход

Сравнение только даты без учета времени

Часто возникает ситуация, когда необходимо сравнить даты, игнорируя время суток. Например, нужно найти все документы, проведенные сегодня, независимо от того, в 9:00 или в 18:00 это произошло. Прямое сравнение полей типа ДатаВремя здесь не подойдет, так как значения будут различаться.

Для решения этой задачи используется функция НАЧАЛОДНЯ. Она отсекает временную часть даты, приводя ее к midnight (00:00:00). Сравнивая результаты применения этой функции к полю таблицы и к параметру поиска, можно добиться нужного эффекта.

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

⚠️ Внимание: Применение функций к полям таблицы в условии отбора (например, НАЧАЛОДНЯ(Документ.Дата)) может препятствовать эффективному использованию индексов. Для высоконагруженных систем предпочтительнее рассчитывать диапазон дат в коде перед запросом.

Почему индексы не работают с функциями?

Когда вы применяете функцию к полю таблицы, СУБД должна вычислить значение функции для каждой строки таблицы перед сравнением. Это предотвращает использование B-деревьев индексов для быстрого поиска, вынуждая выполнять полное сканирование таблицы (Full Table Scan).

Типичные ошибки при работе с датами

Одной из самых распространенных ошибок является неучет часовых поясов или разницы в настройках сервера и клиента. Хотя платформа 1С старается нивелировать эти различия, при прямой работе с СУБД или использовании внешних источников данных могут возникать сдвиги во времени, которые ломают логику отборов.

Другая частая проблема — сравнение даты с пустым значением. В 1С пустая дата не равна NULL в понимании SQL, но поведение может отличаться в зависимости от контекста. Для проверки на заполненность лучше использовать оператор ЕСТЬ NULL или функцию ЕСТЬПУСТОТА, а не сравнивать дату с константой.

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

💡

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

Оптимизация производительности запросов с датами

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

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

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

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

Первым шагом проверьте наличие индексов по полям даты в условии ГДЕ. Затем проанализируйте план выполнения: если видите оператор "Table Scan" вместо "Index Seek", попробуйте переписать условие, убрав функции от полей таблицы. Также убедитесь, что тип параметра в запросе строго соответствует типу поля в базе данных.

Как сравнить дату с текущим моментом в запросе?

Используйте функцию СЕГОДНЯ() для получения текущей даты (без времени) или ТЕКУЩАЯДАТА() для получения полной даты и времени. Пример: ГДЕ Документ.Дата < ТЕКУЩАЯДАТА() выберет все документы из прошлого.

Можно ли сравнивать даты разных типов (Дата и ДатаВремя)?

Да, платформа 1С автоматически приводит типы при сравнении. Однако это может привести к неявным потерям точности или неожиданному поведению. Лучше явно приводить типы или использовать поля одного типа в сравнении.

В чем разница между НАЧАЛОДНЯ и НАЧАЛОПЕРИОДА(Дата, День)?

Функционально они идентичны и возвращают начало суток. Однако НАЧАЛОДНЯ является более специализированной и читаемой функцией именно для работы с сутками, тогда как НАЧАЛОПЕРИОДА универсальна для любых интервалов.