Имя: Пароль:
1C
1C 7.7
v7: Запрос, условие отрицания
,
0 lg2marvel
 
29.07.13
16:29
Добрый день.
Есть запрос:
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Поставщик = Справочник.Поставщики.Поставщик;
        |МестоХранения = Справочник.МестаХранения.ТекущийЭлемент;
        |ТМЦ = Справочник.ТМЦ.ТекущийЭлемент;
        |НеАктуальный = Справочник.ТМЦ.ТекущийЭлемент.НеАктуальный;
        |Условие(Поставщик.Принадлежит(выбПоставщик))=0;
    //    |Условие (НЕ(Поставщик в (выбПоставщик)));
        |Группировка МестоХранения без групп;  
        |Группировка ТМЦ без групп Все ВошедшиеВЗапрос;  
        |Группировка Поставщик без групп;
        |Обрабатывать НеПомеченныеНаУдаление;
        |"//}}ЗАПРОС

Для справочника ТМЦ есть подчиненный справочник Поставщики. Нужно чтоб запрос выдавал результат только тех позиций, по которым нет записей в подчиненном справочнике.

Подскажите плз, как быть?
1 lg2marvel
 
29.07.13
16:55
Забыл уточнить, данный пример выдает ошибку:

Условие(Поставщик.Принадлежит(выбПоставщик) <<?>> )=0;
Запрос[6] : Неправильное использование операции сравнен
2 ДенисЧ
 
29.07.13
16:56
|Условие(Поставщик.Принадлежит(выбПоставщик)=0);
3 viktor_vv
 
29.07.13
17:03
Так вроде тоже должно работать

|Условие (НЕ(Поставщик В ВыбПоставщик));
4 lg2marvel
 
30.07.13
10:46
Большое спасибо. Не знаю почему (3) вчера не работал.
5 viktor_vv
 
30.07.13
11:50
(4) Скобки лишние

в (выбПоставщик)
6 lg2marvel
 
