Ссылка на справочник в 1С

1. fm14 22.04.21 11:44 Сейчас в теме
Добрый день!
Идея - выбирать тип справочника и подставлять его в запрос. Т.е. вместо &ТЗ(ниже) подставить, к примеру, Справочник.СтатьЗатрат.
На форме сделал выбор списка значений с выбором.
Сделал код:

СправочникСтруктура = Новый Структура("ПДИР,СДДС,СЗ","Справочник.ПрочиеДоходыИРасходы", "Справочник.СтатьиДвиженияДенежныхСредств", "Справочник.СтатьЗатрат");
	ВидСправочника = ЭтаФорма.ВидСправочника;
	Для Каждого элем из СправочникСтруктура Цикл
		Если элем.Ключ = ВидСправочника Тогда
			ПарамВыбора = элем.Значение;
		КонецЕсли;	
	КонецЦикла;	
	ПарамВыбора1 = Новый ТаблицаЗначений;
	ПарамВыбора1.Колонки.Добавить("Свойство");
	СтрокаТЧ =	ПарамВыбора1.Добавить();
	СтрокаТЧ.Свойство = ПарамВыбора;
	
	
	ПостроительЗапроса  = Новый ПостроительЗапроса;                                    
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПарамВыбора1);
 	ПостроительЗапроса.Выполнить();
	ТЗ = ПостроительЗапроса.Результат.Выгрузить();
	
	Запрос = Новый запрос;
	Запрос.УстановитьПараметр("ТЗ", ТЗ);
	Запрос.Текст = "ВЫБРАТЬ
		|Статьи.Ссылка КАК Ссылка
		|ПОМЕСТИТЬ ВТС	
		|ИЗ
		|	&ТЗ КАК Статьи
		|ГДЕ
		|	(Статьи.Родитель.Код = ""БП-000001""
		|	ИЛИ Статьи.Родитель.Родитель.Код = ""БП-000001""
		|	ИЛИ Статьи.Родитель.Родитель.Родитель.Код = ""БП-000001""
		|	ИЛИ Статьи.Родитель.Родитель.Родитель.Родитель.Код = ""БП-000001"")
		|И  Статьи.ЭтоГруппа = ЛОЖЬ
	        |
		|;
		|
	    |ВЫБРАТЬ
		| 	ВТС.Ссылка КАК Ссылка
		|ИЗ
		|	ВТС КАК ВТС";
	
	РезультатВМассив = Запрос.Выполнить().Выгрузить();
Показать


передаю как параметр &ТЗ КАК Статьи
начинает ругаться на
Поле не найдено "Статьи.Родитель.Код"
(Статьи.<<?>>Родитель.Код = "БП-000001"


Может по другому как-то сделать?
По теме из базы знаний
Найденные решения
6. SlavaKron 22.04.21 12:31 Сейчас в теме
Родитель = Справочники[ИмяСправочника].НайтиПоКоду("БП-000001");

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

Запрос.Текст = СтрЗаменить(Запрос.Текст, "СтатьиЗатрат", ИмяСправочника);
Запрос.УстановитьПараметр("Родитель", Родитель);

РезультатВМассив = Запрос.Выполнить().Выгрузить();
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 22.04.21 12:00 Сейчас в теме
(1)Как минимум колонка в ТЗ должна быть типизирована.
5. spacecraft 22.04.21 12:28 Сейчас в теме
(1) проблема заключается в том, что для временной таблицы в которую помещается ТЗ нельзя использовать секцию ГДЕ.
Перенесите секцию ГДЕ во второй запрос пакета.
10. antz 22.04.21 14:05 Сейчас в теме
(5) >для временной таблицы в которую помещается ТЗ нельзя использовать секцию ГДЕ

С чего вдруг?
11. spacecraft 22.04.21 16:13 Сейчас в теме
(10) потому что следующий код:
|ГДЕ
| (Статьи.Родитель.Код = ""БП-000001""
| ИЛИ Статьи.Родитель.Родитель.Код = ""БП-000001""
| ИЛИ Статьи.Родитель.Родитель.Родитель.Код = ""БП-000001""
| ИЛИ Статьи.Родитель.Родитель.Родитель.Родитель.Код = ""БП-000001"")

делает неявное соединение источника данных ТЗ с таблицами базы данных. Что делать нельзя.
12. antz 22.04.21 16:42 Сейчас в теме
(11) ну через точку, понятно, не взлетит. А так секцию ГДЕ вполне себе можно использовать.
3. user633533_encantado 11 22.04.21 12:12 Сейчас в теме
Нафига такие сложности, проще просто менять текст запроса по ситуации.
4. user633533_encantado 11 22.04.21 12:14 Сейчас в теме
Да и с точки зрения производительности не лучшее решение, так как нужно всю таблицу справочника загонять в запрос, а нужна она не вся.
6. SlavaKron 22.04.21 12:31 Сейчас в теме
Родитель = Справочники[ИмяСправочника].НайтиПоКоду("БП-000001");

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

Запрос.Текст = СтрЗаменить(Запрос.Текст, "СтатьиЗатрат", ИмяСправочника);
Запрос.УстановитьПараметр("Родитель", Родитель);

РезультатВМассив = Запрос.Выполнить().Выгрузить();
Показать
7. andy_zhav 197 22.04.21 13:10 Сейчас в теме
(1) Не понятна задача. Для чего вы хотите подставлять тип в запрос? Скажите что хотите сделать, возможно есть более простое решение. Ваш запрос очень не оптимальный по производительности. в плане запроса у вас будет жесть, оптимизатор sql по-любому свалится в table scan
8. fm14 22.04.21 13:20 Сейчас в теме
(7)
Вместо
&ТЗ КАК Статьи
в зависимости от выбора в списке значений, поставлять справочник.
Было так:
Справочник.СтатьЗатрат КАК Статьи
, а стало
&ТЗ КАК Статьи
9. andy_zhav 197 22.04.21 13:33 Сейчас в теме
(8) а, понял теперь.

ну тогда вам в (6) ответили уже

На форму вывести текстовый реквизит "ИмяСправочника", режим выбора из списка,

Задать список выбора:

"ПДИР,СДДС,СЗ","Справочник.ПрочиеДоходыИРасходы", "Справочник.СтатьиДвиженияДенежныхСредств", "Справочник.СтатьЗатрат"

а дальше код готов
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот