Отбор в запросе дополнительных реквизитов

1. user654641_yaga_m 12 04.02.21 11:44 Сейчас в теме
Всем ДД, вроде и не "новичок", но столкнулся с такой "проблемой":
Завел в справочнике "ФизЛица" дополнительный реквизит - булево. Первоначально не один реквизит не заполнен, т.е. по логике я считал, что там Ложь! Пытаюсь в запросе выбрать все физлица, у которых этот реквизит Ложь. Но выясняется, что если не установлена Истина, то и в дополнительных реквизитах этого Свойства нет. По мне странная логика - подразумевал, что работает принцип Истина, Ложь, ЕстьNull. ЕстьNull в запросе не помогло. Подскажите чем можно это выбрать?
По теме из базы знаний
Найденные решения
12. comptr 31 04.02.21 14:48 Сейчас в теме
Такой запрос должен сработать:
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
"ВЫБРАТЬ
|	ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
|	Справочник.ФизическиеЛица КАК ФизическиеЛица
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|		ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
|			И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ
|	ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Sashares 34 04.02.21 12:11 Сейчас в теме
(1)
Как уже сказали - левое соединение со справочником физлиц и в отбор добавить условие
Где
ЕстьNull(ЗначениеДопРеквизита, Ложь)  = Ложь
2. andy_zhav 197 04.02.21 11:57 Сейчас в теме
(1) Правильно. Значения дополнительных свойств объектов хранятся в соответствующем справочнике ЗначенияСвойствОбъектов. Чтобы значение там было - его нужно добавить в этот справочник. Даже если это булево со значением ложь. Если вы не добавите его туда, то при левом соединении в запросе значение будет = NULL
3. rule_2 47 04.02.21 12:03 Сейчас в теме
В БСП 3 редакции доп.реквизиты хранятся в ТЧ ДополнительныеРеквизиты самого объекта. В старых версиях БСП они хранятся в регистре сведений ЗначенияСвойствОбъектов. В любом случае поведение системы следующее: если значение не задано (для булева - Ложь), то и хранить эти данные не нужно, видимо, для экономии места.

Если вы хотите получить физ.лиц без реквизита, обращайтесь к самому справочнику, левым соединением цепляйте доп. реквизиты. Ну а потом можно отбор сделать по NULL.
4. andy_zhav 197 04.02.21 12:05 Сейчас в теме
(3) да, возможно. У меня перед глазами только старая версия БСП. но смысл не меняется
6. user654641_yaga_m 12 04.02.21 12:41 Сейчас в теме
Коллеги! Вы не внимательно читали! Во-первых это дополнительные РЕКВИЗИТЫ. Во-вторых я знаю где эти реквизиты находятся. В третьих я написал что конструкция ЕстьNull не срабатывает... Выводит пустую таблицу. В таблице дополнительных реквизитов нет таких строк с "нужным" свойством. Универсальный отчет по физлицам.дополнительные реквизиты с отбором по свойству дает пустой список. Попробуйте сами... Вопрос открыт...)
7. user654641_yaga_m 12 04.02.21 12:45 Сейчас в теме
ВЫБРАТЬ
		|	ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
		|	ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
		|	ФизическиеЛицаДополнительныеРеквизиты.Ссылка КАК ФизичЛицо
		|ИЗ
		|	Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
		|ГДЕ
		|	ФизическиеЛицаДополнительныеРеквизиты.Свойство ЕСТЬ NULL
		|	И ФизическиеЛицаДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ;
Показать


Пустая таблица
8. andy_zhav 197 04.02.21 13:47 Сейчас в теме
(6) попробуйте конструкцию

