Имя: Пароль:
1C
1С v8
получить в запросе значения характеристик номенклатуры
0 Hlorka
 
20.11.22
13:38
Добрый день всем! Необходимо запросом вытащить данные о характеристике номенклатуры, штрихкоде и т.д. Загвоздка в характеристике.
В ТЧ документа https://ibb.co/0yrFYqf характеристика состоит из двух характеристик - цвет и размер. Подскажите пожалуйста, как в запросе отдельно вытащить размер и отдельно вытащить цвет? Могу только полную характеристику получить. Характеристика номенклатуры живет в спр. ХарактеристикиНоменклатуры, свойства и значения харак-тик создаются в ТЧ. https://ibb.co/rc6H1v9 Конфа: УНФ 1.6

        Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПеремещениеЗапасовЗапасы.Номенклатура КАК Номенклатура,
        |    ПеремещениеЗапасовЗапасы.Характеристика КАК Характеристика,
        |    СУММА(ПеремещениеЗапасовЗапасы.Количество) КАК Количество
        |ПОМЕСТИТЬ ВТ_Запасы
        |ИЗ
        |    Документ.ПеремещениеЗапасов.Запасы КАК ПеремещениеЗапасовЗапасы
        |ГДЕ
        |    ПеремещениеЗапасовЗапасы.Ссылка = &ТекущийДокумент
        |
        |СГРУППИРОВАТЬ ПО
        |    ПеремещениеЗапасовЗапасы.Номенклатура,
        |    ПеремещениеЗапасовЗапасы.Характеристика
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_Запасы.Номенклатура КАК Номенклатура,
        |    ВТ_Запасы.Характеристика КАК Характеристика,
        |    ВТ_Запасы.Количество КАК Количество,
        |    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
        |ИЗ
        |    ВТ_Запасы КАК ВТ_Запасы
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
        |        ПО ВТ_Запасы.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
        |            И ВТ_Запасы.Характеристика = ШтрихкодыНоменклатуры.Характеристика";
    Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаДокумент);
    РезультатЗапроса = Запрос.Выполнить();
1 RomanYS
 
20.11.22
17:08
(0) два соединения с ТЧ свойств характеристик

...
ВТ
левое соединение ТЧ как ТЧ_Свойств1 по ВТ.Характеристика = ТЧ_Свойств1.Ссылка и ТЧ_Свойств1.Свойство = &Свойство1
...
2 Said_We
 
20.11.22
19:54
(0) Не нужны соединения....
Запрос по характеристикам
3 Hlorka
 
23.11.22
15:02
Сделала таким образом:

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

Работает, но если в ТЧ поле Характеристика пустое, то Номенклатура, количество и прочее в выборку не попадают. А мне надо, чтобы попадали и + характеристика просто была пустым значением.  
Как это поправить можно?
4 vicof
 
23.11.22
15:08
Потому что внутренне соединение.
Перенеси условия в условия соединения
5 Hlorka
 
23.11.22
15:51
(4) то есть так?

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
            |        ПО ВТ_Запасы.Характеристика = ХарактеристикиНоменклатуры.Ссылка И (ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.Свойство = &Цвет
            |            ИЛИ ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.Свойство = &Размер)
6 Hlorka
 
23.11.22
15:52
(5) возникает ошибка
Запрос невозможно исполнить
В условиях соединения запроса не допускается обращение к табличным частям. (1)
7 vicof
 
23.11.22
15:54
Что-то типа того. Вообще запрос, по-хорошему, переписать нужно, но на первый раз пойдет.
8 vicof
 
23.11.22
15:57
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты
9 RomanYS
 
23.11.22
16:22
(3) вот так
"ВЫБРАТЬ
...
|    ХарактеристикиЦвет.Значение КАК Цвет,
|    ХарактеристикиРазмер.Значение КАК Размер
|ИЗ
|    ВТ_Запасы КАК ВТ_Запасы
...
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиЦвет
|        ПО ВТ_Запасы.Характеристика = ХарактеристикиЦвет.Ссылка
|            И (ХарактеристикиЦвет.Свойство = &Цвет)
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиРазмер
|        ПО ВТ_Запасы.Характеристика = ХарактеристикиРазмер.Ссылка
|            И (ХарактеристикиРазмер.Свойство = &Размер)"
10 Hlorka
 
23.11.22
17:45
(9) До меня дошло:) Спасибо большое! Всё получилось
11 RomanYS
 
23.11.22
20:19
(10) пожалуйста)
Была надежда, что (1) будет достаточно
12 Said_We
 
23.11.22
22:42
(11) А у меня была надежда, что разберется в (2).
13 RomanYS
 
23.11.22
23:15
(12) Как по мне, выглядит слишком громоздко. Даже если предположить, что это эффективнее (проверять лень)
14 Said_We
 
