Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите с запросом

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

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

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

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

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

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.