Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 17:52

Отбор в запросе по нескольким значениям

Автор rabalegq, 04 июл 2023, 18:49

0 Пользователей и 1 гость просматривают эту тему.

rabalegq

Здравствуйте.
Суть такова, что необходимо заполнить таблицу (свойства и значения) и получить только ту номенклатуру, у которые есть эти свойства и значения и кроме этих свойств не должна содержаться других свойств и значений.
Проблема в том, что сначала идёт отбор по первой строке, а потом по 2, а должно быть по двум одновременно, т.е учитывать все параметры.
    МассивСвойств = Новый Массив;
    Для Каждого СтрокаТаблицы Из ТабличноеПоле1 Цикл
        МассивСвойств.Добавить(СтрокаТаблицы.Колонка1);
    КонецЦикла;
   
    МассивЗначений = Новый Массив;
    Для Каждого СтрокаТаблицы Из ТабличноеПоле1 Цикл
        МассивЗначений.Добавить(СтрокаТаблицы.Колонка2);
    КонецЦикла;
   
    ТаблицаРезультатов = Новый ТаблицаЗначений;
    ТаблицаРезультатов.Колонки.Добавить("Свойства");
    ТаблицаРезультатов.Колонки.Добавить("Значения");
    ТаблицаРезультатов.Колонки.Добавить("Объект");
   
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    |    СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления,
    |    СвойстваОбъектов.Ссылка КАК Свойство,
    |    ЗначенияСвойствОбъектов.Значение КАК Значение,
    |    ЗначенияСвойствОбъектов.Объект КАК Объект   
    |Поместить ВТ_Отбор
    |ИЗ
    |    (ВЫБРАТЬ
    |        СвойстваОбъектов.Ссылка КАК Ссылка,
    |        СвойстваОбъектов.Наименование КАК Наименование,
    |        СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления
    |    ИЗ
    |        ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
    |    ГДЕ
    |        СвойстваОбъектов.НазначениеСвойства.Наименование В (""Справочник """"Номенклатура"""""")) КАК СвойстваОбъектов
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ПО (ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НазначенияСвойствОбъектов КАК НазначенияСвойствОбъектов
    |        ПО (НазначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка)
    |            И (ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL);
    |////////////////////////////////////////////////////////////�////////////
    |ВЫБРАТЬ
    |ВТ_Отбор.Объект как Объект,
    |ВТ_Отбор.Свойство как Свойство,
    |ВТ_Отбор.Значение как Значение
    |ИЗ  ВТ_Отбор КАК ВТ_Отбор
    | ГДЕ
    |    (ВТ_Отбор.Значение В(&Значение)) И (ВТ_Отбор.Свойство В (&Свойство))
    |";     
   
    Запрос.УстановитьПараметр("Свойство", МассивСвойств);   
    Запрос.УстановитьПараметр("Значение", МассивЗначений);
   
   
    Выборка = Запрос.Выполнить().Выбрать();
   
    Пока Выборка.Следующий() Цикл
        Строка = ТаблицаРезультатов.Добавить();
        Строка.Объект = Выборка.Объект;   
        Строка.Свойства = Выборка.Свойство;
        Строка.Значения = Выборка.Значение;
    КонецЦикла;
   
    Для Каждого Строки Из ТаблицаРезультатов Цикл
        Сообщить(Строки.Объект);
    КонецЦикла;

Максим75

rabalegq, вот не совсем понятно это:
что сначала идёт отбор по первой строке, а потом по 2, а должно быть по двум одновременно, т.е учитывать все параметры.

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

LexaK

rabalegq, у вас, в корне не верный подход!

сначала вы запросом заполняете таблицу ТабличноеПоле1
затем разбиваете ее и в виде параметров передаете в запрос,

все делается гораздо проще, в первом запросе подключите менеджер временных таблиц
и поместите данные ТабличноеПоле1  во временную таблицу,

затем в запросе с этой временной таблицей можете связать номенклатуру по нужным полям!

или вообще одним запросом выполнить ПАКЕТ запросов и получить сразу несколько результатов!
без всего  этого кода с циклами!
если помогло нажмите: Спасибо!

Максим75

LexaK, интересно, я один не вижу заполнения ТабличногоПоля1 запросом?
у меня вообще нет такого.
есть один запрос, в нем вроде все ровно и красиво.

LexaK

Максим75, косяк здесь
    |    (ВТ_Отбор.Значение В(&Значение)) И (ВТ_Отбор.Свойство В (&Свойство))
здесь совпадение по ЛЮБОМУ Значению и Свойству - т.е. перемножение этих массивов

а автору надо что бы Значение и Свойство были из ОДНОЙ строки ТабличногоПоля1

если помогло нажмите: Спасибо!

Максим75

LexaK, о, теперь ясно, я сразу и не понял, что надо.
тогда согласен с Вами полностью, запихнуть ТабличноеПоле1 в запрос и с ним уже работать.

Теги: Запрос  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск