При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача отбора документов, которые хронологически расположены в интервале между двумя выбранными пользователем документами одного вида. На первый взгляд кажется, что достаточно использовать стандартное поле Дата, однако на практике такой подход приводит к ошибкам.
Разберем, почему простой фильтр по дате не подходит и как правильно организовать выборку с использованием МоментВремени.
Поле Дата в объектах 1С имеет точность до одной секунды. В высоконагруженных системах или при групповой обработке данных в одну и ту же секунду может быть создано множество документов. Если мы ограничимся только условием Дата >= &НачалоДата И Дата <= &КонецДата, мы получим неполную или неверную выборку, так как система не сможет гарантировать строгий хронологический порядок внутри одной секунды.
Наиболее надежным способом соблюсти хронологию является использование метода МоментВремени(). Этот метод возвращает объект, который содержит в себе не только дату и время, но и ссылку на сам документ, что позволяет однозначно определить его позицию в базе данных относительно других объектов.
Рассмотрим пошагово, как реализовать такой запрос:
МоментВремени для обоих документов.МЕЖДУ в тексте запроса для фильтрации поля МоментВремени.Пример программной реализации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокШапка.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК ДокШапка
|ГДЕ
| ДокШапка.МоментВремени МЕЖДУ &МоментВремени1 И &МоментВремени2";
Запрос.УстановитьПараметр("МоментВремени1", Док1.МоментВремени());
Запрос.УстановитьПараметр("МоментВремени2", Док2.МоментВремени());
Результат = Запрос.Выполнить();
Важно помнить, что оператор МЕЖДУ является включительным — он захватывает документы, которые совпадают с границами Док1 и Док2. Если бизнес-логика вашей задачи требует исключить сами граничные документы из выборки, используйте строгое сравнение:
|ГДЕ
| ДокШапка.МоментВремени > &МоментВремени1
| И ДокШапка.МоментВремени < &МоментВремени2
Если вам требуется более гибкое управление тем, включать или исключать границы в зависимости от условий (например, программно менять ВидГраницы.Включая или ВидГраницы.Исключая), вы можете использовать объект Граница. Платформа 1С корректно интерпретирует объект Граница при передаче его в параметр запроса.
Использование МоментВремени позволяет системе эффективно использовать индексы базы данных, что обеспечивает высокую производительность даже при больших объемах документов в системе. Помните, что данный подход работает идеально, когда все документы в запросе принадлежат к одному типу.
Совет: Всегда проверяйте, что тип данных параметров, передаваемых в запрос, соответствует типу поля в базе данных. Для документов МоментВремени является стандартом де-факто при работе с хронологическими последовательностями.