Имя: Пароль:
1C
1С v8
Помогите с запросом
0 IvanVlad1
 
24.08.21
10:00
Есть справочник СПР с табличной частью ИмяРеквизита, ЗначениеРеквизита. К примеру, в нём есть элементы:
Элемент1, таб часть
Имя1, Значение1
Имя2, Значение2
Элемент2, таб часть
Имя2, Значение3
Элемент3, таб часть
Имя1, Значение4
Элемент4, таб часть
Имя3, Значение5
Имя4, Значение6

Есть временная таблица, в которой есть запись
Значение5 Как Имя3,
Значение6 Как Имя4

Как сделать запрос, чтобы по значениям из временной таблицы получить Элемент4 ?
1 RomanYS
 
24.08.21
10:05
2 Ёпрст
 
24.08.21
10:05
Выбрать хрень, справошник.ссылка из временнаятабличка как табличка левое справочник.вася.табличнаячастьнужная как справошник по справошник.реквизиттабчасти = табличка.хрень
3 seevkik
 
24.08.21
10:07
"Элемент4, таб часть"
"Имя3, значение5"
"Имя4, Значение 6"
Являются разными строками?
4 IvanVlad1
 
24.08.21
10:12
(3) Да, это разные строки табличной части элемента справочника
5 IvanVlad1
 
24.08.21
10:21
(1) Немного не то... т.к. в справочнике колонка ИмяРеквизита и значение строковое "Имя3", "Имя4"
т.е. нельзя сделать соединение
"ВЫБРАТЬ
|    ТЧ.Ссылка КАК Ссылка
|ИЗ
|    Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ТЧ
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
|        ПО ТЧ.ИмяРеквизита = ТЗ.Имя3
|            И ТЧ.ЗначениеРеквизита = ТЗ.Имя3
6 IvanVlad1
 
24.08.21
10:22
Здесь вся проблема в том, что в ТЗ - колонки, а в табличной части справочника строки
7 RomanYS
 
24.08.21
10:34
(6) В запросе не получится оперировать заранее неизвестными именами колонок, поэтому в таком общем виде задача запросом не решается
8 IvanVlad1
 
24.08.21
10:51
Можно ли составить текст запроса программно?
9 brainguard
 
24.08.21
11:01
(8) Используй СхемаЗапроса
10 ДенисЧ
 
24.08.21
11:08
(8) Да.
стрЗапрос = "ВЫБРАТЬ
|";

стрЗапрос = стрЗапрос + "
|а1, а2
|ИЗ";

и т.д.
11 Said_We
 
24.08.21
13:02
(5) Может будет удобнее если временная таблица будет содержать не одну колонку со значением, а две - ещё и имя.
12 IvanVlad1
 
24.08.21
13:43
Сделал составление запроса по входящим параметрам, всё работает
13 IvanVlad1
 
24.08.21
13:43
Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ИмяТаблицы", ИмяТаблицыРегистра);
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    НЕОПРЕДЕЛЕНО КАК OBJID
    |ПОМЕСТИТЬ ВТ_ТаблицаДанных
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    СоответствиеОбъектов.Ссылка,
    |    СоответствиеОбъектов.СобственнаяСсылка КАК ВозвращаемаяСсылка,
    |    НЕОПРЕДЕЛЕНО КАК Параметр
    |ПОМЕСТИТЬ ВТПараметрыВыбора
    |ИЗ
    |    Справочник.СоответствиеОбъектов КАК СоответствиеОбъектов
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СоответствиеОбъектов.ПараметрыВыбора КАК СоответствиеОбъектовПараметрыВыбора
    |        ПО СоответствиеОбъектов.Ссылка = СоответствиеОбъектовПараметрыВыбора.Ссылка
    |ГДЕ
    |    СоответствиеОбъектов.ИмяТаблицы = &ИмяТаблицы
    |    И НЕ СоответствиеОбъектов.ПометкаУдаления
    |
    |СГРУППИРОВАТЬ ПО
    |    СоответствиеОбъектов.Ссылка,
    |    СоответствиеОбъектов.СобственнаяСсылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТПараметрыВыбора.ВозвращаемаяСсылка
    |ИЗ
    |    ВТПараметрыВыбора КАК ВТПараметрыВыбора
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТаблицаДанных КАК ВТ_ТаблицаДанных
    |        ПО ВТПараметрыВыбора.Параметр = ВТ_ТаблицаДанных.OBJID";
    
    НомерПараметра = 0;
    ПоляТаблицы = "";
    СоединениеТаблиц = "";
    ПараметрыЭлементаСправочника = "";
    Для каждого ЭлементКлюча Из КлючСсылки Цикл
        НомерПараметра = НомерПараметра + 1;
        ПоляТаблицы = ПоляТаблицы + "&ПараметрТаблицы" + НомерПараметра + " КАК " + ЭлементКлюча.Ключ + ",";
        ПараметрыЭлементаСправочника = ПараметрыЭлементаСправочника + "
        |        МАКСИМУМ(ВЫБОР
        |            КОГДА СоответствиеОбъектовПараметрыВыбора.ИмяРеквизита = &ИмяРеквизита" + НомерПараметра + "
        |                ТОГДА СоответствиеОбъектовПараметрыВыбора.ЗначениеРеквизита
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК Параметр" + НомерПараметра + ",";
        СоединениеТаблиц = СоединениеТаблиц + "ВТПараметрыВыбора.Параметр" + НомерПараметра + " = ВТ_ТаблицаДанных." + ЭлементКлюча.Ключ + "
        |И ";
        Запрос.УстановитьПараметр("ПараметрТаблицы" + НомерПараметра, ЭлементКлюча.Значение);
        Запрос.УстановитьПараметр("ИмяРеквизита" + НомерПараметра, ЭлементКлюча.Ключ);
    КонецЦикла;
    СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ПоляТаблицы, 1);
    СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ПараметрыЭлементаСправочника, 1);
    СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(СоединениеТаблиц, 2);
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО КАК OBJID", ПоляТаблицы);
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО КАК Параметр", ПараметрыЭлементаСправочника);
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВТПараметрыВыбора.Параметр = ВТ_ТаблицаДанных.OBJID", СоединениеТаблиц);
14 IvanVlad1
 
24.08.21
13:44
(1) Спасибо, помог )
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.