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

28.10.10

Разработка - Механизмы платформы 1С

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

 

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

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

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

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

Решение:

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

 

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

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

|ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

 

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

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

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

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

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

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

КонецЕсли;

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

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

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

КонецЦикла;

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

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

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

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

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

 

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

 

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

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

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

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

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

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

КонецЦикла;

 

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

 

 

 

 

 

 

 

 

 

 

 

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    5924    bayselonarrend    126    

59

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    7671    dsdred    57    

99

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    11391    bayselonarrend    21    

162

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7802    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    26753    YA_418728146    33    

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

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