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

Пакетный запрос значений из справочника по Свойствам

Автор Lengros, 16 янв 2017, 00:25

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

Lengros

Доброго времени суток. Уважаемые знатоки, подскажите как оно будет грамотнее организовать.

Задача такова: Необходимо написать запрос. Результатом запроса должны быть ссылки на всю номенклатуру, которая полностью соответствуют указанному набору свойств и их значениям. Т.е. номенклатура должна одновременно содержать все указанные свойства и их значение и кроме них не содержать других свойств и значений.

Вот что сделал я.

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

       
|ВЫБРАТЬ
|    ПараметрыЗапроса.Свойство,
|    ПараметрыЗапроса.ЗначениеСвойства
|ПОМЕСТИТЬ ВТ
|ИЗ
|   &ПараметрыЗапроса КАК ПараметрыЗапроса
|;
///////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    ИсходнаяВыборка.Ссылка КАК Ссылка
|ИЗ
|    ВТ
|ЛЕВОЕ СОЕДИНЕНИЕ ИсходнаяВыборка КАК ИсходнаяВыборка
|ПО
|    ИсходнаяВыборка.Свойство = ВТ.Свойство
|ГДЕ
|    ИсходнаяВыборка.ЗначениеСвойства = ВТ.ЗначениеСвойства
|УПОРЯДОЧИТЬ ПО
|    Ссылка";
   
Результат = Запрос.Выполнить().Выгрузить();


На выходе запрос выдаёт ссылки номенклатуры, которые соответствуют хотя бы одному из задаваемых параметров "Свойство-Значение", что не есть правильно. Плюс повторяющиеся значения, если Номенклатура попадает сразу по двум параметрам.
Как правильно вписать сюда условия отбор исходя из поставленной задачи? А то у меня мозгов совсем не хватает грамотно это организовать :(

Dethmontt

Lengros, вообще не использовать таблицу номенклатуры
Выбирать поле Объект из регистра с условием на твои свойства и на тип Объекта
ГДЕ Объект Ссылка Справочник.Номенклатура и (твои условия на свойства)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Lengros

Если не использовать Справочник, а брать Ссылку из регистра, не будет возможности выдавать те значения номенклатуры, у которых вообще не указаны свойства.
А такой вариант хотелось бы реализовать, если пользователь не указывает ни одного параметра в ВТ

Dethmontt

Цитата: Lengros от 16 янв 2017, 00:25Результатом запроса должны быть ссылки на всю номенклатуру, которая полностью соответствуют указанному набору свойств и их значениям.
Как то тяжеловато стыкуется...
Цитата: Lengros от 16 янв 2017, 09:28Если не использовать Справочник, а брать Ссылку из регистра, не будет возможности выдавать те значения номенклатуры, у которых вообще не указаны свойства.

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

alex0402

Цитата: Lengros от 16 янв 2017, 09:28А такой вариант хотелось бы реализовать, если пользователь не указывает ни одного параметра в ВТ

можно использовать запрос, предложенный Dethmontt, и
объединтить все
ВЫБРАТЬ * ИЗ Справочник
левое соединение РекгистрСвкдкний.ЗначениеСвойств
ПО ССылка = Объект
где Объект is null



Спасибо за Сказать спасибо

Lengros

Цитата: Dethmontt от 16 янв 2017, 09:39
Как то тяжеловато стыкуется...
Нет, ну почему тяжеловато. Допустим я задаю "Вид товара" и "Зимняя обувь". И мне запрос выдаёт ссылки только на те наименования, которые содержат только одно это свойство.
Если я задаю "Вид товара - зимняя обувь" и "Производитель - ООО Пупкин", то запрос выдаёт ссылки на наименования, у которых указанны только эти оба параметра сразу и никаких других.
Ну а если я оставляю параметры пустыми, то и запрос выдаёт ту номенклатуру, у которой в Свойствах не задано ни одного значения.

В теории задача простая, но на практике я пока так и не осилил.

LexaK

эту задачу надо решать от противного

1.сначала подзапросом выбрать ВСЕ элементы которые НЕ подходят под ваше условие
    а.совпадало количество свойств
    б.совпадали значения этих свойств
2.в основном запросе отсеять те которые не подходят по параметрам.

вот простенький запрос на тестовых данных, надеюсь сможете его переделать под свою задачу ;)

выбрать "свойство1" как Свойство, 5 как Значение поместить Парам объединить все
выбрать "свойство2" как Свойство, 10 как Значение объединить все
выбрать "свойство4" как Свойство, 4 как Значение
;

//объект, количество свойств и значения равны
выбрать 100 как Объект, "свойство1" как Свойство, 5 как Значение поместить ИД объединить все
выбрать 100 как Объект, "свойство2" как Свойство, 10 как Значение объединить все
выбрать 100 как Объект, "свойство4" как Свойство, 4 как Значение объединить все

//объект, свойств больше
выбрать 200 как Объект, "свойство1" как Свойство, 5 как Значение объединить все
выбрать 200 как Объект, "свойство2" как Свойство, 10 как Значение объединить все
выбрать 200 как Объект, "свойство3" как Свойство, 12 как Значение объединить все
выбрать 200 как Объект, "свойство4" как Свойство, 4 как Значение объединить все

//объект, свойств меньше
выбрать 300 как Объект, "свойство1" как Свойство, 5 как Значение объединить все
выбрать 300 как Объект, "свойство4" как Свойство, 12 как Значение объединить все

//объект, свойства равны, а значение(я) нет
выбрать 400 как Объект, "свойство1" как Свойство, 5 как Значение объединить все
выбрать 400 как Объект, "свойство2" как Свойство, 10 как Значение объединить все
выбрать 400 как Объект, "свойство4" как Свойство, 12 как Значение объединить все

//объект, свойства равны, для теста измененпорядок
выбрать 500 как Объект, "свойство1" как Свойство, 5 как Значение объединить все
выбрать 500 как Объект, "свойство4" как Свойство, 4 как Значение объединить все
выбрать 500 как Объект, "свойство2" как Свойство, 10 как Значение
;

//Объектируем параметры, т.е. разворачиваем искомые параметры по каждому объекту
выбрать различные
ИД.Объект,
Парам.*
поместить ПарамОб
из
ИД, Парам
;


//выбрать ид.* из ид
выбрать различные ид.Объект из ид

левое соединение

(
//отбираем те объекты которые не подходят хотя бы под одно условие
выбрать различные
ЕстьNull(ИД.Объект, Парам.Объект) как Объект
из
ИД
полное соединение ПарамОб Парам
по ИД.Объект = Парам.Объект
и ИД.Свойство = Парам.Свойство
и ИД.Значение = Парам.Значение
где
ИД.Значение есть Null
или Парам.Значение есть Null ) тест

по Ид.Объект = тест.Объект
где
тест.Объект есть Null

ответ Понравился? (в смысле пригодился?)

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск