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

Механизм отбора по дате в языке запросов 1С имеет свои особенности, которые зависят от типа используемого поля и способа задания параметра. Платформа позволяет гибко управлять интервалами времени, используя как стандартные средства конструктора, так и прямое написание кода запроса. Понимание логики работы с типами данных Дата и Период необходимо для создания эффективных выборок.

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

Использование конструктора запросов и СКД

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

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

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

  • 📅 Используйте тип параметра «Период» для быстрого выбора диапазона «С» и «По».
  • 🔍 Проверяйте, включена ли дата начала и конца в выборку (операторы >= и <=).
  • ⚙️ В СКД настройте вариант отбора через панель «Настройки» -> «Отборы».
💡

Если вы работаете в СКД, используйте предопределенные поля периода, такие как «ПериодРегистрации», чтобы избежать путаницы с датами документов и датами проведения.

Особое внимание стоит уделить тому, как система интерпретирует время при выборе только даты в интерфейсе. По умолчанию, если вы выбираете конкретный день, система может подразумевать начало суток (00:00:00) или конец (23:59:59), в зависимости от оператора. Неправильная трактовка может привести к тому, что документы, проведенные в последний момент дня, не попадут в отчет.

Синтаксис отбора в языке запросов 1С

При написании запроса вручную разработчик должен четко соблюдать синтаксические правила платформы. Для отбора по дате используются стандартные операторы сравнения: =, <>, >, <, >=, <=. Ключевым моментом является правильное указание literals (литералов) даты в тексте запроса.

Литерал даты в запросе 1С записывается в фигурных скобках и имеет строгий формат. Например, {d'2023-10-25'} обозначает конкретную дату. Если необходимо указать время, оно добавляется через пробел после даты. Платформа автоматически преобразует строковое представление в внутренний тип данных при выполнении запроса.

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Документ.Дата >= &НачалоПериода

И Документ.Дата <= &КонецПериода

Использование параметров (начинающихся с амперсанда &) является лучшей практикой, так как это защищает от SQL-инъекций и позволяет переиспользовать текст запроса с разными значениями. Значения параметров передаются в объект запроса через метод УстановитьПараметр перед выполнением.

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

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

📊 Как вы чаще всего задаете дату в запросе?
Через конструктор
Пишу код вручную
Использую готовые сниппеты
Копирую из старых отчетов

Работа с временной частью даты

Тип данных Дата в 1С всегда содержит и дату, и время. Это часто становится источником проблем при фильтрации. Если вы отбираете документы за конкретный день, используя условие равенства Дата = {d'2023-10-25'}, вы получите только те записи, у которых время равно 00:00:00. Все остальные документы, проведенные в течение дня, будут отсеяны.

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

Оператор Пример условия Результат выборки
= Дата = {d'2023-10-25'} Только документы с временем 00:00:00
>=.. <= Дата >= {d'2023-10-25'} И Дата <= {d'2023-10-25 23:59:59'} Все документы за 25 октября
Между Дата МЕЖДУ &Начало И &Конец Аналогично диапазону с включением границ

Функция КОНЕЦДНЯ особенно полезна, так как она автоматически рассчитывает последнюю возможную временную метку для указанной даты с точностью до секунды, принятой в конфигурации. Это избавляет разработчика от необходимости вручную прописывать 23:59:59.

Если требуется отбор по конкретному часу или минуте, можно использовать функции ЧАС, МИНУТА, СЕКУНДА. Однако применение этих функций в части ГДЕ запроса обычно отключает использование индексов по полю даты, что замедляет выполнение выборки на больших объемах данных.

Почему не стоит использовать функции в условии ГДЕ?

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

Отбор по текущей дате и динамические периоды

Часто возникает задача сформировать отчет или выборку относительно текущего момента времени: «документы за сегодня», «просроченные задачи», «активные договоры». Для этого в языке запросов 1С предусмотрены специальные функции, возвращающие текущую дату и время сеанса или системы.

