Здравствуйте коллеги. Наткнулся на почему-то неожиданную для меня особенность компиляции кода 1с83.
Под разными ролями пользователей выражение вида (Истина Или Неопределено) обрабатывается по разному. Например, под полными правами выражение возвращает значение типа булево, с другими ролями это выдает ошибку.
Подскажите, какие права в роли отвечают за такое поведение, или где смотреть?

PS
Да, косяк.
Под всеми правами Булево или Непределено отрабатывает одинаково.
Истина Или Неопределено возвращает Истина
Ложь Или Неопределено возвращает Ошибку.

Ложь или Неопределено=Истина ошибки не возвращает )

Чтоб не ошибки нужно заставлять разработчика не лениться, а дописывать в логических конструкциях: Флаг = ( А=Истина или Б=Истина );

Всем спасибо))
---
вопрос почему под разными ролями обрабатывается по разному, где настраивать?
Обрабатывается для всех одинаково. Логика едина.

У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.

(17) если А=Ложь, а Б=Неопределено что возвращается?
Ошибка, естественно.
---
какую ошибку то выдает?
---
ошибку преобразования типов. Сейчас смоделирую )
Давно исправил и забыл, но интерес остался. Сейчас есть минутка задать вопрос
---
Преобразование значения к типу Булево не может быть выполнено
---
А точно прям в коде "Истина ИЛИ Неопределено" или, может, эти значения возвращают какие-то другие функции, в которых могут быть запросы к полям, к которым у пользователя нет прав?
---
там выражение с переменными конечно, это рабочий код. под полными правами), а без полных ошибка
---
ну логично же что под ограниченными правами нет доступа к каким-то объектам метаданных. Допустим, какая-то функция не выполняется и не может вернуть тип Булево, а у вас проверка по типу Булево. Отсюда и ошибка. Тема создана ради темы.
---
Код приблизительно такой:
Флаг = РольДоступна("ПолныеПрава") Или П1 Или Ф1;

Если значение п1 или ф1 будет Неопределено, то под полными правами все выражение приводится к булево, а без полных прав - ошибка преобразования типов.

Решается конечно легко так:
Флаг =РольДоступна("ПолныеПрава") Или П1=Истина Или Ф1=Истина;

Но интересует где настраивается такое поведение для разных ролей?
---
При чем тут роли?
В 1С ленивое вычисление условий.
То есть если условие вида "А ИЛИ Б ИЛИ В", то если А = Истина, на этом вычисление заканчивается, т.к. этого достаточно. И не важно какие значения у Б и В.

И только если А = Ложь, то вычисляются следующие выражения условия.

Как раз то, что у вас и происходит.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
---
вопрос почему под разными ролями обрабатывается по разному, где настраивать?

согласен, что с ИСТИНА поспешил, я имел в виду тип данных,
но нужно было писать ЛОЖЬ )
если А=Ложь, а Б=Неопределено что возвращается?
---
вопрос почему под разными ролями обрабатывается по разному, где настраивать?
Обрабатывается для всех одинаково. Логика едина.

У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.

(17) если А=Ложь, а Б=Неопределено что возвращается?
Ошибка, естественно.
---
спасибо, вариант )
---
может на это значение просто прав не хватает?
---
а какие должны быть права?
---
вам нужно сперва понять что на какой то объект действительно прав не хватает. а потом посмотреть какие права нужны на него.
---
там нет объектов. преобразование простых типов
---
ну это какой то объект базы или просто переменная?
---
Ну так у вас у пользователя не хватает прав на вычисление значения "истина" или "неопределено". Скорее всего, можно в журнале посмотреть, на что именно не хватает прав этому пользователю.
Попробуйте в коде написать именно "Истина или Неопределено" и он вам отработает под любым пользователем.
---
согласен, некорректно написал, Истина или Неопределено всегда вернет Истина
а вот Ложь или Неопределено ведет себя странно
---
а вот Ложь или Неопределено ведет себя странно
Даже комментировать не буду.. надеюсь вы поймете сами, какую чушь написали.
---
меня просто интересует параметр, с которым под одной ролью:
А или Неопределено = А
а под другой:
А или Неопределено - ошибка преобразования
---
Нет такого параметра, это логика вычисления выражений.

Замените ИЛИ на И, тогда будут всегда вычисляться все выражения.

То есть "А И Неопределено" - всегда будет выдаваться ошибка преобразования, т.к. Неопределено к булево не приводится.
---
Если Истина ИЛИ Неопределено, то значение Неопределено не проверяется и не выдает ошибки (сразу возвращается истина)
Если Ложь ИЛИ Неопределено, то Неопределено проверяется и возвращается ошибка.
1С так работает для оптимизации. Поскольку в операторе ИЛИ истина тогда, когда хотябы одно значение равно истине. Поэтому остальные вычислять нет необходимости.
Можно попробовать поставить Неопределено на первое место. Тогда ошибка будет всегда.
---
да я вкурсе.
там было длинное выражение в котором была и проверка в т.ч. на ПолныеПрава, потому под полными правами, и еще какими-то, срабатывало )
а когда в конец дописали "или ещё_один_флаг", то кому-то стало плохо )
---
Лёгкий намёк автору...

http://pics.wfido.ru/img/true_lgye7.png