Всем привет!

Дорабатываю самописную конфу и наткнулся на такое условие, оставшееся от предыдущего программиста (он давно уволился):

```1c
    Если СтрНайти(строкобщая,"1") > 1000 < 2001 Тогда
    ТекущийОбъект.ПраваСтрокаСпр = Сред(строкобщая,1001,1000);
    КонецЕсли;
```

Строка общая (строкобщ) это объединение строк праваНаДоки (длина 1000) и праваНаСправочники ( длина 1000) единичка означает истину.

Буду всё грохать и писать по новой.

Но не даёт покоя понять логику этого условия, как оно отрабатывает?

В отладчике : СтрНайти(строкобщая,"1") =5 , получается: 5>1000<2001 общий результат истина.
Меняю: 1001 > 1000 < 2001 результат истина.
---
Скорее всего тут срабатывает такая логика:
СтрНайти(строкобщая,"1") > 1000 = Ложь или Истина,
Ложь = 0, а Истина = 1, оба они < 2001.
---
судя по именам в коде планировалась такая логика:

```1c
    Если СтрНайти(строкобщая,"1") > 1000 И СтрНайти(строкобщая,"1") < 2001 Тогда
```

И судя по всему простейшая проверка прошла на Истина.
Просто ошибка кода. Ничего более.
---
Скорее всего тут срабатывает такая логика:
СтрНайти(строкобщая,"1") > 1000 = Ложь или Истина,
Ложь = 0, а Истина = 1, оба они < 2001.
---
Тоже так думаю. Но хотел удостоверится, а то мало ли какой-то новый условный оператор))

З.Ы. Зачем проверка на меньше 2001 мы никогда не узнаем
---
Думаю там 5 > Истина (1000 < 2001)
---
Думаю, не так. Вычисление логических выражений происходит слева направо. Поэтому 5>1000<2001:
1) 5 > 1000 = Ложь.
2) Ложь < 2001 = 0 < 2001 = Истина.
---
а как же тогда конструкции типа

```1c
    ЭтоПредоплата = Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата;
```

Тут справа налево получается.
---
Нет, потому что "ЭтоПредоплата" - это не часть выражения, это имя переменной, которой присваивается значение, полученное в результате вычисления выражения (Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата).
---
Ну а тут будет

```1c
    УсловиеЕсли = СтрНайти(строкобщая,"1") > 1000 < 2001;
```

так же можно было написать

```1c
    УсловиеЕсли = УсловиеПредоплата = Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата;
```

все равно будет справа налево.
---
```1c
    УсловиеЕсли = СтрНайти(строкобщая,"1") > 1000 < 2001;
```
 Именно так, и поэтому правильный ответ приведен в (2), где выражение разбирается слева направо.

```1c
    УсловиеЕсли = УсловиеПредоплата = Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата;
```
 Нет, в данном случае переменной будет являться "УсловиеЕсли", а "УсловиеПредоплата" будет уже частью выражения. И если оно не равно булеву или 0/1 - то вылетит ошибка приведения к типу "Булево".
---
Например, ждем в "Переменная" структуру с ключом "Ключ структуры".
Попробуйте прочитать условие справа налево при Переменная = "ББ" или при отстутсвии в структуре ключа "КлючСтруктуры":

```1c
    Если ТипЗнч(Переменная) = Тип("Структура") И Переменная.Свойство("КлючСтруктуры") И Переменная.КлючСтруктуры = "ААА" Тогда
```
---
Это не корректный пример, тут точно проверяет слева направо, если первое не сработает, второе и проверять не будет, это точно.
---
Ну и откуда система знает откуда ей проверять - справа или слева? Ответ прост: система ничего не знает, зато программист знает порядок вычисления, когда пишет логические выражения.

И именно поэтому мой пример абсолютно корректен, нагляден, и (о боже) работоспособен.
---
Лично я на порядок не полагаюсь, а использую скобки, а в моем примере путанница с "=", все оттого что у нас нет "==" для сравнения.
---
И только что проверил 0 = Ложь, 1 = Истина, 5 > Истина, это все отрабатывает в коде.
---
То, что результат в обоих случаях получается одинаковый - еще не означает, что выражение разбирается справа налево. Выражение разбирается с начала, и результат считается "нарастающим итогом".

Вы как вообще условием ИЛИ пользуетесь при таком подходе?
---
Это не мой подход)) Чисто теория. 1 > 1000 < 2001 - проверил. Получается если бы считалось справа, то 1> истина = неверно. Слева направо - верно. А вот присвавание видимо всегда в очереди последнее.
---
А вот присвавание видимо всегда в очереди последнее. Может потому что присваивание - это не часть вычисляемого выражения, а получение результата вычисления? Естественно ,что сначала высчитывается результат, и только потом он присваиваевается переменной (в случае необходимости). Например, при использовании "Если..." присваивания нет, поэтому просто анализируется непосредственный результат вычисления.