7.7 Универсальный Запрос

olga13

Well-known member
10.10.2008
208
0
#1
Добрый день!
Подскажите, возможно ли построить запрос, который бы обрабатывал не конкретный вид справочника, а выбранный пользователем интерактивно. Текст запроса примитивный, но не писать же его для каждого вида справочника.
Код:
Процедура СформироватьСписок()
Перем Запрос, ТекстЗапроса;

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(СформироватьСписок)
|ТекущийЭлемент = Справочник.Товары.ТекущийЭлемент;
|Группировка ТекущийЭлемент без групп;
|"//}}ЗАПРОС
;

Если КромеВыбТовары = 0 Тогда
ТекстЗапроса = ТекстЗапроса + "
|Условие(ТекущийЭлемент в ВыбТовары);
|";
ИначеЕсли КромеВыбТовары = 1 Тогда
ТекстЗапроса = ТекстЗапроса + "
|Условие(НЕ(ТекущийЭлемент в ВыбТовары));
|";
КонецЕсли;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

Сп = СоздатьОбъект("СписокЗначений");
Пока Запрос.Группировка(1) = 1 Цикл
Сп.ДобавитьЗначение(Запрос.ТекущийЭлемент);
КонецЦикла;

КонецПроцедуры
 

puh14

Well-known member
11.07.2008
1 412
0
#2
Конечно!
Делаете цикл по метаданным справочников ( виды справочников, что есть в системе) . Загоняете в список. После выбора значения формируете цикл по метаданным "реквизит" этого справочника и составляете текст запроса. Исполняете и выводите что надо.

Для поля выбора делаете назначение типа после выбора справочника из списка.
 

olga13

Well-known member
10.10.2008
208
0
#3
Конечно!
Делаете цикл по метаданным справочников ( виды справочников, что есть в системе) . Загоняете в список. После выбора значения формируете цикл по метаданным "реквизит" этого справочника и составляете текст запроса. Исполняете и выводите что надо.

Для поля выбора делаете назначение типа после выбора справочника из списка.
Так в том-то и весь вопрос, как должен выглядеть текст запроса. Цикл с метаданными организовать не проблема. А как написать ТекущийЭлемент = ЧТО??? Пробовала и внешние переменные, и строковые операторы. Ругается на неправильный синтаксис запроса.
 

olga13

Well-known member
10.10.2008
208
0
#5
"ТекущийЭлемент = Справочник."+ИмяСправочника+"ТекущийЭлемент
Дык я самого начала так пробовала, не работает!

-------------------- СформироватьСписок --------------------
ТекущийЭлемент = Справочник. <<?>> " + ВыбСпр + ".ТекущийЭлемент;
Запрос[3] : Неожиданное выражение '" + ВыбСпр + "'
Группировка ТекущийЭлемент <<?>> без групп;
Запрос[4] : Переменная 'ТекущийЭлемент' не опеределена
Ошибок - 2, Предупреждений - 0.

И так тоже не работает:
Код:
	ТекСправочник = "Справочник." + ВыбСпр + ".ТекущийЭлемент";

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(СформироватьСписок)
|ТекущийЭлемент = ТекСправочник;
|Группировка ТекущийЭлемент без групп;
|"//}}ЗАПРОС
;
-------------------- СформироватьСписок --------------------
ТекущийЭлемент = <<?>> ТекСправочник;
Запрос[2] : Неверно заданный путь 'ТекСправочник'
Группировка ТекущийЭлемент <<?>> без групп;
Запрос[3] : Переменная 'ТекущийЭлемент' не опеределена
Ошибок - 2, Предупреждений - 0.
 

olga13

Well-known member
10.10.2008
208
0
#6
Всё, поборола!
Надо было так:

ТекстЗапроса = ТекстЗапроса + "ТекущийЭлемент = " + ТекСправочник + ";";

Спасибо всем, кто откликнулся.