Функция ТЕКУЩАЯДАТА возвращает дату и время на момент выполнения запроса. Используя её в комбинации с функциями усечения времени, можно легко сформировать динамические отборы. Например, для получения всех документов, созданных сегодня, условие будет выглядеть как диапазон от начала текущего дня до текущего момента или конца дня.

⚠️ Внимание: Функция ТЕКУЩАЯДАТА зависит от времени сервера 1С, а не от времени на компьютере пользователя. Убедитесь, что серверное время синхронизировано корректно, иначе отчеты могут показывать данные «из будущего» или «из прошлого».

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

// Пример отбора документов за текущий месяц

ВЫБРАТЬ

Регистр.Период,

Регистр.Ресурс

ИЗ

РегистрНакопления.Остатки КАК Регистр

ГДЕ

Регистр.Период >= НАЧАЛОПЕРИОДА(ТЕКУЩАЯДАТА, МЕСЯЦ)

И Регистр.Период <= КОНЕЦПЕРИОДА(ТЕКУЩАЯДАТА, МЕСЯЦ)

При использовании динамических дат в параметрах отчетов пользователю часто предлагают выбрать «Скользящий период». В коде это реализуется передачей в запрос не конкретных дат, а количества дней или месяцев для сдвига относительно ТЕКУЩАЯДАТА. Логика вычисления границ при этом переносится в код модуля объекта или в СКД.

💡

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

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

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

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

  • 🚀 Используйте составные индексы, если отбор идет одновременно по дате и другому полю (например, Контрагент).
  • 🛑 Избегайте конструкций вида ГОД(Дата) = 2023 в больших выборках.
  • 📉 Проверяйте план выполнения запроса через консоль отладки или SQL-профилировщик.

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

Также стоит учитывать тип СУБД. В файловом варианте 1С оптимизация работает несколько иначе, чем в клиент-серверном варианте (MS SQL, PostgreSQL). В SQL-серверах статистика распределения данных играет важную роль: если вы отбираете очень широкий период, сервер может решить, что быстрее прочитать таблицу целиком, чем использовать индекс.

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

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

Типичные ошибки и способы их решения

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

Еще одна частая ошибка связана с «плавающей» датой. Если пользователь вводит дату вручную в поле ввода, система может интерпретировать её по-разному в зависимости от локали. В коде всегда лучше приводить дату к единому стандарту перед передачей в запрос. Также проблема может возникать при работе с регистрами сведений, где период может быть бесконечным.

⚠️ Внимание: При отборе по регистрам сведений с периодичностью «В пределах дня» или «В пределах секунды» убедитесь, что вы учитываете время. Отбор только по дате без времени может вернуть несколько записей или ни одной, если время не совпадает точно.

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

Для отладки сложных запросов с датами используйте метод ПолучитьТекстЗапроса объекта запроса. Он покажет итоговый текст запроса с подставленными значениями параметров, что поможет увидеть, как именно 1С интерпретирует ваши условия перед отправкой в СУБД.

Почему запрос не видит документы, проведенные сегодня?

Скорее всего, используется условие равенства конкретной дате без учета времени, либо верхняя граница периода установлена на начало дня, а не на конец. Проверьте, используется ли функция КОНЕЦДНЯ или явное указание времени 23:59:59.

Как отобрать данные за последний финансовый год?

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

Влияет ли часовой пояс на отбор по дате?

Да, влияет. В клиент-серверном варианте дата может храниться в UTC, а отображаться в локальном времени пользователя. При сравнении дат убедитесь, что сравниваются значения в одном часовом поясе, либо используйте серверное время для отборов.

Можно ли использовать переменные в тексте запроса?

Нет, в тексте запроса используются только параметры (с амперсандом). Переменные языка 1С должны быть предварительно установлены в параметры объекта запроса перед его выполнением.

Что делать, если отбор по дате работает медленно?

Проверьте наличие индекса по полю даты. Убедитесь, что над полем не выполняются функции в условии ГДЕ. Попробуйте сузить период отбора или оптимизировать структуру запроса, убрав лишние соединения.