Как лучше поставить условие в запросе???

1. Airat116 12.05.20 17:08 Сейчас в теме
Здравствуйте, помогите пожалуйста, как лучше поставить условие в запросе

Надо поставить условие по "ФизЛицу" и по "Подразделению"


ВЫБРАТЬ
	ХозрасчетныйОстаткиМЦ.Субконто1 КАК Номенклатура,
	ХозрасчетныйОстаткиМЦ.Субконто2 КАК ПартияМатериаловВЭксплуатации,
	ХозрасчетныйОстаткиМЦ.Субконто3 КАК Физлицо,
	ХозрасчетныйОстаткиМЦ.КоличествоОстатокДт КАК Количество
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(
			&Период,
			Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации),
			,
			Организация = &Организация
				И (Подразделение = &Подразделение
					ИЛИ Подразделение ЕСТЬ NULL)
				И Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию) КАК ХозрасчетныйОстаткиМЦ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ХозрасчетныйОстаткиМЦ.Субконто1,
	ХозрасчетныйОстаткиМЦ.Субконто2,
	ХозрасчетныйОстаткиМЦ.Субконто3,
	ХозрасчетныйОстаткиМЦ.КоличествоОстатокДт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(
			&Период,
			Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации),
			,
			Организация = &Организация
				И (Подразделение = &Подразделение
					ИЛИ Подразделение ЕСТЬ NULL)
				И Субконто2 ССЫЛКА Документ.ПартияМатериаловВЭксплуатации) КАК ХозрасчетныйОстаткиМЦ

УПОРЯДОЧИТЬ ПО
	Номенклатура
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 12.05.20 17:24 Сейчас в теме
(1)Вместо Подразделение ЕСТЬ NULL сделайте Подразделение = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
3. Arabo_xv 5 12.05.20 18:10 Сейчас в теме
Я слегка запутался.
А зачем вам объеденение двух одинаковых наборов данных? И в первом наборе и во втором одинаковый отбор по остатку регистра бухгалтерии хозрасчетный.
4. Airat116 12.05.20 18:34 Сейчас в теме
(3) Это типовой запрос, я не знаю зачем они так сделали

Мне пока условие только нужно поставить дополнительное к нему
6. nomad_irk 76 12.05.20 19:49 Сейчас в теме
(3)Не одинаковый. В первом запросе - по одному виду документа, во втором - по другому.
7. Arabo_xv 5 12.05.20 19:53 Сейчас в теме
(6)

И (Субконто2 ССЫЛКА Документ.ПартияМатериаловВЭксплуатации 
ИЛИ Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию)


Так за один проход получить можно все данные без необходимости делать объединение.
Fox-trot; +1 Ответить
8. nomad_irk 76 12.05.20 19:54 Сейчас в теме
(7)С точки зрения оптимизатора запроса - это плохо.
EVKash; ipoloskov; +2 Ответить
9. Arabo_xv 5 12.05.20 20:03 Сейчас в теме
(8)
(7)С точки зрения оптимизатора запроса - это плохо.


Проблеммы с ИЛИ бывают если при отборе можно было использовать точный индекс и при этом отбор уменьшает существенно возвращаемые данные.
Тут же стоит отбор по счету сначала.
И вместо того чтобы
Отобрать по счету -> Потом отобрать 40% по типу документа 1
Отобрать по счету -> Потом отобрать 55% по типу документа 2
будет
Отобрать по счету -> Потом отобрать 95% по типу документа 1 и типу документа 2
10. nomad_irk 76 12.05.20 20:15 Сейчас в теме
(9)Дело в том, что таблица хранения значений субконто одна на ВООБЩЕ все значения субконто.
И откуда информация о том, что сперва происходит отбор по Счету, а уже потом по значениям субконто?
Значения субконто отбираются по регистратору, внутренним соединением, по всей видимости.
11. Arabo_xv 5 12.05.20 20:34 Сейчас в теме
(10)

И откуда информация о том, что сперва происходит отбор по Счету, а уже потом по значениям субконто?


Просто поробуйте посмотреть на план запроса когда есть отбор по счету для остатков.

Значения субконто отбираются по регистратору, внутренним соединением, по всей видимости.


Там регистратор где? В обоих случаях отбор по типу субконто и регистратор тут не причем.
5. Fox-trot 158 12.05.20 18:34 Сейчас в теме
поддерживаю
нада просто заменить условие
Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию ИЛИ Субконто2 ССЫЛКА Документ.ПартияМатериаловВЭксплуатации
12. Airat116 13.05.20 08:32 Сейчас в теме
У меня задача такая: Я добавил новую кнопку "Заполнить" в документе "Списание материалов из эксплуатации"
И добавил в шапке документа реквизит "ФизЛицо"

