Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите с запросом... Доп реквизиты Номенклатуры

Помогите с запросом... Доп реквизиты Номенклатуры
Я
   m1_1976
 
29.06.21 - 13:11
Всем добрый день.
Подскажите в тупике.
1С Розница.
Справочник Номенклатура.

У номенклатуры 8 доп реквизитов. (Важно что их конечное число).
Хочу найти запросом все товары у которых 7 известных мне конкретных реквизитов совпадают. (допустим мне известен один товар - из него эти 7 доп.реквизитов беру).

Все доп.реквизиты  обязательны к заполнению...
   m1_1976
 
1 - 29.06.21 - 13:14
Верно понимаю что должно быть 7 уровней вложенных запросов.
Первым нахожу все товары у которых совпадает Доп.свойство 1
Второым нахожу все товары среди результатов 1 запроса у которых совпадает Доп.свойство 2
и т.д.
????
   m1_1976
 
2 - 29.06.21 - 13:14
Че-то мне кажется какой-то огород горожу...
   RomanYS
 
3 - 29.06.21 - 13:17
соединить по равенству свойств, а потом сгруппировать по ссылке. <!>Имеющие<!> 7 совпадений - искомые элементы
   H A D G E H O G s
 
4 - 29.06.21 - 13:18
"ВЫБРАТЬ
|    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
|    МАКСИМУМ(ВЫБОР
|            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Реквизит1
|                ТОГДА НоменклатураДополнительныеРеквизиты.Значение
|        КОНЕЦ) КАК Реквизит1,
|    МАКСИМУМ(ВЫБОР
|            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Реквизит2
|                ТОГДА НоменклатураДополнительныеРеквизиты.Значение
|        КОНЕЦ) КАК Реквизит2
|ПОМЕСТИТЬ Реквизиты
|ИЗ
|    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|
|СГРУППИРОВАТЬ ПО
|    НоменклатураДополнительныеРеквизиты.Ссылка
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ РАЗЛИЧНЫЕ
|    Реквизиты.Ссылка КАК Ссылка
|ИЗ
|    Реквизиты КАК Реквизиты
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Реквизиты КАК Реквизиты1
|        ПО Реквизиты.Реквизит1 = Реквизиты1.Реквизит1
|            И Реквизиты.Реквизит2 = Реквизиты1.Реквизит2"
   m1_1976
 
5 - 29.06.21 - 13:18
так решил...
ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка КАК Ссылка,
    СУММА(ВложенныйЗапрос.Поле1) КАК Поле1
ИЗ
    (ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
        1 КАК Поле1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеТовар
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеБренд
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеБренд
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеСостав
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеЦвет
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеСостав
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка,
        1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеАртикул) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Ссылка

УПОРЯДОЧИТЬ ПО
    Поле1 УБЫВ
   m1_1976
 
6 - 29.06.21 - 13:19
Добавил доп поле = 1 в каждом.
Потом выбираю только те у которых Поле1 = 8
   RomanYS
 
7 - 29.06.21 - 13:26
(4) с одной стороны прикольно, с другой стороны: почему тогда не просто 2 (или N) левых соединения? Вроде методически более верно и не сильно более громоздко
   apdate by
 
