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

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

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

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

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

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Артикул = Номенклатура.Артикул
        |    И Номенклатура.АлкогольнаяПродукция = Номенклатура.АлкогольнаяПродукция
        |    И Номенклатура.Наименование = Номенклатура.Наименование";
9 apdate by
 
29.06.21
13:47
+(8) у меня сработало

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

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

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

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

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

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

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

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

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

Ш10 Д5
Ш5 Д10

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

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

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