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

Построитель запроса и использование временных таблиц в качестве параметра.

Построитель запроса и использование временных таблиц в качестве параметра.
Я
   DeadLine
 
01.04.21 - 11:41
Привет всем! Задаю вопрос в связи с тем, что все статьи, которые я нашел по этой "избитой" теме являются очень старыми. Вопрос собственно не новый. Можно ли как-то красиво передать внешнюю таблицу в построитель запросов НЕ в качестве источника данных, поскольку тогда текст запроса полностью игнорируется, а виде временной таблицы или в виде параметра. Единственное, более-менее адекватное решение нашел тут, но возможно есть что-то поновее, поскольку тут всё равно нужен финт ушами.
https://infostart.ru/1c/articles/96970/ год 2011.
   Kondarat
 
1 - 01.04.21 - 12:16
(0) И что не работает? Это оно?
    ТекстЗапроса = "ВЫБРАТЬ
                   |    Пользователи.Ссылка КАК Ссылка
                   |ПОМЕСТИТЬ ВТ_Менеджеры
                   |ИЗ
                   |    Справочник.Пользователи КАК Пользователи
                   |;
                   |
                   ////////////////////////////////////////////////////////////////////////////////

                   |ВЫБРАТЬ
                   |    ПродажиОбороты.Менеджер КАК Менеджер,
                   |    ПродажиОбороты.Номенклатура КАК Номенклатура
                   |ИЗ
                   |    ВТ_Менеджеры КАК ВТ_Менеджеры
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
                   |        ПО ВТ_Менеджеры.Ссылка = ПродажиОбороты.Менеджер";
    
    ПЗ = Новый ПостроительЗапроса();
    ПЗ.Текст = ТекстЗапроса;
    
    ТЗ = ПЗ.Результат.Выгрузить();
Все работает. Платформа 8.3.18.1289
   DeadLine
 
2 - 01.04.21 - 12:24
(1) Вот поменяй теперь справочник.Пользователи на &Пользователи и попробуй передать таблицу в качестве параметра или попробуй реализовать тоже самое через использование менеджера временных таблиц.В обоих случаях ВНЕШНЮЮ таблицу не должно удастся так легко передать в построитель запроса.
   Said_We
 
3 - 01.04.21 - 12:34
(0) Не понял вопроса. Какая ошибка и когда возникает?
   Said_We
 
4 - 01.04.21 - 12:41
(0) Какая платформа?
   Kondarat
 
5 - 01.04.21 - 12:44
(2) >>а виде временной таблицы или в виде параметра
Я тебе показал пример с временной таблицей. Что еще надо.
>>тоже самое через использование менеджера временных
Причем здесь построитель и МенеджерВременныхТаблиц?
   Said_We
 
6 - 01.04.21 - 12:46
(0) Не я один вопроса не понял.
   DeadLine
 
7 - 01.04.21 - 12:57
(5)я не знаю, чего ты не понимаешь. Если я в этом сообщении четко указал ВНЕШНЮЮ - Справочник.Пользователи это не внешняя таблица, которую нужно передавать в построитель запроса.
Внешнюю таблицу можно передать в запрос либо в качестве параметра, либо через МенеджерВременныхТаблиц.
А вот в построитель запроса получается нельзя, по крайней мере у меня не получается, передать внешнюю таблицу в качестве параметра и нельзя реализовать через МенеджерВременныхТаблиц, поскольку построитель не умеет с ним работать.
   Chameleon1980
 
8 - 01.04.21 - 13:05
запрос для по строителя ты сам накидал?
покажи
   Dzenn
 
9 - 01.04.21 - 13:07
(0) Привет! ПостроительОтчета больше не развивается (на его место пришла СКД), и в нём как не было возможности передавать в него ТаблицуЗначений в качестве параметра, так и не будет. Если нужен именно ПостроительОтчета, ищи какие-то обходные пути, иначе никак.
   DeadLine
 
10 - 01.04.21 - 13:16
(9) спасибо за ответ,теперь понятно,почему так редко этот инструмент встречается в типовых.
   ptiz
 
11 - 01.04.21 - 13:20
(0) Да, только через ПолучитьЗапрос() можно так использовать ТаблицуЗначений.
   DeadLine
 
12 - 01.04.21 - 14:00
(11) Можешь приложить код? По-моему в построителе при ЗаполнитьНастройки() выйдет ошибка, а без динамических настроек в построителе и смысла нету.
   ptiz
 
13 - 01.04.21 - 15:55
(12) Ты же сам ссылку привел на статью, где всё описано:
1) в текст построителя пихаем заглушку вместо ТЗ
2) по кнопке "Сформировать" в отчете делаем финт ушами:
 а) Запрос = Построитель.ПолучитьЗапрос()
 б) подменяем в тексте запроса заглушку на &ТЗ и устанавливаем параметр запроса: Запрос.УстановитьПараметр("ТЗ", ТЗ);
   DeadLine
 
14 - 01.04.21 - 16:36
(13) это понятно, я думал может и через ПолучитьЗапрос(),но как-то по-другому , вариант описанный в статье это далеко не идеал...
   Said_We
 
15 - 01.04.21 - 20:15
(7) Всё равно не понимаю в чем вопрос.
Запрос.УстановитьПараметр("ТЗ", ТЗ); - передается параметр в запрос. А надо куда тогда и что передать, если это не то что необходимо?
   Said_We
 
16 - 02.04.21 - 11:34
Первое апреля прошло....
   DeadLine
 
17 - 02.04.21 - 11:43
(16) ты понимаешь разницу между построителем запроса и запросом? Если да, то я хз, что ты прикопался или чего ты не понимаешь. Я ответ на свой вопрос получил.
   TormozIT
 
18 - 02.04.21 - 12:04
В ИР широко используется такая подмена.

Обработка.ирПлатформа

// Размаскирует обращения к временным таблицам в тексте запроса.

//
// Параметры:

//  ТекстЗапроса – Строка;
//  МассивВременныхТаблиц – Массив – элементами являются имена временных таблиц, замаскированных ранее.

//
// Возвращаемое значение:

//  Строка - новые текст запроса.
//

Функция РазмаскироватьВременныеТаблицы(ТекстЗапроса, МассивВременныхТаблиц, выхВсеРазмаскировано = Ложь) Экспорт 

// Получает текст запроса, где каждая временная таблица заменена своим имитатором.

//
// Параметры:

//  ОбъектЗапроса – Запрос;
//  *ТекстЗапроса  – Строка, *Неопределено;

//  *МассивВременныхТаблиц - Массив, *Неопределено - все подменяемые таблицы заносятся сюда.
//

// Возвращаемое значение:
//  Строка - новый текст запроса.

//
Функция ЗамаскироватьВременныеТаблицы(ОбъектЗапроса, Знач ТекстЗапроса = Неопределено,
   Said_We
 
19 - 02.04.21 - 12:05
(17) Я не понимаю зачем использовать построитель в нынешнем 2021 году. Даже в 2011 уже не понимаю зачем.
   TormozIT
 
20 - 02.04.21 - 12:07
(19) Так в компоновке та же проблема. Менеджер временных таблиц там появился совсем недавно и еще хромой.
   Said_We
 
21 - 02.04.21 - 12:09
(20) А внешнего источника данных нет в СКД?
   TormozIT
 
22 - 02.04.21 - 12:13
(21) Если ты про "набор данных объект", то к нему запрос выполнить нельзя. Это следующий этап конвейра компоновки - он выполняется в процессе 1С, а не в СУБД.
   Said_We
 
23 - 02.04.21 - 12:16
(20) На первой закладке в СКД наборы данных. Добавляешь не запрос, а набор данных и задаешь ему имя и описываешь структуру. А как этот набор данных был получен - не важно. Хоть каким-то запросом, хоть ручками...

Я же правильно понимаю задачу - главное некую таблицу передать в запрос для использования данных этой таблицы при выполнении запроса.
Обычный запрос это умеет. А СКД умеет это счастье компоновать и даже выводить.
   Said_We
 
24 - 02.04.21 - 12:17
Я задачу не понимаю, в которой необходимо использовать построитель. Что на входе, что на выходе.
   АнализДанных
 
25 - 02.04.21 - 14:09
(24) Построитель удобен, когда текст запроса собирается динамически.
Например, можно склеить запрос из разных условий, но это будет не налгядно, сложные запросы не открыть конструктором, не проверить синтаксис, сложно дорабатывать, читать:

"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка"
+ ?(ВыводитьКод=Истина, ", Номенклатура.Код КАК Код", "")
+ ?(ВыводитьАртикул = Истина, ", Номенклатура.Артикул КАК Артикул", "") 
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ"
| ИСТИНА
+ ?(ЗначениеЗаполнено(Производитель), " И Номенклатура.Производитель = &Производитель", "")
+ ?(ЗначениеЗаполнено(СрокГодности),  " И Номенклатура.СрокГодности = &СрокГодности", "");


А можно использовать построитель, тогда запрос будет читабельней и проще. Его можно редактировать конструктором:

"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|{ВЫБРАТЬ
| Номенклатура.Код,
| Номенклатура.Артикул}
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|{ГДЕ
| Номенклатура.Производитель.*,
| Номенклатура.СрокГодности}"
   Said_We
 
26 - 02.04.21 - 15:32
(25) В типовых забили на всё это. Динамически собирают запросы постоянно. Конструктором в коде ничего не откроешь.


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