Теперь мне нужно сделать так чтоб если они выбрали ФизЛицо "Иванов" то табл часть заполнялась только Ивановым
13. EVKash 14 13.05.20 09:29 Сейчас в теме
(12) правильное замечание было в 2
и допишите условие по физлицу
И Субконто3 = &ФизЛицо
ну и параметры установить естественно.
14. Airat116 13.05.20 09:41 Сейчас в теме
15. Airat116 13.05.20 09:42 Сейчас в теме
(13) А можно еще как то по подразделению сделать отбор?

Например в шапке я выбрал "Подразделение1" то в табл части должны заполняться только по "Подразделение1"?
17. Airat116 13.05.20 10:41 Сейчас в теме
(13) Сделал так (Вместо Подразделение ЕСТЬ NULL сделайте Подразделение = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка))

Запрос становиться пустым после этого действия
18. nomad_irk 76 13.05.20 10:52 Сейчас в теме
(17)В таком случае, у вас не включен учет по подразделениям на счете ПланСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации и не понятно, каким образом вы собираетесь вообще выполнять отбор по подразделению.
21. Airat116 13.05.20 11:01 Сейчас в теме
(18) Вот что в плане счетов
Прикрепленные файлы:
22. nomad_irk 76 13.05.20 11:04 Сейчас в теме
(21)Учет материалов в эксплуатации по подразделениям, вероятно, регулируется в учетной политике/функциональности.
16. user1357043 13.05.20 10:05 Сейчас в теме
Если это делается в форме, то запрос можно как угодно изменить. Например, сделать так:
ВЫБРАТЬ
    ХозрасчетныйОстаткиМЦ.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиМЦ.Субконто2 КАК ПартияМатериаловВЭксплуатации,
    ХозрасчетныйОстаткиМЦ.Субконто3 КАК Физлицо,
    ХозрасчетныйОстаткиМЦ.КоличествоОстатокДт КАК Количество
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &Период,
            Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации),
            ,
            Организация = &Организация
               И Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию
               И {ПроизвольноеУсловие}
                 ) КАК ХозрасчетныйОстаткиМЦ
Показать

А потом в коде через СтрЗаменить() менять в тексте запроса {ПроизвольноеУсловие} на что угодно в зависимости от того, заполнены данные или нет.
19. Airat116 13.05.20 10:57 Сейчас в теме
(16) Что то не до конца я понимаю(

Например: Организация = &Организация
И Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию
И {ПроизвольноеУсловие}
) КАК ХозрасчетныйОстаткиМЦ


Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПроизвольноеУсловие", "Субконто3= &ФизЛицо");
Запрос.УстановитьПараметр("ФизЛицо", Объект.ФизЛицо);

Примерно так должно быть?
20. nomad_irk 76 13.05.20 11:01 Сейчас в теме
(19)Примерно так, но если сделать именно так, то такой запрос не откроется с помощью конструктора запроса.

Произвольное условие нужно писать без всяких И, т.е.

Организация = &Организация
И Субконто2 ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию

{ПроизвольноеУсловие}
) КАК ХозрасчетныйОстаткиМЦ
24. user1357043 13.05.20 11:07 Сейчас в теме
(20)Согласен. быстро писал.
Но даже без "И" конструктор вроде не открывается. или открывается, но этот параметр пропадает.
А если его написать не в фигурных скобках, а как-то по другому, то у конструктора опять же могут возникнуть проблемы
25. nomad_irk 76 13.05.20 11:10 Сейчас в теме
(24)Лично я всегда такого рода "условия" пишу с //
Понятно, что эта строка пропадет, если отредактировать запрос через конструктор, поэтому сохраняем их рядом в тексте перед редактированием и вставляем после.
23. user1357043 13.05.20 11:05 Сейчас в теме
(19)Так:
Запрос.Текст = СтрЗаменить(Запрос.Текст, "{ПроизвольноеУсловие}", "Субконто3= &ФизЛицо");

Фигурные скобки нужны.
ну и как сказали в (20), лучше "И" убрать. Тогда так:
Запрос.Текст = СтрЗаменить(Запрос.Текст, "{ПроизвольноеУсловие}", " И Субконто3= &ФизЛицо");

или так:
Запрос.Текст = СтрЗаменить(Запрос.Текст, "{ПроизвольноеУсловие}", " И Субконто3= &ФизЛицо И Подразделение=&Подразделение");

ну и тд. в общем, что угодно.
Ну и условие можно предварительно в отдельной переменной формировать в зависимости от заполненных полей.
Если оставлять "И {ПроизвольноеУсловие}", то в случае отствия условий пишем
Запрос.Текст = СтрЗаменить(Запрос.Текст, "{ПроизвольноеУсловие}", "ИСТИНА");
Оставьте свое сообщение

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