ВЫБОР КОГДА ЗначениеДополнительногоРеквизита ЕСТЬ NULL Тогда ложь
Иначе
ЗначениеДополнительногоРеквизита
Конец
9. user654641_yaga_m 12 04.02.21 14:06 Сейчас в теме
(8)Не помогло - не видит она реквизит...(
10. soft_wind 04.02.21 14:20 Сейчас в теме
(9)
я вроде программист, но пишу такую фигню...

"ВЫБРАТЬ
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| ФизическиеЛицаДополнительныеРеквизиты.Ссылка КАК ФизичЛицо
|ИЗ
| Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Свойство ЕСТЬ NULL
| И ФизическиеЛицаДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ";

Пустая таблица
Показать


а попробуйте так
"ВЫБРАТЬ
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| Спр.Ссылка КАК ФизичЛицо
|ИЗ
| Справочник.ФизическиеЛица КАК Спр
|левое соединение
| Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|по Спр.Ссылка = ФизическиеЛицаДополнительныеРеквизиты.Ссылка
|и ФизическиеЛицаДополнительныеРеквизиты.Свойство.Наименование = ""ИмяВашегоСвойства"" //или параметром задать
|ГДЕ
| не спр.ПометкаУдаления
|и ЕстьNull(ФизическиеЛицаДополнительныеРеквизиты.Значение,Ложь) = Ложь";

Показать
11. comptr 31 04.02.21 14:39 Сейчас в теме
Во-первых, как уже говорили, БСП не хранит значение доп. реквизита, если оно равно пустому значению типа этого реквизита. Т.е. для Число это будет 0, для Строка - пустая строка, для Булево - Ложь и т.д. При этом, если сначала значение было заполнено и хранилось в ТЧ, то после его обнуления соответствующая строка удаляется из ТЧ.

Во-вторых, совершена распространенная ошибка в работе с запросами: если делается левое соединение второй таблицы к первой, то нельзя просто вешать условие на вторую таблицу (ВтораяТаблица.Поле = Ложь), без ЕСТЬNULL() или ЕСТЬ NULL, т.к. если записей во второй таблице не будет, то любое поле из второй таблицы будет NULL, а любое сравнение с NULL будет Ложь

В итоге запрос из (7) и (10) не будет работать: в ТЧ нет строк с вашим свойством, если значение свойства - Ложь.

Посмотрите, как происходит создание элементов формы для отображения доп. реквизитов: сначала происходит получение набора свойств, связанных с этим объектом, а потом уже из ТЧ ДополнительныеРеквизиты берутся значения свойств.
12. comptr 31 04.02.21 14:48 Сейчас в теме
Такой запрос должен сработать:
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
"ВЫБРАТЬ
|	ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
|	Справочник.ФизическиеЛица КАК ФизическиеЛица
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|		ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
|			И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ
|	ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
Показать
15. user654641_yaga_m 12 04.02.21 22:16 Сейчас в теме
(12)
"ВЫБРАТЬ

|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
| И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ| ФизическиеЛица.Ссылка КАК Ссылка
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"


Спс.
У меня получилась такая конструкция:
СвойствоРеквизита = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита (Физические лица)",,);
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Свойство", СвойствоРеквизита);
	Запрос.Текст =
	    "ВЫБРАТЬ
	    |	ФизическиеЛица.Ссылка КАК Ссылка,
	    |	ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
	    |	ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение
	    |ИЗ
	    |	Справочник.ФизическиеЛица КАК ФизическиеЛица
	    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
	    |		ПО (ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка)
	    |			И (ФизическиеЛицаДополнительныеРеквизиты.Свойство = &Свойство)
	    |ГДЕ
	    |	ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL";
Показать

Запрос вывел мне все элементы справочника, у которых в нужном реквизите Ложь. Спасибо всем за обсуждение темы...
16. rule_2 47 05.02.21 04:15 Сейчас в теме
(15) Собственно, я это и имел в виду в (3) , просто запрос не писал =)
13. comptr 31 04.02.21 14:51 Сейчас в теме
А запрос в (10) не будет работать, т.к. условие ФизическиеЛицаДополнительныеРеквизиты.Свойство.Наименование = ""ИмяВашегоСвойства"" будет всегда Ложь, т.к. левая часть всегда будет NULL для нужных нам записей.
14. soft_wind 04.02.21 14:55 Сейчас в теме
(13) хм, ну-ну, еще один опытный программист...
а вы попробуйте эту команду

и ФизическиеЛицаДополнительныеРеквизиты.Свойство.Наименование = ""ИмяВашегоСвойства"" //или параметром задать
17. comptr 31 05.02.21 09:46 Сейчас в теме
(14) да, перемудрил я что-то, этот запрос будет работать.
18. user654641_yaga_m 12 05.02.21 13:38 Сейчас в теме
ДД, вдогонку коллегам с "пытливом" умом добавление:
при дальнейшем использовании запроса увидел "интересное поведение" табличной части "ДополнительныеРеквизиты". Используя перебор списка таблицы со Значением = Истина такой конструкцией:

Для каждого Строчка Из Списка Цикл
	Покупатель = Строчка.Ссылка.ПолучитьОбъект();
	СтрДопТабл = Покупатель.ДополнительныеРеквизиты;
	СтрДопТабл[0].Значение = Ложь;
	Покупатель.Записать();
КонецЦикла

получил таблицу ДополнительныеРеквизиты со строкой Свойство (имя свойство) и Значение равно Ложь, т.е. строка осталось и с ней можно работать "обычными" запросами. Для того чтобы использовать "типовое" поведение - нужна конструкция:

Для каждого Строчка Из Люди Цикл
	Покупатель = Строчка.Ссылка.ПолучитьОбъект();
	СтрДопТабл = Покупатель.ДополнительныеРеквизиты;
	СтрДопТабл.Удалить(0);
	Покупатель.Записать();
КонецЦикла
19. SlavaKron 05.02.21 14:11 Сейчас в теме
(18) Вы какие-то неправильные выводы сделали. "Типовая" логика работы не предполагает удаление дополнительного реквизита, если ему нужно установить Ложь.
20. user654641_yaga_m 12 05.02.21 14:42 Сейчас в теме
(19)Вы не уловили...Если Вы программно установите реквизит из Истины в Ложь, то строка остается. А если Вы "пальцами" в карточке физлица установите Ложь, то строка у этого физлица пропадет, т.е. отработает "типовая" логика. Пробуйте и обрящите...
Оставьте свое сообщение

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