30.07.13
14:13
(3) условие явно не верно :-( выводит всех кроме указанных в выбПоставщик.

Подскажите как можно проверить отсутствие в подчиненном справочнике записи с полем = выбМестоХранения
7 lg2marvel
 
30.07.13
14:19
Структура следующая:
Справочник ТМЦ
Подчиненный справочник Поставщики
поле МестоХранения
поле Поставщик

Запросом в (0) получаю ТМЦ, Поставщика для данного МестоХранения

А вот как сделать наоборот ума не приложу.
8 lg2marvel
 
30.07.13
14:21
На условие
|Условие(Поставщик.Принадлежит(выбПоставщик))=0;

ругается при выполнении:

---------------------------
1С:Предприятие
---------------------------
Поле агрегатного объекта не обнаружено (Принадлежит): 2  
---------------------------
ОК  
---------------------------
9 пипец
 
30.07.13
14:24
почитай СП ...

Принадлежит(<?>)
Синтаксис:
Принадлежит(<Значение>)
Назначение:
Проверяет вхождение в список значений указанного значения, т.е. , является ли значение подмножеством списка значений
Возвращает число: 1 - если проверяемое значение входит в список значений; 0 - если не входит
10 Ёпрст
 
30.07.13
14:31
(8)

|Условие(Поставщик.Принадлежит(выбПоставщик)=0);
11 lg2marvel
 
30.07.13
14:41
(10) Да, так и было в запросе, не с той строки скопировал.
12 viktor_vv
 
30.07.13
15:02
|Поставщик = Справочник.Поставщики.Поставщик;
//        |МестоХранения = Справочник.МестаХранения.ТекущийЭлемент;
        |ТМЦ = Справочник.ТМЦ.ТекущийЭлемент,Справочник.Поставщики.Владелец;
        |НеАктуальный = Справочник.ТМЦ.ТекущийЭлемент.НеАктуальный;
        |Условие(Поставщик.Принадлежит(выбПоставщик))=0;
    //    |Условие (ПустоеЗначение(Поставщик)=1);

//        |Группировка МестоХранения без групп;  
        |Группировка ТМЦ без групп Все ВошедшиеВЗапрос;  
        |Группировка Поставщик без групп;
        |Обрабатывать НеПомеченныеНаУдаление;
        |"//}}ЗАПРОС

Если по первоначальному запросу, то как-то так. Опять же не уверен. И не совсем понятно как связаны Места хренения с ТМЦ и Поставщиками.
13 Ёпрст
 
30.07.13
15:06
(11) тогда так:

    
(8)

|Условие(выбПоставщик.Принадлежит(Поставщик)=0);
где ВыбПоставщик - реквизит диалога или СЗ .
14 lg2marvel
 
30.07.13
15:23
(13) да, ВыбПоставщик - реквизит диалога.
Поставщик = Справочник.Поставщики.Поставщик;

Но результат тот же:
---------------------------
1С:Предприятие
---------------------------
Поле агрегатного объекта не обнаружено (Принадлежит): 2  
---------------------------
ОК  
---------------------------
Хотя тут (Результаты запроса в список значений все аналогично, но работает.
15 Voronve
 
30.07.13
15:29
"//{{ЗАПРОС(Сформировать)
|ТМЦ = Справочник.ТМЦ.ТекущийЭлемент, Справочник.Поставщики.Владелец;
|Поставщик = Справочник.Поставщики.Поставщик;
|МестоХранения = Справочник.Поставщики.МестоХранения;
|НеАктуальный = Справочник.Поставщики.Владелец.НеАктуальный;
|Условие(ПустоеЗначение(Поставщик) = 1);
|Группировка МестоХранения без групп;  
|Группировка ТМЦ без групп Все ВошедшиеВЗапрос;  
|Группировка Поставщик без групп;
|Обрабатывать НеПомеченныеНаУдаление;
|"//}}ЗАПРОС
16 lg2marvel
 
30.07.13
15:42
(12) Ваш вариант проверить не удалось, причина в (8)(14),
попробовал так:

|Поставщик = Справочник.Поставщики.Поставщик;
|МестоХранения = Справочник.МестаХранения.ТекущийЭлемент;
|ТМЦ = Справочник.ТМЦ.ТекущийЭлемент,Справочник.Поставщики.Владелец;
|НеАктуальный = Справочник.ТМЦ.ТекущийЭлемент.НеАктуальный; |Условие (НЕ(Поставщик в выбПоставщик));  
|Группировка МестоХранения без групп;  
|Группировка ТМЦ без групп Все ВошедшиеВЗапрос;  
|Группировка Поставщик без групп;
|Обрабатывать НеПомеченныеНаУдаление;

Получаю данные полностью с группы справочника ТМЦ = выбТовар.
Связь между Место хренения, ТМЦ и Поставщиками следующая:
Поставщики - подчиненный для ТМЦ, Поставщики имеет реквизиты  Место хранения и Поставщик по которым делаем отбор ТМЦ в таблицу.

(15) Получаю данные полностью с группы справочника ТМЦ = выбТовар

Такое ощущение что условие полностью игнорируется, т.к. убрал его и получил тот же результат.
17 viktor_vv
 
30.07.13
15:46
(16) Там не то закоментил.

//        |Условие(Поставщик.Принадлежит(выбПоставщик))=0;
        |Условие (ПустоеЗначение(Поставщик)=1);

Это тоже, что и в (15).
18 lg2marvel
 
30.07.13
16:01
(17) (15) (13)
Может сформировать полный список ТМЦ а потом отобрать те в которых нет поставщиков?
19 Voronve
 
30.07.13
16:03
(18) "нет поставщиков" это нет записей в подчиненном справочнике или поле постащик пустое ?
20 Ёпрст
 
30.07.13
16:12
(16) что это ?!

выкинуть всё в топку.
21 lg2marvel
 
30.07.13
16:13
(19) нет записей
22 lg2marvel
 
30.07.13
16:14
(19) нет записей в подчиненном справочнике
23 uno-group
 
30.07.13
16:15
глянь типовую там категориитоваров так реализованы. делается в 2 запроса. одним некак
24 lg2marvel
 
30.07.13
17:36
Пробую так:
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Поставщик = Справочник.Поставщики.Поставщик;
   |МестоХранения = Справочник.Поставщики.МестоХранения;
   |ТМЦ = Справочник.Поставщики.Владелец;    
   |НеАктуальный = Справочник.Поставщики.Владелец.НеАктуальный;
   |Группировка МестоХранения без групп;
   |Группировка ТМЦ без групп;
   |Группировка Поставщик без групп;
   |Обрабатывать НеПомеченныеНаУдаление;
   |"//}}ЗАПРОС
   ;    
   ТекстЗапроса = ТекстЗапроса + "Условие (Поставщик в выбПоставщик);";                    
   ТекстЗапроса = ТекстЗапроса + "Условие(НеАктуальный = 0);";        
   ТекстЗапроса = ТекстЗапроса + "Условие (ТМЦ в ВыбТовар);";    
   ТекстЗапроса = ТекстЗапроса + "Условие (МестоХранения в МФВыбСклады);";    
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   сз = СоздатьОбъект("СписокЗначений");
   Запрос.Выгрузить(сз);  
   
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Поставщик = Справочник.Поставщики.Поставщик;
   |МестоХранения = Справочник.Поставщики.МестоХранения;
   |ТМЦ = Справочник.Поставщики.Владелец;    
   |НеАктуальный = Справочник.Поставщики.Владелец.НеАктуальный;
   |Условие (Поставщик<>сз);
   |Группировка МестоХранения без групп;
   |Группировка ТМЦ без групп;
   |Группировка Поставщик без групп;
   |Обрабатывать НеПомеченныеНаУдаление;
   |"//}}ЗАПРОС
   ;

Получается с точностью наоборот. Отбираются те данные которые есть в сз, а нужно наоборот - те которых там нет.
25 Ёпрст
 
30.07.13
17:48
да ужж.

|Условие (Поставщик<>сз);
26 lg2marvel
 
31.07.13
15:12
Странное дело, не сравнивает даже со списком значений.

|Условие (сз.Принадлежит(Поставщик) = 0);

Поле агрегатного объекта не обнаружено (Принадлежит): 2
27 Ёпрст
 
31.07.13
15:25
(26) еще бы, чорный запрос не умеет выгружать в СЗ, у тебя в СЗ сейчас - таблица значений.
28 Ёпрст
 
31.07.13
15:26
дальше думай сам
29 lg2marvel
 
31.07.13
16:12
Ага, Вы открыли мне глаза.

Дуже дякую.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.