gifts2017

Динамическое заполнение параметров

Опубликовал Max Krumenko (mcroom-info) в раздел Программирование - Практика программирования

Недавно столкнулся с проблемой.
Была обработка с запросами где было условие типа "Подразделение <> &Подр..."
Клиент расширялся и Подразделение разбилось на несколько...
Надо было исправить...

 

Недавно столкнулся с проблемой.

Была обработка с запросами где было условие типа "Подразделение <> &Подр..."

Клиент расширялся и Подразделение разбилось на несколько...

Надо было исправить...

Решение:

1.//ВЫБИРАЕМ ВСЕ ПОДРАЗДЕЛЕНИЯ ОТНОСЯЩИЕСЯ К ГРУППЕ Которая была разбита

 

ЗапросПодразделения = Новый Запрос;

ЗапросПодразделения.Текст = "

|ВЫБРАТЬ

|ПодразделенияОрганизаций.Ссылка КАК Подр

|ИЗ

|Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций

|ГДЕ

|ПодразделенияОрганизаций.Родитель.Ссылка = &ПодразделениеДоговорников";

 

2.//СТРОИМ ЭЛЕМЕНТ ЗАПРОСА ОТНОСИТЕЛЬНО КОЛИЧЕСТВА ПОДПОДРАЗДЕЛЕНИЙ ДЛЯ КОРНЕВОГО ПОДРАЗДЕЛЕНИЯ"

ТекстЗапроса = "В (";

НомерТекПеременной = 0;

Пока ВыборкаПодрДог.Следующий() Цикл 

Если НомерТекПеременной <> 0 Тогда

ТекстЗапроса = ТекстЗапроса + ", ";

КонецЕсли;

НомерТекПеременной = НомерТекПеременной + 1;

ТекПеременнаяСтрока = "&Подр" + НомерТекПеременной;

ТекстЗапроса = ТекстЗапроса + ТекПеременнаяСтрока;

КонецЦикла;

ТекстЗапроса = ТекстЗапроса + ")";

//ЭЛЕМЕНТ ВИДА ТекстЗапроса = "В (&Подр1, &Подр2, .... )"

3. Меняем условие в исходном запросе

"НЕ ПОДРАЗДЕЛЕНИЕ " + ТекстЗапроса + ")" +"

4. Динамически заполняем параметры

 

//ДИНАМИЧЕСКОЕ ЗАПОЛНЕНИЕ

 

ВыборкаПодрДог.Сбросить();

НомерТекПеременной = 0;

Пока ВыборкаПодрДог.Следующий() Цикл

НомерТекПеременной = НомерТекПеременной + 1;

ТекПеременнаяСтрока = "Подр" + НомерТекПеременной;

Запрос.УстановитьПараметр(ТекПеременнаяСтрока, ВыборкаПодрДог.Подр);

КонецЦикла;

 

Все))
Надеюсь кому то пригодится

 

 

 

 

 

 

 

 

 

 

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Иван (Spartan) 29.10.10 08:08
(0) Чет как-то сложно все... Может нужно было просто написать НЕ Подразделение В ИЕРАРХИИ(&ГруппаПодразделений), если для всей группы, или НЕ Подразделение В(&СписокПодразделений) и передать в параметр список значений, если для конкретных?
hulio; kote; mcroom-info; minikos; +4 Ответить
2. Михаил Ражиков (tango) 29.10.10 10:23
"Недавно столкнулся с проблемой", долго плакал. Проблема не выдержала, ушла.
А перенумераторы в портфолио есть?
3. Артур Аюханов (artbear) 31.10.10 16:28
Почитай про ПостроительЗапроса, и запрос легче будет исправить вместо столь многосложной конструкции
Пока минус :(
4. Артур Аюханов (artbear) 31.10.10 16:29
5. Max Krumenko (mcroom-info) 01.11.10 11:56
Всем спасибо.
Действительно я новичок в этом деле.
Приятно слышать обоснованную критику.
6. direktorSan (direktorSan) 03.11.10 20:43
Если мне память не изменяет, то в запросе такое разыменование:
ПодразделенияОрганизаций.Родитель.Ссылка
приводит к тому, что в конечном запрое (оттранслированном 1С-кой) будет присутствовать дополнительное соединение таблицы ПодразделенияОрганизаций к ней же самой по условию
ПодразделенияОрганизаций.Ссылка = ПодразделенияОрганизаций.Родитель
И уже из результата этого соединения будет взята ссылка.
Сами понимаете, что если табличка ПодразделенияОрганизаций имеет несколько десятков миллионов записей, то дополнительное соединение скорости запросу НЕ придаст.
Правильней писать было бы так:
ПодразделенияОрганизаций.Родитель = &ПодразделениеДоговорников

Обобщая, можно сказать, что любое разыменование реквизита ссылочного типа ведет к появлению дополнительного соединения. При некоторых условиях такой запрос может завесить базу на неопредленное время. Но если этот же запрос переписать с явным указанием всех соединений, то запрос будет вполняться более предсказуемо.