Имя: Пароль:
1C
1С v8
Исключение из результатов одного запроса результат 2-го запроса
0 drovak
 
31.07.19
13:55
Добрый день!
Требуется из результатов запроса исключить результат 2-го запроса, например, из характеристик, отобранных по определенному размеру, надо исключить характеристики, в которых отсутствует свойство "Рост".
Такой пример кода отрабатывает неправильно:

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

Пытаюсь использовать ЛЕВОЕ СОЕДИНЕНИЕ, но результат тоже выдает неверный:

ТекстЗапроса =
"ВЫБРАТЬ
|    ЗначенияСвойствОбъектов.Объект КАК ХарактеристикаНоменклатуры
|ПОМЕСТИТЬ ВТ_ОтобранныеПоРазмерам
|ИЗ
|    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
|    ЗначенияСвойствОбъектов.Свойство.Наименование = ""Размер""
|    И ЗначенияСвойствОбъектов.Значение.Наименование = &Размер
|    И ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ХарактеристикиНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ЗначенияСвойствОбъектов.Объект КАК ХарактеристикаНоменклатуры
|ИЗ
|    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОтобранныеПоРазмерам КАК ВТ_ОтобранныеПоРазмерам
|    ПО ХарактеристикаНоменклатуры = ВТ_ОтобранныеПоРазмерам.ХарактеристикаНоменклатуры
|ГДЕ
|    ЗначенияСвойствОбъектов.Свойство.Наименование = ""Рост""
|    И ХарактеристикаНоменклатуры ЕСТЬ NULL
|";

Поправьте, пожалуйста!
1 Euguln
 
31.07.19
14:01
|    И ЗначенияСвойствОбъектов.Значение = &Размер
2 shuhard
 
31.07.19
14:01
(0) И ХарактеристикаНоменклатуры ЕСТЬ NULL заменить на
ВТ_ОтобранныеПоРазмерам.ХарактеристикаНоменклатуры
3 ДядяМитяй
 
31.07.19
14:11
там где ЛЕВОЕ СОЕДИНЕНИЕ - в ту ли сторону оно сделано? мне кажется наоборот надо - то, что уже отобрано вначале. или если лень - заменить слово левое на правое
4 drovak
 
31.07.19
14:28
(3) ПРАВОЕ СОЕДИНЕНИЕ выдает результат запроса 0.
(2) Если заменяю "И ХарактеристикаНоменклатуры ЕСТЬ NULL" на "И ВТ_ОтобранныеПоРазмерам.ХарактеристикаНоменклатуры", выходит сообщение об ошибке запроса.
5 RomanYS
 
31.07.19
14:44
(4) похоже имелось ввиду
И ВТ_ОтобранныеПоРазмерам.ХарактеристикаНоменклатуры ЕСТЬ NULL
6 drovak
 
31.07.19
15:19
(5) В этом случае результат появляется, но нулевой.
7 drovak
 
04.08.19
16:42
В общем, если кому интересно, такое решение у меня сработало:

ТекстЗапроса =
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект КАК ХарактеристикаНоменклатуры
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Свойство.Наименование = ""Размер""
    |    И ЗначенияСвойствОбъектов.Значение.Наименование = &Размер
    |    И ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ХарактеристикиНоменклатуры
    |    И (НЕ ЗначенияСвойствОбъектов.Объект В
    |        (ВЫБРАТЬ
    |            ЗначенияСвойствОбъектов.Объект
    |        ИЗ
    |            РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ТаблицаРостов
    |            ПО ЗначенияСвойствОбъектов.Объект = ТаблицаРостов.Объект
    |        ГДЕ
    |            ТаблицаРостов.Свойство.Наименование = ""Рост""))
    |";
8 palpetrovich
 
04.08.19
17:34
(7) а что, в результат запроса
"ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект КАК ХарактеристикаНоменклатуры
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Свойство.Наименование = ""Размер""

действительно попадают записи с
ЗначенияСвойствОбъектов.Свойство.Наименование = ""Рост"" ?
9 hhhh
 
04.08.19
19:23
у меня только так срабатывало

|ГДЕ
    |    ПОДСТРОКА(ЗначенияСвойствОбъектов.Свойство.Наименование, 1, 6) = ""Размер""
10 drovak
 
04.08.19
23:09
(8) Приведу пример. В регистре сведений (УТ 10.3) содержится 3 записи:
1) Объект (наименование характеристики) - "108, 164", Свойство - "Размер", Значение - "108"
2) Объект (наименование характеристики) - "108, 164", Свойство - "Рост", Значение - "164"
3) Объект (наименование характеристики) - "108", Свойство - "Размер", Значение - "108"
Очевидно, что имеется одна характеристика, в которой указан Размер и Рост, и 2-я характеристика, в которой указан только Размер. Первая часть запроса выдает правильный результат - 2 записи (1-я и 3-я по полю "Объект"), 2-я часть запроса должна поле "Объект" проверить по отсутствию свойства "Рост", т.е. выдать результат "108" - по полю "Объект" (3-я запись).
11 НЕА123
 
05.08.19
08:45
(7)

а для чего ВНУТРЕНЕЕ СОЕДИНЕНИЕ?
> (ВЫБРАТЬ
    |            ЗначенияСвойствОбъектов.Объект
    |        ИЗ
    |            РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ТаблицаРостов
    |            ПО ЗначенияСвойствОбъектов.Объект = ТаблицаРостов.Объект
    |        ГДЕ
    |            ТаблицаРостов.Свойство.Наименование = ""Рост"")





(ВЫБРАТЬ
    |            ЗначенияСвойствОбъектов.Объект
    |        ИЗ
    |            РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ГДЕ
    |            ЗначенияСвойствОбъектов.Свойство.Наименование = ""Рост"")
12 drovak
 
05.08.19
10:51
(11) В первой части запроса отбираются объекты, имеющие свойство "Размер". Соответственно, в эту выборку не попадают объекты, имеющие свойство "Рост". ВНУТРЕННЕЕ СОЕДИНЕНИЕ обеспечивает повторную фильтрацию выборки уже по свойству "Рост".
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший