Имя: Пароль:
1C
1С v8
Условие в запросе работает не так, как ожидается.
,
0 prilforreal
 
11.10.17
08:43
Доброго утречка! Помогите разобраться! Конфигурация самописная, 1с8.3. Пишу обработку для почтовой рассылки, устанавливаю условие для возможности отбора получателей по городу, группе в справочнике или по ответственному, но работает отбор только по группе.

Вот текст запроса:

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагент.Ссылка КАК Дилер,
        |    Контрагент.ЭлПочта КАК ЭлПочта,
        |    Контрагент.Город,
        |    Контрагент.Ответственный
        |ИЗ
        |    Справочник.Контрагент КАК Контрагент
        |ГДЕ
        |    (Контрагент.Ссылка В ИЕРАРХИИ (&ВыбДилер)
        |            ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка)
        |                И (Контрагент.Город В ИЕРАРХИИ (&ВыбГород)
        |                    ИЛИ &ВыбГород = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка))
        |                И (Контрагент.Ответственный В ИЕРАРХИИ (&ВыбОтветственный)
        |                    ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка)))
        |
        |УПОРЯДОЧИТЬ ПО
        |    Контрагент.Наименование";
1 DrShad
 
11.10.17
08:46
скобки не там стоят
2 catena
 
11.10.17
08:46
Почему у вас все время "неверно работает", а не "я фигню какую-то написал"?
Логические операции имеют приоритет выполнения, так же, как сложение и умножение. У оператора И приоритет выше, чем у оператора ИЛИ. Оператор НЕ выполняется в первую очередь...

Скобки расставь, короче.
3 prilforreal
 
11.10.17
08:49
(2) Спасибо, у меня все неверно работает из-за того что я написал фигню из-за неведения, век живи-век учись!)
4 Ненавижу 1С
 
гуру
11.10.17
08:53
и еще в условии

Контрагент.Ссылка В ИЕРАРХИИ (&ВыбДилер)
ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка)

вторая часть явно лишняя, достаточно:

Контрагент.Ссылка В ИЕРАРХИИ (&ВыбДилер)
5 VladZ
 
11.10.17
08:55
Я в таких случаях использую конструкцию:

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагент.Ссылка КАК Дилер,
        |    Контрагент.ЭлПочта КАК ЭлПочта,
        |    Контрагент.Город,
        |    Контрагент.Ответственный
        |ИЗ
        |    Справочник.Контрагент КАК Контрагент
        |ГДЕ
        |    1 = 1
        |и  2 = 2
        |и 3 = 3
        |УПОРЯДОЧИТЬ ПО
        |    Контрагент.Наименование";

Если значениезаполнено(ВыбГород) Тогда
Запрос.текст = СтрЗаменить(Запрос.Текст, "1 = 1", "Контрагент.Ссылка В ИЕРАРХИИ (&ВыбДилер)")
КонецЕсли;

// по аналогии условие по городу (заменяем "2 = 2") и ответственному (заменяем "3 = 3").

В итоге получается, что условия накладываются только в случае если значение заполнено. И нет надобности со скобками разбираться.
6 VladZ
 
11.10.17
08:56
упс. Опечатка: Если значениезаполнено(ВыбДилер)...
7 prilforreal
 
11.10.17
08:59
(5) Расставил скобки правильно и все заработало при любом сочетании условий!


"ВЫБРАТЬ
        |    Контрагент.Ссылка КАК Дилер,
        |    Контрагент.ЭлПочта КАК ЭлПочта,
        |    Контрагент.Город,
        |    Контрагент.Ответственный
        |ИЗ
        |    Справочник.Контрагент КАК Контрагент
        |ГДЕ
        |    (Контрагент.Ссылка В ИЕРАРХИИ (&ВыбДилер)
        |            ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
        |                И (Контрагент.Город В ИЕРАРХИИ (&ВыбГород)
        |                    ИЛИ &ВыбГород = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка))
        |                И (Контрагент.Ответственный В ИЕРАРХИИ (&ВыбОтветственный)
        |                    ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
        |
        |УПОРЯДОЧИТЬ ПО
        |    Контрагент.Наименование";
8 DrShad
 
11.10.17
09:00
(7) внезапно, да?
9 Ненавижу 1С
 
гуру
11.10.17
09:03
(5) почти также, но более осмысленно, например:

ВЫБРАТЬ
  Ссылка
ИЗ Справочник.Контрагенты
ГДЕ &УсловиеИерархии


ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеИерархии",?(УсловиеЕсть,"Ссылка=&Тынц","ИСТИНА"));
10 prilforreal
 
11.10.17
09:06
(2) Особая благодарность catena за разъяснения с приоритетами операторов, все кристально ясно)
11 catena
 
11.10.17
09:06
+(9)И менее зависимо от изменения количества пробелов, например.
12 catena
 
11.10.17
09:07
(10)Ай, да не за что))
13 h-sp
 
11.10.17
09:34
ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка)

вот тут хрень какая-то. Получается Ответственный из справочника Контрагенты
14 prilforreal
 
11.10.17
12:08
(13) Так и есть, ответственный из справочника Котнрагент