8 - 29.06.21 - 13:42
а так не правильно? (я плохо знаю запросы знаю mysql Но и там задумался (
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Артикул = Номенклатура.Артикул
        |    И Номенклатура.АлкогольнаяПродукция = Номенклатура.АлкогольнаяПродукция
        |    И Номенклатура.Наименование = Номенклатура.Наименование";
   apdate by
 
9 - 29.06.21 - 13:47
+(8) у меня сработало

Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Тест.Ссылка КАК Ссылка,
        |    Тест.ВерсияДанных КАК ВерсияДанных,
        |    Тест.ПометкаУдаления КАК ПометкаУдаления,
        |    Тест.Код КАК Код,
        |    Тест.Наименование КАК Наименование,
        |    Тест.А КАК А,
        |    Тест.Б КАК Б,
        |    Тест.С КАК С,
        |    Тест.Д КАК Д,
        |    Тест.Предопределенный КАК Предопределенный,
        |    Тест.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
        |ИЗ
        |    Справочник.Тест КАК Тест
        |ГДЕ
        |    Тест.А = Тест.А
        |    И Тест.Б = Тест.А
        |    И Тест.С = Тест.А
        |    И Тест.Д = Тест.А";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        а = "";
    КонецЦикла;
   RomanYS
 
10 - 29.06.21 - 13:48
(8) у тебя все условия заведомо Истина (для не групп)
   apdate by
 
11 - 29.06.21 - 13:48
+(9) выдало все элементы у которых в реквизитах 

А, Б, С, Д одинаковые значения
   apdate by
 
12 - 29.06.21 - 13:51
(10) а что у меня не верно? то?

оно работает далее поместить результат в массив и соединением выдрать ссылки на владельца этих доп реквизитов?
   Classic
 
13 - 29.06.21 - 13:53
ВЫБРАТЬ
     СравниваемаяНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ НесовпадающиеНоменклатуры    
ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ОсновнаяНоменклатура
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СравниваемаяНоменклатура
    ПО ОсновнаяНоменклатура.Ссылка <> СравниваемаяНоменклатура.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДанныеСравниваемойНоменклатуры
    ПО СравниваемаяНоменклатура.Ссылка = ДанныеСравниваемойНоменклатуры.Ссылка
       И ОсновнаяНоменклатура.Свойство = ДанныеСравниваемойНоменклатуры.Свойство
       И ОсновнаяНоменклатура.Значение = ДанныеСравниваемойНоменклатуры.Значение
ГДЕ
   ОсновнаяНоменклатура.Ссылка = &НашаНоменклатура
   И ДанныеСравниваемойНоменклатуры.Ссылка ЕСТЬ NULL 
;
ВЫБРАТЬ
   СпрНоменклатура.Ссылка
ИЗ Справочник.Номенклатура КАК СпрНоменклатура
   ЛЕВОЕ СОЕДИНЕНИЕ НесовпадающиеНоменклатуры  КАК НесовпадающиеНоменклатуры
   ПО СпрНоменклатура.Ссылка = НесовпадающиеНоменклатуры.Номенклатура
ГДЕ
  НесовпадающиеНоменклатуры.Номенклатура ЕСТЬ NULL
   Classic
 
14 - 29.06.21 - 13:53
(13)
Как-то так. Идея я думаю ясна
   lodger
 
15 - 29.06.21 - 13:54
(5)
а если так?

 ВЫБРАТЬ
        НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
        СУММА(1) КАК Поле1
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    ГДЕ
        НоменклатураДополнительныеРеквизиты.Значение В (&СписокЗначений)
СГРУППИРОВАТЬ ПО
    НоменклатураДополнительныеРеквизиты.Ссылка
ИМЕЮЩИЕ СУММА(1) = 8
   RomanYS
 
16 - 29.06.21 - 13:54
(12) У ТСа совсем другая задача
   apdate by
 
17 - 29.06.21 - 13:55
(16) да я видимо не понял задачу :-(
   RomanYS
 
18 - 29.06.21 - 14:06
(13) возможно сработает.
Только есть нюансы:
1. прикладной: у ТСа свойств всего 8, а совпадать должно 7
2. более принципиальный: что будет если у элемента не будет допреквизита? Есть подозрение, что он попадёт в выборку
   m1_1976
 
19 - 29.06.21 - 14:09
(18) 2) Будет. Заполнение доп.реквизита обязательно!
Сделал по своему...
Только долго работает запрос...
   Classic
 
20 - 29.06.21 - 14:14
(18)
Как задача стоит?
Любые 7? Тогда да, мой подход неправильный. Но тогда (6) вообще непонятно к чему

Конкретные 7? Ставим отбор в первой таблице на свойство

У номенклатуры всего 7 из 8? Тогда все правильно.

Я думаю, что задача стоит получить все номенклатуры с такими же свойствами, как и у заданной. Такая задача логична. Единственный вопрос. Если у заданной будет 4 свойства, а у какой-то 5, эта какая-то должна в выборку попадать?
   RomanYS
 
21 - 29.06.21 - 14:16
(19) Заполнение доп.реквизита обязательно!
Ага и у групп и услуг?
(20) Если у номенклатуры не будет ни одной записи ДР (например у групп) - она попадёт в твою выборку?
   Classic
 
22 - 29.06.21 - 14:17
(21)
Нет, она попадет в первую таблицу
   RomanYS
 
23 - 29.06.21 - 14:24
(22) ОК.
И даже 8 раз)) Имеет смысл "различные" добавить, а может и не повлияет ни на что.
   Classic
 
