Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос. Как правильно отфильтровать?
,
0 Dolly_EV
 
22.05.13
10:25
Имеется Справочник "мбИдентификаторы", у которого есть реквизит "Элемент" типа "Справочник" (неопределенного вида). В нем может быть много разных видов справочников. Требуется сделать выборку с разными сочетаниями фильтров: и по видам и по вхождению в список каждого вида. Не могу сообразить как все это прописать в "ГДЕ...". вот что написал, но чувствую - бред :-(
Пните в нужном направлении?

   ТекстЗапроса= "
   |ВЫБРАТЬ
   |    ЛЕВО($СпрИДД.Элемент,4) КАК [ВидСпр $ВидСправочника]
   |    ,$СпрИДД.Элемент КАК ЭлементИД
   |    ,$СпрИДД.Элемент КАК [Элемент $Справочник]
   |    ,$СпрИДД.Идентификатор КАК Идентификатор
   |ИЗ
   |    Справочник.мбИдентификаторы КАК СпрИДД $nolock
   |ГДЕ
   |    (1=1 И 10=10) ИЛИ (2=2 И 20=20) ИЛИ (3=3 И 30=30) ИЛИ (4=4 И 40=40) ИЛИ (5=5 И 50=50)";

   //1. ОбъектМФ.Добавить("Справочник.Фирмы","Фирма","Фирмы","");
   //2. ОбъектМФ.Добавить("Справочник.Контрагенты","Клн","Контрагенты","");
   //3. ОбъектМФ.Добавить("Справочник.Проекты","Агент","Агенты","");
   //4. ОбъектМФ.Добавить("Справочник.Номенклатура","Тов","Номенклатура","");
   //5. ОбъектМФ.Добавить("Справочник.МестаХранения","Скл","Склады","");
   ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,Запрос,"Фирмы","СРЕД($СпрИДД.Элемент,5,6)",,1,1);
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"10=10","ЛЕВО($СпрИДД.Элемент,4)=:ВидСправочника.Фирмы");
   ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,Запрос,"Контрагенты","СРЕД($СпрИДД.Элемент,5,6)",,2,1);
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"20=20","ЛЕВО($СпрИДД.Элемент,4)=:ВидСправочника.Контрагенты");
   ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,Запрос,"Агенты","СРЕД($СпрИДД.Элемент,5,6)",,3,1);
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"30=30","ЛЕВО($СпрИДД.Элемент,4)=:ВидСправочника.Проекты");
   ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,Запрос,"Номенклатура","СРЕД($СпрИДД.Элемент,5,6)",,4,1);
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"40=40","ЛЕВО($СпрИДД.Элемент,4)=:ВидСправочника.Номенклатура");
   ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,Запрос,"Склады","СРЕД($СпрИДД.Элемент,5,6)",,5,1);
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"50=50","ЛЕВО($СпрИДД.Элемент,4)=:ВидСправочника.МестаХранения");
   тз = Запрос.Выполнить(,ТекстЗапроса);
1 viktor_vv
 
22.05.13
10:28
Спраовчник общего вида в базе это поле длиной 13 символов. Первые 4 - вид справочника, остальные 9 - ИД элемента.
Так что

СРЕД($СпрИДД.Элемент,5,6) ->> СРЕД($СпрИДД.Элемент,5,9)
2 viktor_vv
 
22.05.13
10:32
Хотя в качестве праметра лучше передавать сразу с видом, или использовать модификаторы, не знаю есть ли это в классе прямой запрос, похоже это он используется.
3 Dolly_EV
 
22.05.13
10:32
П..ть! лошара! ну конечно 9!
(1) спасибо! Тема закрыта.
4 Dolly_EV
 
22.05.13
10:33
(2) "Хотя в качестве праметра лучше передавать сразу с видом, или использовать модификаторы" не понял, растолкуй подробнее?
5 Ёпрст
 
22.05.13
10:46
(4) достраивать до 13
6 Ёпрст
 
22.05.13
10:46
т.е вид слева прибавлять в условии, а не кастрировать до id=9
7 Ёпрст
 
22.05.13
10:47
id справочников уникальны только в пределах вида, кастрируя в запросе - нарвешься, что получишь не тот вид справочника в итоге, ибо id могут совпадать.
8 Андрей_Андреич
 
naïve
22.05.13
10:50
(7) Только хотел спросить, встречалось ли на практике.
И вспомнил - у меня встречалось.
9 Dolly_EV
 
22.05.13
11:36
(6) т.е. укладывая в список элементы, достраивать их с 9 до 13? и сравнивать со списком уже не СРЕД($СпрИДД.Элемент,5,9), а просто $СпрИДД.Элемент?

но и с условиями в такос виде (И)ИЛИ(И)... какая-то х..ня получается :-(
10 Dolly_EV
 
22.05.13
11:42
+(9) да и УложитьСписокОбъектов() только CHAR(9) делает и придется все фильтры ручками перебирать :-(
11 viktor_vv
 
22.05.13
11:49
Вроде как есть УложитьСписокОбъектов13() укладывает именно так, но он иерархию не укладывает, вернее если в списке группы, то подчиненные не уложит.
12 Dolly_EV
 
22.05.13
11:58
(11) угу есть, но иерархию не укладывает
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс