Это что за покемон?

1. LIL_PIVO 1 18.11.20 08:18 Сейчас в теме
Всем привет!

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

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


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

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

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

В отладчике : СтрНайти(строкобщая,"1") =5 , получается: 5>1000<2001 общий результат истина.
Меняю: 1001 > 1000 < 2001 результат истина.
По теме из базы знаний
Найденные решения
2. comptr 33 18.11.20 08:25 Сейчас в теме
Скорее всего тут срабатывает такая логика:
СтрНайти(строкобщая,"1") > 1000 = Ложь или Истина,
Ложь = 0, а Истина = 1, оба они < 2001.
FatPanzer; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. spacecraft 18.11.20 08:52 Сейчас в теме
(1) судя по именам в коде планировалась такая логика:
Если СтрНайти(строкобщая,"1") > 1000 И СтрНайти(строкобщая,"1") < 2001 Тогда

И судя по всему простейшая проверка прошла на Истина.
Просто ошибка кода. Ничего более.
2. comptr 33 18.11.20 08:25 Сейчас в теме
Скорее всего тут срабатывает такая логика:
СтрНайти(строкобщая,"1") > 1000 = Ложь или Истина,
Ложь = 0, а Истина = 1, оба они < 2001.
FatPanzer; +1 Ответить
3. LIL_PIVO 1 18.11.20 08:35 Сейчас в теме
(2) Тоже так думаю. Но хотел удостоверится, а то мало ли какой-то новый условный оператор))

З.Ы. Зачем проверка на меньше 2001 мы никогда не узнаем
5. zarankony 306 18.11.20 09:41 Сейчас в теме
Думаю там 5 > Истина (1000 < 2001)
6. FatPanzer 18.11.20 09:46 Сейчас в теме
(5) Думаю, не так. Вычисление логических выражений происходит слева направо. Поэтому 5>1000<2001:
1) 5 > 1000 = Ложь.
2) Ложь < 2001 = 0 < 2001 = Истина.
7. zarankony 306 18.11.20 10:09 Сейчас в теме
(6)а как же тогда конструкции типа
ЭтоПредоплата = Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата;

Тут справа налево получается.
8. FatPanzer 18.11.20 10:15 Сейчас в теме
(7) Нет, потому что "ЭтоПредоплата" - это не часть выражения, это имя переменной, которой присваивается значение, полученное в результате вычисления выражения (Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата).
9. zarankony 306 18.11.20 11:12 Сейчас в теме
(8)Ну а тут будет
УсловиеЕсли = СтрНайти(строкобщая,"1") > 1000 < 2001;

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

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

УсловиеЕсли = УсловиеПредоплата = Объект.ТипОплаты = Перечисления.ТипыОплат.Предоплата;
Нет, в данном случае переменной будет являться "УсловиеЕсли", а "УсловиеПредоплата" будет уже частью выражения. И если оно не равно булеву или 0/1 - то вылетит ошибка приведения к типу "Булево".
13. FatPanzer 18.11.20 11:26 Сейчас в теме
(9) Например, ждем в "Переменная" структуру с ключом "Ключ структуры".
Попробуйте прочитать условие справа налево при Переменная = "ББ" или при отстутсвии в структуре ключа "КлючСтруктуры":
Если ТипЗнч(Переменная) = Тип("Структура") И Переменная.Свойство("КлючСтруктуры") И Переменная.КлючСтруктуры = "ААА" Тогда
15. zarankony 306 18.11.20 11:33 Сейчас в теме
(13)Это не корректный пример, тут точно проверяет слева направо, если первое не сработает, второе и проверять не будет, это точно.
17. FatPanzer 18.11.20 11:36 Сейчас в теме
(15) Ну и откуда система знает откуда ей проверять - справа или слева? Ответ прост: система ничего не знает, зато программист знает порядок вычисления, когда пишет логические выражения.

И именно поэтому мой пример абсолютно корректен, нагляден, и (о боже) работоспособен.
18. zarankony 306 18.11.20 11:39 Сейчас в теме
(17)Лично я на порядок не полагаюсь, а использую скобки, а в моем примере путанница с "=", все оттого что у нас нет "==" для сравнения.
10. zarankony 306 18.11.20 11:16 Сейчас в теме
(8)И только что проверил 0 = Ложь, 1 = Истина, 5 > Истина, это все отрабатывает в коде.
12. FatPanzer 18.11.20 11:19 Сейчас в теме
(10) То, что результат в обоих случаях получается одинаковый - еще не означает, что выражение разбирается справа налево. Выражение разбирается с начала, и результат считается "нарастающим итогом".

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот