Как в запросе выбрать документы за период между двумя конкретными документами?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем, почему простой фильтр по дате не подходит и как правильно организовать выборку с использованием МоментВремени.

Почему фильтр по дате неэффективен

Поле Дата в объектах 1С имеет точность до одной секунды. В высоконагруженных системах или при групповой обработке данных в одну и ту же секунду может быть создано множество документов. Если мы ограничимся только условием Дата >= &НачалоДата И Дата <= &КонецДата, мы получим неполную или неверную выборку, так как система не сможет гарантировать строгий хронологический порядок внутри одной секунды.

Решение с использованием МоментВремени

Наиболее надежным способом соблюсти хронологию является использование метода МоментВремени(). Этот метод возвращает объект, который содержит в себе не только дату и время, но и ссылку на сам документ, что позволяет однозначно определить его позицию в базе данных относительно других объектов.

Рассмотрим пошагово, как реализовать такой запрос:

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

Пример программной реализации:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДокШапка.Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК ДокШапка
    |ГДЕ
    |	ДокШапка.МоментВремени МЕЖДУ &МоментВремени1 И &МоментВремени2";

Запрос.УстановитьПараметр("МоментВремени1", Док1.МоментВремени());
Запрос.УстановитьПараметр("МоментВремени2", Док2.МоментВремени());

Результат = Запрос.Выполнить();

Нюансы работы с границами интервала

Важно помнить, что оператор МЕЖДУ является включительным — он захватывает документы, которые совпадают с границами Док1 и Док2. Если бизнес-логика вашей задачи требует исключить сами граничные документы из выборки, используйте строгое сравнение:


|ГДЕ
|	ДокШапка.МоментВремени > &МоментВремени1 
|	И ДокШапка.МоментВремени < &МоментВремени2

Когда стоит использовать объект Граница

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

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

Совет: Всегда проверяйте, что тип данных параметров, передаваемых в запрос, соответствует типу поля в базе данных. Для документов МоментВремени является стандартом де-факто при работе с хронологическими последовательностями.

← На главную