24 - 29.06.21 - 14:27
(23)
Не повлияет. Во втором запросе проверка на нулл. Туда только те, что не в первой таблице.
Можно поставить конечно. Можно и на один запрос переписать, только тогда следующий программист вообще не поймет как это работает :)
   m1_1976
 
25 - 29.06.21 - 14:37
(21) А причем тут Группы?
У них нет ТЧ "ДополнительныеРеквизиты".
Да и групп у меня нет и не будем в этой базе.. Все живет в доп.реквзитах замечтаельно. Еще и по группам их раскладывать??? :)

(20) У доп.свойства в рознице есть признак обязательности заполнения. У меня все заполнены. 100%
Спасибо всем за помощь.
Процентов на 60% помогли.  Самое важно - натолкнули на мысль! За это СПАСИБО!
   Classic
 
26 - 29.06.21 - 14:45
(25)
Покажи, что налабал. А то терзают смутные сомнения
   m1_1976
 
27 - 29.06.21 - 14:56
см (5)
через задницу... но
   Classic
 
28 - 29.06.21 - 15:10
(27)
Это очень мягко сказано.
В общем случае, если типы свойств будут разные, то твой запрос будет выдавать непонятные значения
   m1_1976
 
29 - 29.06.21 - 15:18
(28) Типы свойств всегда справочник "Дополнительные свойства".
Одно плохо = долго работает.
Несколько секунд (5-7) запрос выполняется.
потом переделаю...
   Classic
 
30 - 29.06.21 - 15:41
(29)
Смотри, например у тебя есть свойства (условно) "длина" и "ширина"
У твоей номенклатуры длина 10, ширина 5
У другой номенклатуры ширина 10, длина 5

Что выдаст твой запрос?
 
 
   m1_1976
 
31 - 29.06.21 - 16:22
(30) С ума сойти...  Меня пытаетесь запутать? Зачем? Пишите правильно:

Ш10 Д5
Ш5 Д10
Прчием тут мой запрос. У меня в запросе строго будет 
(ШИРИНА = &ВыбШИРИНА) 
(ДЛИНА = &ВыбДлина)
И не важно в каком порядоке Вы их в своем вопросе написали :))))))

У меня строго 8 доп.реквизитов
У меня есть товар, в котором у меня все известно (БРЕНД,СОСТАВ,ТИПТОВАРА,ЦВЕТ, МОДЕЛЬ и т.д)
Восьмое свойство РАЗМЕР.
Я своим запросом зная, эти 7 доп.реквизитов (из одного товара) - нахожу все такие же товары всех размеров!
Задачу я решил.
   Eiffil123
 
32 - 29.06.21 - 16:36
наиболее логично сделать 7 внутренних соединений с основой таблицей номенклатур и далее на закладке отборов наложить фильтр на эти реквизиты
   acanta
 
33 - 29.06.21 - 16:37
А если это не доп.реквизиты, а части одного реквизита, подстроки?
   Жан Пердежон
 
34 - 29.06.21 - 16:59
(30) там разные ссылки будут, так как (29)
(5) для общего случая - в каждый подзапрос отбор по свойству добавить (если не только доп.свойства),
если только допсвойства, то и (15) должно работать
и зачем у тебя сортировка вместо  ИМЕЮЩИЕ СУММА(Поле1) = 7?
   Classic
 
35 - 29.06.21 - 17:09
(31)
У тебя в (5) ничего такого не написано.

Решил, то и решил. Но я бы порекомендовал тебе проверить свое решение на вариантах, когда значения совпадают, но они не у тех свойств.
   Garykom
 
36 - 29.06.21 - 17:12
у допреквизитов поле имя есть по которому удобно в запросах
   m1_1976
 
37 - 29.06.21 - 17:21
(34) Сортировка это пережиток КонсолиЗапросов (отладка) - так вывел себе наверх в результате наиболее часто встречающиеся. Попробовал на десятке разных наборов. Понял что работает... и переделал на ИМЕЮЩИЕ.
Тут поспешил...
   m1_1976
 
38 - 29.06.21 - 17:22
(35) Так не может быть! так как (29)
   m1_1976
 
39 - 29.06.21 - 17:23
Еще раз спасибо.
тему можно закрыть.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.