Отбор в запросе дополнительных реквизитов
Всем ДД, вроде и не "новичок", но столкнулся с такой "проблемой":
Завел в справочнике "ФизЛица" дополнительный реквизит - булево. Первоначально не один реквизит не заполнен, т.е. по логике я считал, что там Ложь! Пытаюсь в запросе выбрать все физлица, у которых этот реквизит Ложь. Но выясняется, что если не установлена Истина, то и в дополнительных реквизитах этого Свойства нет. По мне странная логика - подразумевал, что работает принцип Истина, Ложь, ЕстьNull. ЕстьNull в запросе не помогло. Подскажите чем можно это выбрать?
Завел в справочнике "ФизЛица" дополнительный реквизит - булево. Первоначально не один реквизит не заполнен, т.е. по логике я считал, что там Ложь! Пытаюсь в запросе выбрать все физлица, у которых этот реквизит Ложь. Но выясняется, что если не установлена Истина, то и в дополнительных реквизитах этого Свойства нет. По мне странная логика - подразумевал, что работает принцип Истина, Ложь, ЕстьNull. ЕстьNull в запросе не помогло. Подскажите чем можно это выбрать?
По теме из базы знаний
- Создание множественного дополнительного реквизита. Управление торговлей 11
- Доработка функционала отправки дополнительных реквизитов 1С: ЭДО для Татнефть
- Множественные дополнительные реквизиты в УТ 11.5 (11.4)
- Использование дополнительных реквизитов и сведений в отчетах
- 1С:БСП Дополнительные реквизиты и сведения
Найденные решения
Такой запрос должен сработать:
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
"ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
| И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Правильно. Значения дополнительных свойств объектов хранятся в соответствующем справочнике ЗначенияСвойствОбъектов. Чтобы значение там было - его нужно добавить в этот справочник. Даже если это булево со значением ложь. Если вы не добавите его туда, то при левом соединении в запросе значение будет = NULL
В БСП 3 редакции доп.реквизиты хранятся в ТЧ ДополнительныеРеквизиты самого объекта. В старых версиях БСП они хранятся в регистре сведений ЗначенияСвойствОбъектов. В любом случае поведение системы следующее: если значение не задано (для булева - Ложь), то и хранить эти данные не нужно, видимо, для экономии места.
Если вы хотите получить физ.лиц без реквизита, обращайтесь к самому справочнику, левым соединением цепляйте доп. реквизиты. Ну а потом можно отбор сделать по NULL.
Если вы хотите получить физ.лиц без реквизита, обращайтесь к самому справочнику, левым соединением цепляйте доп. реквизиты. Ну а потом можно отбор сделать по NULL.
Коллеги! Вы не внимательно читали! Во-первых это дополнительные РЕКВИЗИТЫ. Во-вторых я знаю где эти реквизиты находятся. В третьих я написал что конструкция ЕстьNull не срабатывает... Выводит пустую таблицу. В таблице дополнительных реквизитов нет таких строк с "нужным" свойством. Универсальный отчет по физлицам.дополнительные реквизиты с отбором по свойству дает пустой список. Попробуйте сами... Вопрос открыт...)
ВЫБРАТЬ
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| ФизическиеЛицаДополнительныеРеквизиты.Ссылка КАК ФизичЛицо
|ИЗ
| Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Свойство ЕСТЬ NULL
| И ФизическиеЛицаДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ;
ПоказатьПустая таблица
(9)
а попробуйте так
я вроде программист, но пишу такую фигню...
"ВЫБРАТЬ
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| ФизическиеЛицаДополнительныеРеквизиты.Ссылка КАК ФизичЛицо
|ИЗ
| Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Свойство ЕСТЬ NULL
| И ФизическиеЛицаДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ";
Пустая таблица
Показатьа попробуйте так
"ВЫБРАТЬ
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| Спр.Ссылка КАК ФизичЛицо
|ИЗ
| Справочник.ФизическиеЛица КАК Спр
|левое соединение
| Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
|по Спр.Ссылка = ФизическиеЛицаДополнительныеРеквизиты.Ссылка
|и ФизическиеЛицаДополнительныеРеквизиты.Свойство.Наименование = ""ИмяВашегоСвойства"" //или параметром задать
|ГДЕ
| не спр.ПометкаУдаления
|и ЕстьNull(ФизическиеЛицаДополнительныеРеквизиты.Значение,Ложь) = Ложь";
Показать
Во-первых, как уже говорили, БСП не хранит значение доп. реквизита, если оно равно пустому значению типа этого реквизита. Т.е. для Число это будет 0, для Строка - пустая строка, для Булево - Ложь и т.д. При этом, если сначала значение было заполнено и хранилось в ТЧ, то после его обнуления соответствующая строка удаляется из ТЧ.
Во-вторых, совершена распространенная ошибка в работе с запросами: если делается левое соединение второй таблицы к первой, то нельзя просто вешать условие на вторую таблицу (ВтораяТаблица.Поле = Ложь), без ЕСТЬNULL() или ЕСТЬ NULL, т.к. если записей во второй таблице не будет, то любое поле из второй таблицы будет NULL, а любое сравнение с NULL будет Ложь
В итоге запрос из (7) и (10) не будет работать: в ТЧ нет строк с вашим свойством, если значение свойства - Ложь.
Посмотрите, как происходит создание элементов формы для отображения доп. реквизитов: сначала происходит получение набора свойств, связанных с этим объектом, а потом уже из ТЧ ДополнительныеРеквизиты берутся значения свойств.
Во-вторых, совершена распространенная ошибка в работе с запросами: если делается левое соединение второй таблицы к первой, то нельзя просто вешать условие на вторую таблицу (ВтораяТаблица.Поле = Ложь), без ЕСТЬNULL() или ЕСТЬ NULL, т.к. если записей во второй таблице не будет, то любое поле из второй таблицы будет NULL, а любое сравнение с NULL будет Ложь
В итоге запрос из (7) и (10) не будет работать: в ТЧ нет строк с вашим свойством, если значение свойства - Ложь.
Посмотрите, как происходит создание элементов формы для отображения доп. реквизитов: сначала происходит получение набора свойств, связанных с этим объектом, а потом уже из ТЧ ДополнительныеРеквизиты берутся значения свойств.
Такой запрос должен сработать:
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
Я беру ФизЛица, у которых в ТЧ ДополнительныеРеквизиты нет строк со свойством СсылкаНаМоеСвойство
"ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
| И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
Показать
(12)
Спс.
У меня получилась такая конструкция:
Запрос вывел мне все элементы справочника, у которых в нужном реквизите Ложь. Спасибо всем за обсуждение темы...
"ВЫБРАТЬ
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
| И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ| ФизическиеЛица.Ссылка КАК Ссылка
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка
| И (ФизическиеЛицаКонтактнаяИнформация.Свойство = &СсылкаНаМоеСвойство)
|ГДЕ| ФизическиеЛица.Ссылка КАК Ссылка
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL"
Спс.
У меня получилась такая конструкция:
СвойствоРеквизита = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита (Физические лица)",,);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Свойство", СвойствоРеквизита);
Запрос.Текст =
"ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| ФизическиеЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
| ФизическиеЛицаДополнительныеРеквизиты.Значение КАК Значение
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.ДополнительныеРеквизиты КАК ФизическиеЛицаДополнительныеРеквизиты
| ПО (ФизическиеЛицаДополнительныеРеквизиты.Ссылка = ФизическиеЛица.Ссылка)
| И (ФизическиеЛицаДополнительныеРеквизиты.Свойство = &Свойство)
|ГДЕ
| ФизическиеЛицаДополнительныеРеквизиты.Значение ЕСТЬ NULL";
ПоказатьЗапрос вывел мне все элементы справочника, у которых в нужном реквизите Ложь. Спасибо всем за обсуждение темы...
ДД, вдогонку коллегам с "пытливом" умом добавление:
при дальнейшем использовании запроса увидел "интересное поведение" табличной части "ДополнительныеРеквизиты". Используя перебор списка таблицы со Значением = Истина такой конструкцией:
получил таблицу ДополнительныеРеквизиты со строкой Свойство (имя свойство) и Значение равно Ложь, т.е. строка осталось и с ней можно работать "обычными" запросами. Для того чтобы использовать "типовое" поведение - нужна конструкция:
при дальнейшем использовании запроса увидел "интересное поведение" табличной части "ДополнительныеРеквизиты". Используя перебор списка таблицы со Значением = Истина такой конструкцией:
Для каждого Строчка Из Списка Цикл
Покупатель = Строчка.Ссылка.ПолучитьОбъект();
СтрДопТабл = Покупатель.ДополнительныеРеквизиты;
СтрДопТабл[0].Значение = Ложь;
Покупатель.Записать();
КонецЦикла
получил таблицу ДополнительныеРеквизиты со строкой Свойство (имя свойство) и Значение равно Ложь, т.е. строка осталось и с ней можно работать "обычными" запросами. Для того чтобы использовать "типовое" поведение - нужна конструкция:
Для каждого Строчка Из Люди Цикл
Покупатель = Строчка.Ссылка.ПолучитьОбъект();
СтрДопТабл = Покупатель.ДополнительныеРеквизиты;
СтрДопТабл.Удалить(0);
Покупатель.Записать();
КонецЦикла
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот