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