Имя: Пароль:
1C
1С v8
Запрос в списке значений
,
0 winterbear
 
14.07.18
12:39
Есть справочник Номенклатура, есть справочник Значение свойств Номенклатуры.
В этом справочнике есть такие записи.

Номенклатура1 деревянный
Номенклатура1 высокий
Номенклатура1 прочный
Номенклатура2 прочный
Номенклатура2 темный
Номенклатура2 черный

Мы задаем список свойств на форме= деревянный, высокий, прочный.
и в результате нужно получить номенклатуру ,которая обладает всеми свойствами.

и в результате запроса получаем Номенклатура1

если зададим деревянный, черный- то ничего не должно найти.

Такое условие не подходит ЗначенияСвойствОбъектов.Значение В (&СписокСвойств))
1 Franchiser
 
гуру
14.07.18
12:58
Передай свой список значений в запрос, потом сделай левое соединение к нему, группировку по номенклатуре с расчетом минимума по полю свойства, условие имеющие  минимум(свойство) есть не null
2 RomanYS
 
14.07.18
14:50
Вариант 1
(N-1) внутренних соединений

Вариант 2
условие  ЗначенияСвойствОбъектов.Значение В (&СписокСвойств))
группировка по номенклатуре
имеющие количество(различные Значение) = &КоличествоСвойствВУсловии
3 Бертыш
 
14.07.18
19:39
Например так
ВЫБРАТЬ
    Объекты.Объект,
    Объекты.СчетччикСвойств,
    ПередалиСвойств.СчетчикСвойств
ИЗ
    (ВЫБРАТЬ
        ЗначенияСвойствОбъектов.Объект КАК Объект,
        СУММА(1) КАК СчетччикСвойств
    ИЗ
        РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ГДЕ
        ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
        И ЗначенияСвойствОбъектов.Значение В(&СписокЗначений)
    
    СГРУППИРОВАТЬ ПО
        ЗначенияСвойствОбъектов.Объект) КАК Объекты
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СУММА(НамПередалиСвойств.СчетчикСвойств) КАК СчетчикСвойств
        ИЗ
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                1 КАК СчетчикСвойств,
                ЗначенияСвойствОбъектов.Значение КАК Значение
            ИЗ
                РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
            ГДЕ
                ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
                И ЗначенияСвойствОбъектов.Значение В(&СписокЗначений)) КАК НамПередалиСвойств) КАК ПередалиСвойств
        ПО (ИСТИНА)
ГДЕ
    Объекты.СчетччикСвойств = ПередалиСвойств.СчетчикСвойств
4 Бертыш
 
14.07.18
19:41
Или так
ВЫБРАТЬ
    Объекты.Объект,
    Объекты.СчетччикСвойств
ИЗ
    (ВЫБРАТЬ
        ЗначенияСвойствОбъектов.Объект КАК Объект,
        СУММА(1) КАК СчетччикСвойств
    ИЗ
        РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ГДЕ
        ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
        И ЗначенияСвойствОбъектов.Значение В(&СписокЗначений)
    
    СГРУППИРОВАТЬ ПО
        ЗначенияСвойствОбъектов.Объект) КАК Объекты
ГДЕ
    Объекты.СчетччикСвойств В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                СУММА(НамПередалиСвойств.СчетчикСвойств) КАК СчетчикСвойств
            ИЗ
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    1 КАК СчетчикСвойств,
                    ЗначенияСвойствОбъектов.Значение КАК Значение
                ИЗ
                    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                ГДЕ
                    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
                    И ЗначенияСвойствОбъектов.Значение В (&СписокЗначений)) КАК НамПередалиСвойств)
5 Бертыш
 
14.07.18
19:42
Вот блин только накосячил я. Вместо где условие должно быть в имеющие
6 Бертыш
 
14.07.18
19:43
Короче говоря вот что Вам надо. Фильтрует с любым переданым количеством свойств
ВЫБРАТЬ
    Объекты.Объект,
    Объекты.СчетччикСвойств
ИЗ
    (ВЫБРАТЬ
        ЗначенияСвойствОбъектов.Объект КАК Объект,
        СУММА(1) КАК СчетччикСвойств
    ИЗ
        РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ГДЕ
        ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
        И ЗначенияСвойствОбъектов.Значение В(&СписокЗначений)
    
    СГРУППИРОВАТЬ ПО
        ЗначенияСвойствОбъектов.Объект) КАК Объекты

СГРУППИРОВАТЬ ПО
    Объекты.Объект,
    Объекты.СчетччикСвойств

ИМЕЮЩИЕ
    СУММА(Объекты.СчетччикСвойств) В
        (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СУММА(НамПередалиСвойств.СчетчикСвойств) КАК СчетчикСвойств
        ИЗ
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                1 КАК СчетчикСвойств,
                ЗначенияСвойствОбъектов.Значение КАК Значение
            ИЗ
                РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
            ГДЕ
                ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
                И ЗначенияСвойствОбъектов.Значение В (&СписокЗначений)) КАК НамПередалиСвойств)
7 Бертыш
 
14.07.18
19:46
То есть к тому что описано (2) добавляется некий тетий вариант отличающийся тем что в параметрах не указывается количество переданных фильтром свойств, а просто количество переданных пользователем свйств подсчитывается на лету и не надо нам

(N-1) внутренних соединений
8 Franchiser
 
гуру
14.07.18
22:03
(7) чё так много кода?
1. Создать ВТ
Выбрать *
Поместить Список
Из &СписокЗначений как СписокЗначений;
Выбрать
ЗначенияСвойствОбъектов.Объект КАК Объект
Из
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
Правое соединение Список по
Список.значение =значения свойство съездила.значение
Сгруппировать по Объект
Имеющие минимум(
ЗначенияСвойствОбъектов.значение) не есть null
9 Garykom
 
гуру
14.07.18
22:33
Подумайте что будет с запросами и скоростью их выполнения если номенклатуры будет десятки и сотни тысяч а разных свойств хотя бы сотни?
10 xXeNoNx
 
14.07.18
22:45
(3) Земеля, спеца сдал? Шо будет за соединение с подзарпосом? Скажу: пистон нужно вставить.
11 Garykom
 
гуру
14.07.18
22:54
1.Делаем простой запрос Значение В (&СписокСвойств)
2. Делаем ВТ (Номенклатура, Свойство, Количество = 1)
3. Группируем по Номенклатура, Суммируя Количество
4. Отбираем записи с Количество = (кол-во значений в СписокСвойств)
12 Franchiser
 
гуру
15.07.18
01:30
Условие В() всегда работает очень долго и всегда нужно этого избегать
13 Franchiser
 
гуру
15.07.18
01:36
(9) ничего не будет, я левом соединением связываюсь с номенклатурой а не наоборот