Почему запрос в 1С 7.7 не выбирает документы за все даты и как правильно задать условие по периоду?

Программист 1С v7.7
← На главную

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

Анализ исходной проблемы

Рассмотрим ситуацию: программист пишет запрос для выборки документов ВыпускГотовойПрод. В тексте запроса используется конструкция Условие (ДатаДок > '31.08.2021'). Логика подсказывает, что система должна выдать все документы, начиная с 1 сентября 2021 года и до конца времен. Однако на практике запрос возвращает данные только за 01.09.2021, полностью игнорируя последующие дни, хотя документов в базе предостаточно.

Посмотрим на исходный код запроса, который вызвал затруднение:


//{{ЗАПРОС(Сформировать2)
|Док = Документ.ВыпускГотовойПрод.ТекущийДокумент;
|ДатаДок = Документ.ВыпускГотовойПрод.ДатаДок;
|Группировка Док;
|Группировка ДатаДок;
|Условие (ДатаДок > '31.08.2021');
|"//}}ЗАПРОС

Почему же так происходит? Выясним причину, скрытую в архитектуре "Черного ящика" (так часто называют механизм запросов в 7.7).

Разница между директивой Период и фильтром Условие

Первое и самое важное, что нам необходимо понять: в 1С 7.7 директива Период и фильтр Условие — это принципиально разные механизмы.

1. Директива Период: Это первичный фильтр. Когда мы указываем Период с ... по ..., система на самом низком уровне (на уровне SQL-запроса или позиционирования в DBF-файлах) ограничивает область поиска документов. Это "входные ворота" для данных.

2. Фильтр Условие: Это вторичная обработка. Когда мы используем Условие (ДатаДок > '31.08.2021'), система сначала берет данные за некий период по умолчанию, а уже потом начинает "просеивать" их через ваше условие. Если данные за 5 или 10 сентября изначально не попали в первичную выборку по периоду, то фильтр Условие их просто не увидит, так как ему нечего будет обрабатывать.

Разберем подробнее, что такое "период по умолчанию". Если в запросе 1С 7.7 явно не указана директива Период, система может ограничить выборку:

Именно поэтому в нашем примере запрос ограничился только началом сентября. Система посчитала, что период выборки закончен, и не пошла дальше.

Решение проблемы: Явное указание периода

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


//{{ЗАПРОС(Сформировать2)
|Период с '31.08.2021' по '30.09.2021';
|Док = Документ.ВыпускГотовойПрод.ТекущийДокумент;
|Группировка Док;
|"//}}ЗАПРОС

Обратите внимание на несколько ключевых моментов:

  1. Мы добавили строку Период с ... по .... Это гарантирует, что система принудительно расширит область поиска данных до указанной конечной даты.
  2. Если мы не знаем точную дату окончания (нужно выбрать "по сегодня"), можно использовать переменную или опустить конечную дату, но лучше всегда указывать границы явно, чтобы избежать влияния "Точки актуальности" (ТА).
  3. Использование конструкции Период с '05.09.2021' без указания "по" может привести к ошибке "Неверный диапазон дат", если рабочая дата в системе меньше, чем дата начала. Поэтому синтаксис с по является наиболее надежным.

Оптимизация группировок

Проанализируем еще одну важную деталь в исходном коде автора. Посмотрим на структуру группировок:


|Группировка Док;
|Группировка ДатаДок;

Такая последовательность является избыточной и нелогичной с точки зрения производительности. Проанализируем ситуацию: объект Док (ТекущийДокумент) является уникальным. У одного конкретного документа может быть только одна дата. Группировать сначала по уникальному документу, а потом внутри него по дате — бессмысленно, так как в подчиненной группировке всегда будет только одна строка.

Как сделать правильно:

Влияние Точки Актуальности (ТА)

Существует мнение, что для запросов по документам точка актуальности не важна, так как это не регистры. Однако это не совсем так. В 1С 7.7 существует параметр "Конец рассчитанного периода". Если вы пытаетесь выбрать документы будущим числом относительно этого периода или ТА, стандартный механизм запроса без явного указания Период по... может их проигнорировать. Явное указание конечной даты в периоде принудительно заставляет движок запроса заглянуть за границы текущих расчетов.

Итоговые рекомендации

Для создания надежных и быстрых запросов в 1С 7.7 придерживайтесь следующих правил:

Соблюдение этих правил позволит вам избежать большинства "загадочных" проблем с выборкой данных в среде 1С 7.7 и обеспечит корректную работу ваших отчетов вне зависимости от рабочих настроек системы у пользователя.

← На главную