Имя: Пароль:
1C
 
1С 7.7 Условие в запросе
,
0 Eeelena
 
07.11.14
16:12
Подскажите, как сделать условие в запросе, например когда нам нужно чтобы значение входило в список пишем условие:Условие(ЗначениеСвойства в СписокСвойств), а как сделать условие чтоб получить все записи кроме тех которые в СпискеСвойств????
1 Ёпрст
 
07.11.14
16:13
Не (Значение в список)
2 Ёпрст
 
07.11.14
16:14
но, иногда не будет это работать, обходят через Список.Принадлежит(Значение)=0
3 Eeelena
 
07.11.14
16:18
(2) то есть писать Условие(СписокСвойств.ПРинадлежит(ЗначениеСвойства)=0)
так?
4 Looser-1c
 
07.11.14
16:19
(3) Сначала с НЕ попробуй.
Ибо .Принадлжеит убъёт всю скорость в случае SQL
5 Ёпрст
 
07.11.14
16:20
(3) да
или так

Условие(Не ЗначениеСвойства в СписокСвойств)
6 Ёпрст
 
07.11.14
16:20
(4) с чего это ?
7 mehfk
 
07.11.14
16:21
Иногда и ВключитьSQL(0) нужно
8 Eeelena
 
07.11.14
16:24
(5) спасибо)
9 Looser-1c
 
07.11.14
16:25
(6) Это ТЫ спрашиваешь???
10 akaBrr
 
07.11.14
16:29
(6) Принадлежит, в случае если значением является иерархический справочник, будет проверять на вхождение значение в группы. Гораздо быстрее работает метод НайтиЗначение. И да, я присоединяюсь к (9), думаю что ты это знаешь.
11 Ёпрст
 
07.11.14
16:42
(9) а че нельзя ?

замеры делал давно ли ?
а в профайлере запрос давно глядел с Принадлежит и с "в" ?

(10) и че с того? "В"  тоже проверяет на вхождение в группу
12 GreyK
 
07.11.14
16:43
(10) А в списке СписокСвойств нельзя использовать группы, или движок не будет отрабатывать вхождение в группу!?
13 Looser-1c
 
07.11.14
16:43
(11) Делал. Одно на сервере, другое на клиенте. И не надо обманывать, что ты того не знаешь ))
14 GreyK
 
07.11.14
16:47
(13) Ужас, оказывается в 7ке ещё и "наСервере" уже прикрутили. До чего дожили, Улю на вас, дятлов, нету :)
15 Looser-1c
 
07.11.14
16:50
(14) На вас, дятлов, деревеьев не напасёшься.
Открою великий секрет - некоторые запросы (в случае базы SQL) 1с таки выполняет на сервере. Да на сервере SQL.
16 GreyK
 
07.11.14
16:59
(15) Вот ты и "секрет" мне открыл :), научись писать то, что хочешь сказать.
17 Looser-1c
 
07.11.14
17:03
(16) одна ошибка на килобайт мудрости.
Учись читасть между строк
18 КонецЦикла
 
07.11.14
17:04
(15) Даже пролистывание формы списка справочника выполяется на сервере :)
Тормоза начинаются когда 1С берется переваривать в кишках результаты запроса: группировка там и все такое, возня с ТЗ и проч.
В принципе довольно пристойно работают штатные запросы... надо с умом применять
19 Ёпрст
 
07.11.14
17:08
(13) да блин, разница будет лишь в том, что в одном случае в запросе будет фильр на список, а в другом - всё фильтруется на клиенте.. усё.
20 Eeelena
 
10.11.14
08:47
(19) писала и так Условие(СписокСвойств.ПРинадлежит(ЗначениеСвойства)=0)   и так  Условие(НЕ (ЗначениеСвойства в СписокСвойствК)) выбирает все( почему так?
21 Злопчинский
 
10.11.14
08:49
(20) вариант условия с СЗ.Принадлежит() - отрабатывает четко.
ищите проблемы в криоватых ручках.
возможно в списке значений у вас данные одного типа, а в поиске принадлежит вы подсовываете данные другого типа
22 Eeelena
 
10.11.14
08:54
(21) СписокСвойствК список контрагентов, ЗначениеСвойства ссылка на контрагента, вроде все правильно, но выбирает все равно всех
23 KUBIK
 
10.11.14
09:11
(0) Посмотри в типовой ТиС устройство МножественногоФильтра
24 Eeelena
 
10.11.14
09:13
(23) я смотрела, но не разобралась(
25 KUBIK
 
10.11.14
09:13
+(23) режим "Все, кроме"
26 KUBIK
 
10.11.14
09:21
Если ЕстьМФ = 1 Тогда        // есть множественный фильтр по позициям справочника
        Если ТипМФ=1 Тогда // принадлежит списку
            ТекстЗапроса = ТекстЗапроса+"Условие ("+ИмяПеремЗапроса+" в "+ИмяПоляМФ+");";
        Иначе    
            ТекстЗапроса = ТекстЗапроса+"Условие (НЕ("+ИмяПеремЗапроса+" в "+ИмяПоляМФ+"));";
        КонецЕсли;
    КонецЕсли;
27 Eeelena
 
10.11.14
09:27
(26) это из функции глФильтрПоСправочнику?
28 KUBIK
 
10.11.14
09:27
(27) Да
29 Eeelena
 
10.11.14
09:27
(27) а почему просто не работает Условие(НЕ (ЗначениеСвойства в СписокСвойствК))
30 Злопчинский
 
10.11.14
19:39
(22) скорее всего у вас в голове тара.. эээ.. изюминки!
потому как
"СписокСвойствК список контрагентов, ЗначениеСвойства ссылка на контрагента,"
.
- "это нэлза понять это надо запомнить"
.
СписокСвойствК - оказывается нифига не список свойств (Справочник.Свойства или Справочник.СовйтсваКонтрагентов) - а СПИСОК КОНТРАГЕНТОВ? - точно? сильно сомневаюсь?
.
ЗначениеСвойства - как говоришь - это ссылка на контрагента??? - очень сомневаюсь, м.б. это все таки ссылка Справочни.ЗначенияСвойств...?
.
у тебя все не фурычить ибо скорее всего список и поисковое значение - разных типов.
.
31 Злопчинский
 
10.11.14
19:40
(29) потому что см.(30) и также есть глюкобагофича - такая конструкция может не работать на скульной базе если в списке значяений всего одно значение
32 Злопчинский
 
10.11.14
19:41
Короче 9или шире?) - разбирайся внтмательно с типами данных участвующих в алгоритме. ставлю прямоуголник шоколада - что косяк именно в несоответсвии - ибо не понимаете по контрагентов, свойства и их значения
33 Eeelena
 
11.11.14
09:44
(32) Условие((ЗначениеСвойства в СписокСвойствК)) вот это условие работает, а это Условие(НЕ (ЗначениеСвойства в СписокСвойствК)) нет, как так?
34 Ёпрст
 
11.11.14
09:45
(33) база скуль ?
35 Ёпрст
 
11.11.14
09:45
если да, то перед запросм, Запрос.ВключитьSQL(0) воткни - бкдет работать, только скорость упадёт.. в разы.
36 Eeelena
 
11.11.14
09:47
(34) (35) нет
37 Ёпрст
 
11.11.14
09:53
(36) ок. Как проверяете неработоспособность ?
38 Ёпрст
 
11.11.14
09:53
без фильтра что ?
39 Ёпрст
 
11.11.14
09:53
а с фильтром что ?
40 Ёпрст
 
11.11.14
09:54
а теперь (НЕ с фильтром) что ?
41 Ёпрст
 
11.11.14
09:55
ну и.. текст запроса неплохо бы показать
42 Eeelena
 
11.11.14
10:00
(41) Вынесла часть обработки с этим запросом в отдельную, проверяю следующим образом, указываю свойство контрагента на форме, выбираю одно из, в списке свойств указываю значение свойства, запрос выдает список контрагентов.
Далее при всех тех же значениях только выбираю уже значение отбора  "все кроме", выводится весь список контрагентов, не исключая не нужные.

Код обработки:

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

    Если СписокСвойствК.РазмерСписка()>0 Тогда
       Если ЗначениеОтбора.ТекущаяСтрока()=1 Тогда
           ТекстЗапроса = ТекстЗапроса + "Условие(ЗначениеСвойства в СписокСвойствК);";
       ИначеЕсли ЗначениеОтбора.ТекущаяСтрока()=2 Тогда
              //ТекстЗапроса = ТекстЗапроса + "Условие(СписокСвойствК.Принадлежит(ЗначениеСвойства)=0);";
              ТекстЗапроса = ТекстЗапроса + "Условие(НЕ (ЗначениеСвойства в СписокСвойствК)) ;";
       КонецЕсли;
    КонецЕсли;
  
    
    ЗапросЗначенийСвойств.Выполнить(ТекстЗапроса);  
    
    
    
    ТабКонтрагентов = СоздатьОбъект("ТаблицаЗначений");
    ЗапросЗначенийСвойств.Выгрузить(ТабКонтрагентов);
    
    НПП = 0;
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ТолькоПросмотр(1);
    Таб.Опции(0,0,3,0);      
    Таб.ВывестиСекцию("Шапка");
    ТабКонтрагентов.ВыбратьСтроки();
    Пока     ТабКонтрагентов.ПолучитьСтроку() = 1 Цикл
        Клиент =     ТабКонтрагентов.Контрагент;
        
        НПП = НПП + 1;
        
        Таб.ВывестиСекцию("СтрокаКлиент");
        
        
    КонецЦикла;    
    
        Таб.Показать();
КонецПроцедуры  


Процедура ДобавитьОдну2()
    
    Спр = СоздатьОбъект("Справочник.ЗначенияСвойств");
    Спр.ИспользоватьВладельца(ВыбВидысвойств);
    Спр.ВыборГруппы(0);
    Если Спр.Выбрать("Выберите свойство","ДляВыбора") = 1 Тогда
        СписокСвойствК.ДобавитьЗначение(Спр.ТекущийЭлемент());
    КонецЕсли;
    
КонецПроцедуры

Процедура ДобавитьВсе2()
    
    Спр = "Справочник.ЗначенияСвойств";
    
    ФормаПодбора = Форма;
    
    ОткрытьПодбор(Спр,"ДляВыбора", ФормаПодбора, 1);
    
    ФормаПодбора.ИспользоватьВладельца(ВыбВидысвойств);
                                              
    ФормаПодбора.ВыборГруппы(0);
    
КонецПроцедуры        

Процедура УдалитьОдну2()
              
    Если СписокСвойствК.ТекущаяСтрока() > 0 Тогда
        СписокСвойствК.УдалитьЗначение(СписокСвойствК.ТекущаяСтрока());
    КонецЕсли;
    
КонецПроцедуры

Процедура УдалитьВсе2()
              
    СписокСвойствК.УдалитьВсе();
    
КонецПроцедуры  

Процедура ОбработкаПодбора(Значение)
    
    Если Значение.Вид() = "ЗначенияСвойств" Тогда
        СписокСвойствК.ДобавитьЗначение(Значение);
    КонецЕсли;

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


ЗначениеОтбора.ДобавитьЗначение("одно из");
ЗначениеОтбора.ДобавитьЗначение("все кроме"); (41) (41) (41) (41) (40) (40) (40)
43 Ёпрст
 
11.11.14
10:11
(42) всё правильно вам выдает
44 Ёпрст
 
11.11.14
10:11
подумайте
45 Eeelena
 
11.11.14
10:13
(44) если честно у меня уже нет вариантов, что я не так делаю(((
46 Ёпрст
 
11.11.14
10:15
(45) не фильтруете по виду свойства в запросе, это для начала
47 Ёпрст
 
11.11.14
10:16
у вас значение свойства может быть одинаковым для разных видов свойств, если че.
48 Eeelena
 
11.11.14
10:21
(46) то есть как должно быть??
49 Ёпрст
 
11.11.14
11:20
ща
50 Ёпрст
 
11.11.14
11:21
кину тест для проверки
51 Ёпрст
 
11.11.14
11:31
https://cloud.mail.ru/public/6328726fdb2b/123.ert

На вот.
Даю гарантию, что у тебя владелец свойства<> виду свойства в справочнике свойства контрагентов
52 Ёпрст
 
11.11.14
11:31
вот и видишь ты "не то" :)
53 Ёпрст
 
11.11.14
11:32
cloud.mail.ru/public/6328726fdb2b/123.ert
54 Eeelena
 
11.11.14
11:44
(53) спасибо вам огромное за помощь!
55 Ёпрст
 
11.11.14
11:49
т.е значение свойства имеет одинаковое название, только владелец другой - не тот что в фильтре выбираешь
56 Eeelena
 
11.11.14
11:52
(55) по идее в моей базе нет такого, чтобы для одного значения могло быть несколько владельцев
57 Ёпрст
 
11.11.14
11:54
(56) ты запусти мой отчет, поставь фильтр на одного "проблемного" клиентоса, добавь 1 свойство в фильтр и играйся с "все кроме".. потом в таблице щелкай на значение свойства и смотри - кто владелец, + смотри кто владелец свойства в фильтре..
58 Ёпрст
 
11.11.14
11:54
они будут разными
59 Ёпрст
 
11.11.14
11:54
скорее всего
60 Ёпрст
 
11.11.14
11:55
щелкай на таблицу - откроется элемент справочника..ну и смотри кто его владелец, какой у него код..
61 Ёпрст
 
11.11.14
11:57
Грубо, у тебя так сейчас:

есть вид свойства Валенки и его значение Летние
и есть вид свойства Сапоги и значение Летние.

А в справочнике СвойстваКлиентосов у тебя в виде свойства висит вид свойства Валенки, а в ЗначениеСвойства - Летние от Сапог...
фирштейн ?
62 Eeelena
 
11.11.14
12:03
(61) ага, спасибо)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан