Здравствуйте коллеги. Наткнулся на почему-то неожиданную для меня особенность компиляции кода 1с83.
Под разными ролями пользователей выражение вида (Истина Или Неопределено) обрабатывается по разному. Например, под полными правами выражение возвращает значение типа булево, с другими ролями это выдает ошибку.
Подскажите, какие права в роли отвечают за такое поведение, или где смотреть?
PS
Да, косяк.
Под всеми правами Булево или Непределено отрабатывает одинаково.
Истина Или Неопределено возвращает Истина
Ложь Или Неопределено возвращает Ошибку.
Ложь или Неопределено=Истина ошибки не возвращает )
Чтоб не ошибки нужно заставлять разработчика не лениться, а дописывать в логических конструкциях: Флаг = ( А=Истина или Б=Истина );
Всем спасибо))
Под разными ролями пользователей выражение вида (Истина Или Неопределено) обрабатывается по разному. Например, под полными правами выражение возвращает значение типа булево, с другими ролями это выдает ошибку.
Подскажите, какие права в роли отвечают за такое поведение, или где смотреть?
PS
Да, косяк.
Под всеми правами Булево или Непределено отрабатывает одинаково.
Истина Или Неопределено возвращает Истина
Ложь Или Неопределено возвращает Ошибку.
Ложь или Неопределено=Истина ошибки не возвращает )
Чтоб не ошибки нужно заставлять разработчика не лениться, а дописывать в логических конструкциях: Флаг = ( А=Истина или Б=Истина );
Всем спасибо))
По теме из базы знаний
- Использование хранилища общих настроек вместо "НайтиПоНаименованию" или "НайтиПоКоду"
- Профили управления доступом к объектам в любой конфигурации на БСП
- Красота разработки в 1С, или художественная верстка кода
- TCP прокси-сервер хранилища конфигурации 1С
- "Чистый код в 1С" или как прокачать свой код? Пошаговая инструкция, часть №1
Найденные решения
(17)
Обрабатывается для всех одинаково. Логика едина.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
(17)
Ошибка, естественно.
вопрос почему под разными ролями обрабатывается по разному, где настраивать?
Обрабатывается для всех одинаково. Логика едина.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
(17)
если А=Ложь, а Б=Неопределено что возвращается?
Ошибка, естественно.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5)
Код приблизительно такой:
Флаг = РольДоступна("ПолныеПрава") Или П1 Или Ф1;
Если значение п1 или ф1 будет Неопределено, то под полными правами все выражение приводится к булево, а без полных прав - ошибка преобразования типов.
Решается конечно легко так:
Флаг =РольДоступна("ПолныеПрава") Или П1=Истина Или Ф1=Истина;
Но интересует где настраивается такое поведение для разных ролей?
Код приблизительно такой:
Флаг = РольДоступна("ПолныеПрава") Или П1 Или Ф1;
Если значение п1 или ф1 будет Неопределено, то под полными правами все выражение приводится к булево, а без полных прав - ошибка преобразования типов.
Решается конечно легко так:
Флаг =РольДоступна("ПолныеПрава") Или П1=Истина Или Ф1=Истина;
Но интересует где настраивается такое поведение для разных ролей?
(12)При чем тут роли?
В 1С ленивое вычисление условий.
То есть если условие вида "А ИЛИ Б ИЛИ В", то если А = Истина, на этом вычисление заканчивается, т.к. этого достаточно. И не важно какие значения у Б и В.
И только если А = Ложь, то вычисляются следующие выражения условия.
Как раз то, что у вас и происходит.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
В 1С ленивое вычисление условий.
То есть если условие вида "А ИЛИ Б ИЛИ В", то если А = Истина, на этом вычисление заканчивается, т.к. этого достаточно. И не важно какие значения у Б и В.
И только если А = Ложь, то вычисляются следующие выражения условия.
Как раз то, что у вас и происходит.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
(17)
Обрабатывается для всех одинаково. Логика едина.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
(17)
Ошибка, естественно.
вопрос почему под разными ролями обрабатывается по разному, где настраивать?
Обрабатывается для всех одинаково. Логика едина.
У пользователя с полными правами все заканчивается на вычислении первого выражения.
Для остальных пользователей - выполняется попытка вычислить остальные выражения и валится.
(17)
если А=Ложь, а Б=Неопределено что возвращается?
Ошибка, естественно.
(8)Ну так у вас у пользователя не хватает прав на вычисление значения "истина" или "неопределено". Скорее всего, можно в журнале посмотреть, на что именно не хватает прав этому пользователю.
Попробуйте в коде написать именно "Истина или Неопределено" и он вам отработает под любым пользователем.
Попробуйте в коде написать именно "Истина или Неопределено" и он вам отработает под любым пользователем.
(15)Если Истина ИЛИ Неопределено, то значение Неопределено не проверяется и не выдает ошибки (сразу возвращается истина)
Если Ложь ИЛИ Неопределено, то Неопределено проверяется и возвращается ошибка.
1С так работает для оптимизации. Поскольку в операторе ИЛИ истина тогда, когда хотябы одно значение равно истине. Поэтому остальные вычислять нет необходимости.
Можно попробовать поставить Неопределено на первое место. Тогда ошибка будет всегда.
Если Ложь ИЛИ Неопределено, то Неопределено проверяется и возвращается ошибка.
1С так работает для оптимизации. Поскольку в операторе ИЛИ истина тогда, когда хотябы одно значение равно истине. Поэтому остальные вычислять нет необходимости.
Можно попробовать поставить Неопределено на первое место. Тогда ошибка будет всегда.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот