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

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

// Размаскирует обращения к временным таблицам в тексте запроса.
//
// Параметры:
//  ТекстЗапроса – Строка;
//  МассивВременныхТаблиц – Массив – элементами являются имена временных таблиц, замаскированных ранее.
//
// Возвращаемое значение:
//  Строка - новые текст запроса.
//
Функция РазмаскироватьВременныеТаблицы(ТекстЗапроса, МассивВременныхТаблиц, выхВсеРазмаскировано = Ложь) Экспорт

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

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

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


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

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