24.11.22
00:47
(13) Ну это вопрос к 1С - почему IIF() не поддерживается для менее громоздкого кода. Так же не поддерживается PIVOT и UNPIVOT.
По поводу эффективности это не предположение. В (2) есть замеры.
15 Said_We
 
24.11.22
00:56
ВЫБОР
         КОГДА ЗначенияСвойствОбъектов.Свойство = &Марка
             ТОГДА ЗначенияСвойствОбъектов.Значение
             ИНАЧЕ NULL
    КОНЕЦ,
    ВЫБОР
         КОГДА ЗначенияСвойствОбъектов.Свойство = &РазмерА
             ТОГДА ЗначенияСвойствОбъектов.Значение
             ИНАЧЕ NULL
    КОНЕЦ,

Выглядит с IIF() примерно так:

IIF(ЗначенияСвойствОбъектов.Свойство = &Марка, ЗначенияСвойствОбъектов.Значение, NULL) как Марка
IIF(ЗначенияСвойствОбъектов.Свойство = &РазмерА, ЗначенияСвойствОбъектов.Значение, NULL) как РазмерА

Ну или так:

IIF(т.Свойство = &Марка, т.Значение, NULL) как Марка
IIF(т.Свойство = &РазмерА, т.Значение, NULL) как РазмерА
16 RomanYS
 
24.11.22
01:03
(14) там какие-то оценки типа в N раз быстрее. На практике это всё равно не конечная цель, то есть твой запрос всё равно придётся засунуть в Вт и соединять с основной таблицей.
17 RomanYS
 
24.11.22
01:06
(14) СКД же может напрямую работать со свойствами/характеристиками, можно считать это расширением языка запросов
18 Said_We
 
24.11.22
11:39
(16) "твой запрос всё равно придётся засунуть в Вт и соединять с основной таблицей" - это зачем соединять?
(17) СКД нельзя считать расширением языка запросов. Секции "ИТОГ ПО" и "В ИЕРАРХИИ" можно считать расширением языка запросов. СКД это самостоятельный инструмент, который у себя внутри много чего имеет, в том числе формировать себе на вход данные из результата запрос.
19 RomanYS
 
24.11.22
12:05
(18) >> это зачем соединять?
Есть основная таблица с 100500 полей, ты предлагаешь их все в твои подзапросы добавить и группировку по ним по всем делать? А среди них могут быть поля неограниченной длины и хранилища... От соединения не уйдешь
20 Said_We
 
24.11.22
13:09
(19) Не внимательно смотрели пример в (2).
21 RomanYS
 
24.11.22
13:31
(20) Речь про 28 сообщение?
Запрос по характеристикам
22 Said_We
 
24.11.22
14:08
(21) В 28 сообщении нет соединения. И не понимаю зачем оно может быть понадобиться.
23 Said_We
 
24.11.22
14:19
(19) Много таких свойств, которые строки неограниченной длины или хранилища? Это единичные случаи. Их можно и присоединить.
Если не критично, то строки неограниченной длины можно обрезать через выразить, а далее можно применять функцию максимум:

Выбрать
    максимум(Выразить(т.комментарий как строка(1000))) как комментарий
из
    документ.<любой документ> как т
24 RomanYS
 
24.11.22
15:01
(23) >> Это единичные случаи.
Не соглашусь, это типичная задача: взять какие-то данные (которые сами могут быть объединением нескольких ТЧ например) и к ним прикрутить характеристики.
И эти данные могут содержать длинные строки, которые нельзя резать и хранилище (это конечно редко). И даже после обрезки, группировка например по 10 полям будет идти также быстро как по одной ссылке?
25 Said_We
 
24.11.22
16:00
(24) Поля, по которым идет Группировка в примере в (0) это Номенклатура (Справочник.Номенклатура) и Характиристика (Справочник.ХарактеристикиНоменклатуры).
В обоих случаях это ссылки.
Все остальные поля: Количество и т.д. Это не поля группировки, а поля по которым вычисляется агрегатная функция Количество или Максимум.
26 RomanYS
 
24.11.22
16:06
(25) это частный случай, здесь и пяти характеристик нет для которых вы намерили ускорение в разы
27 Said_We
 
24.11.22
16:14
(26) Вопрос в самом подходе. Если всегда пишешь без мысли о производительности, то рано или поздно получишь общие тормоза всей системы ...
28 RomanYS
 
24.11.22
17:53
(27) Именно что в подходе. Если запрос для отчета, который будет в среднем раз в день формироваться, то я просто убежусь, что он формируется за 0,5-3 секунды и даже замеры делать не буду. И уж тем более не буду переписывать на никому непонятного монстра из (2).
А если запрос при проведении основного документа, то возможны всякие ухищрения... Но ещё раз: у меня большие сомнения что предложенный вариант дает заявленное ускорение в общем случае. Частный случай 5 характеристик свернутых по одной ссылке не очень показателен. Как идея конечно интересно, спасибо.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший