Запрос с отбором по реквизиту, который может быть не указан

1. ALBA2009 16 18.08.21 18:26 Сейчас в теме
Мучаюсь с запросом.

"ВЫБРАТЬ
		|	АдрПомещения_ФизЛица.ФизическоеЛицо КАК ФизическоеЛицо,
		|ИЗ
		|	Справочник.АдрПомещения_ФизЛица КАК АдрПомещения_ФизЛица
		|
		|ГДЕ
		|АдрПомещения_ФизЛица.ДатаНачала <= &ДатаЗапросаКонецМесяцаДата
		|И АдрПомещения_ФизЛица.ДатаОкончание >= &ДатаЗапросаНачалоМесяцаДата
		|
		...
Показать



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

Можно ли такое вообще реализовать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Dимыч 18.08.21 19:22 Сейчас в теме
(1)
ГДЕ
ВЫБОР
	КОГДА АдрПомещения_ФизЛица.ДатаНачала = ДАТАВРЕМЯ(1,1,1)
		ТОГДА АдрПомещения_ФизЛица.ДатаНачала <= &ДатаЗапросаКонецМесяцаДата
	ИНАЧЕ ИСТИНА
КОНЕЦ И ВЫБОР
	КОГДА АдрПомещения_ФизЛица.ДатаОкончание = ДАТАВРЕМЯ(1,1,1)
		ТОГДА АдрПомещения_ФизЛица.ДатаОкончание >= &ДатаЗапросаНачалоМесяцаДата
	ИНАЧЕ ИСТИНА
КОНЕЦ
Показать
4. Release 18.08.21 21:33 Сейчас в теме
(3) За использование ВЫБОР в условии отбора жирный минус на собеседовании в тестовом задании.
5. пользователь 18.08.21 22:06
Сообщение было скрыто модератором.
...
6. пользователь 18.08.21 22:08
Сообщение было скрыто модератором.
...
2. Release 18.08.21 18:58 Сейчас в теме
|ГДЕ
|(АдрПомещения_ФизЛица.ДатаНачала <= &ДатаЗапросаКонецМесяцаДата ИЛИ &ДатаЗапросаКонецМесяцаДата = ДАТАВРЕМЯ(1,1,1))
|И (АдрПомещения_ФизЛица.ДатаОкончание >= &ДатаЗапросаНачалоМесяцаДата ИЛИ &ДатаЗапросаНачалоМесяцаДата = ДАТАВРЕМЯ(1,1,1))
7. echo77 1892 19.08.21 07:18 Сейчас в теме
(2) так правильнее? А есть статья где это описано?
11. Release 19.08.21 21:02 Сейчас в теме
8. VmvLer 19.08.21 09:09 Сейчас в теме
(4) это где такая трактовка "ереси"?
9. VmvLer 19.08.21 09:13 Сейчас в теме
(7) вместо ИЛИ я использую в условиях Выбор ...Когда. Уже много раз убеждался, что на больших таблицах - это более эффективно, особенно если разложить ветки КОГДА по приоритету вероятности условий.

А всякие там собеседователи-ретрограды лесом.
daenur1301; +1 Ответить
10. Release 19.08.21 20:15 Сейчас в теме
(9) Лет пять назад меня тут же по этому поводу поправляли. К сожалению, не могу найти и статью о медленной работе CASE по сравнению с "прямым" сравнением, не гуглится что-то.
Но можно почитать эту статью - https://its.1c.ru/db/v8std#content:658:hdoc.
Там нет подтверждения моим словам полностью, но по крайней мере показывает несостоятельность примера предложенного в (3).
12. ALBA2009 16 20.08.21 04:43 Сейчас в теме
Сделал так:

|ГДЕ
	|
	|(АдрПомещения_ФизЛица.ДатаНачала <= &ДатаЗапросаКонецМесяцаДата ИЛИ АдрПомещения_ФизЛица.ДатаНачала = ДАТАВРЕМЯ(1,1,1))
	|И (АдрПомещения_ФизЛица.ДатаОкончание >= &ДатаЗапросаКонецМесяцаДата ИЛИ АдрПомещения_ФизЛица.ДатаОкончание = ДАТАВРЕМЯ(1,1,1))
	|И (АдрПомещения_ФизЛица.ФизическоеЛицо.ДатаСмерти > &ДатаЗапросаКонецМесяцаДата ИЛИ АдрПомещения_ФизЛица.ФизическоеЛицо.ДатаСмерти = ДАТАВРЕМЯ(1,1,1))
13. SlavaKron 20.08.21 09:25 Сейчас в теме
В типовых часто используется динамическая сборка запроса. А если речь про СКД, то условие можно поместить в фигурные скобки, тогда оно будет выполняться, только если параметры заполнены.
14. Release 20.08.21 15:53 Сейчас в теме
(13) Динамической сборки текста запроса нужно, по возможности, избегать. Это затрудняет анализ кода/текста запроса. Когда-то вроде встречал это и в рекомендациях от 1С.

По условиям в СКД поддерживаю.

Если попытаться ещё оптимизировать, то в запросе из (12) можно заменить ДАТАВРЕМЯ(1,1,1) на параметр с пустой датой, чтобы не тратилось время на формирование даты при выполнении самого запроса. (Хотя там должна вроде как срабатывать оптимизация, но один раз, как миниум, datetime будет выполнено.)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот