Уважаемые эксперты, пожалуйста подскажите логику условия! Какой же хочется закричать от беспомощности, голова не варит! Прошу Вас помогите

У меня есть документ; есть перечисление с тремя реквизитами (А,Б,В); и есть Роль

У меня есть два варианта событий -
1 вариант) Если роль не доступна и/или в документе не выбрано данное перечисление А -> Тогда записать документ нельзя
2 вариант) Если роль доступна тогда можно выбрать любое из перечислений (А,Б,В)

Я написал так и мой код не работает -

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

```1c
    Если НЕ РольДоступна("ЭтаСамаяРоль") И НЕ Перечисления.ВидыОпераций.А = Истина Тогда // 1 вариант) Если роль не доступна и в документе не выбрано перечисление А
    Отказ = Истина;
    Сообщить("Нет роли и выбрали вид операции Списание А - Вам не положено");
    ИначеЕсли РольДоступна("ЭтаСамаяРоль") И Не ЗначениеЗаполнено(Перечисления.ВидыОпераций) // Если роль доступна тогда можно выбрать любое из перечислений (А,Б,В)
    Сообщить("Можно выбрать операцию Списания");
    КонецЕсли;
```
---
Если НЕ РольДоступна("ЭтаСамаяРоль") ИЛИ НЕ Перечисления.ВидыОпераций.А = Истина
 что за *овнокод??? Вот здесь: Перечисления.ВидыОпераций.А = Истина???
---
последний раз мне хотелось
закричать от беспомощности
когда я хотел пойти на "Аванопст" и в кассе кинотеатра
мне шепнули: "Не ходи"

тс лукавит или пишет сценарий второй части на то, куда я не ступил.
---
шепнул кассир ? :)
---
постановка задачи у вас интересная "и/или" - понимай как хочешь :)

Но судя по всему Либо у сотрудника есть роль, либо он может использовать только А.

Так и пишите условие :

```1c
    Если РольДоступна ИЛИ А тогда
    "можно"
    Иначе
    "нельзя"
```
---
на счёт И/ИЛИ поясню:

(8) не пока что разбираюсь
---
```1c
    НЕ РольДоступна("ЭтаСамаяРоль") ИЛИ РеквизитДокументаСПеречислением <> Перечисления.ВидыОпераций.А Тогда
```
---
и еще аккуратнее с переменно Отказ
если до вашей процедуры он стал Отказ= истина , вы своим Отказ= Ложь можете ситуацию поменять, что не верно
---
Отказ = Ложь просто не надо писать. Если нельзя - то Отказ Истина, если можно то ничего не делать ...
---
Хрень какая-то в постановке задачи )
Получается, что если не выбрано А, тогда должна быть доступна роль, чтобы записать документ? А если выбрано А, тогда роль не имеет значения и документ можно записать. Так?

```1c
    Если Не А И Не РольДоступна Тогда
    //не записываем
    Иначе
    //записываем
    КонецЕсли;
```
---
ТС - разобрался?
---
Отладчик то что пишет?
---
что именно? где в какой переменной? что посмотреть в отладчике?
---
```1c
    * Вот здесь точка останова -Если НЕ РольДоступна("ЭтаСамаяРоль") ИЛИ НЕ Перечисления.ВидыОпераций.А = Истина
    Тогда Отказ = Истина;
    Сообщить("Нет роли и выбрали вид операции Списание А - Вам не положено");
    Иначе
    Сообщить("Можно выбрать операцию Списания");
    Отказ = Ложь;
    КонецЕсли;
```

Что именно не работает?
---
НЕ Перечисления.ВидыОпераций.А = Истина - вот здесь точно не работает :)
поэтому у него в этой строке

```1c
    НЕ РольДоступна("ЭтаСамаяРоль") ИЛИ НЕ Перечисления.ВидыОпераций.А = Истина
```
всегда будет Ложь.
---
Эм, тут надо сравнивать со значением перечисления а не с истиной.
---
так я ему это ещё в (13) сказал, а он всё ешё сравнивает :)
---
Ну упорство хорошее качество )))))
---
Если убрать Истину у "Перечисления.ВидыОпераций.А" тогда ошибка - Преобразование значения к типу Булево не может быть выполнено
---
Если убрать Истину у "Перечисления.ВидыОпераций.А" тогда ошибка все правильно, потому что только при таком условии будет истина:

```1c
    Перечисления.ВидыОпераций.А = Перечисления.ВидыОпераций.А
```

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

```1c
    Если НЕ РольДоступна("АСН_РазрешитьВидОперацииСписаниеУКорректировки") И НЕ Перечисления.ВидыОперацийКорректировкаДолга.СписаниеЗадолженности = Истина Тогда
    Отказ = Истина;
    Сообщить("Нет роли и выбрали вид операции Списание А - Вам не положено");
    ИначеЕсли РольДоступна("АСН_РазрешитьВидОперацииСписаниеУКорректировки") И Не ЗначениеЗаполнено(Перечисления.ВидыОперацийКорректировкаДолга) Тогда
    Сообщить("Можно выбрать операцию Списания");
    КонецЕсли;
```
---
это более подробно без всяких А, Б, В....
---
```1c
    НЕ Перечисления.ВидыОперацийКорректировкаДолга.СписаниеЗадолженности = Истина
```

Да что же ты значение перечисления с Истиной то сравниваешь???
---
Истина если у меня выбрано именно это перечесление

А как иначе? предложите пожалуйста
---
как мне указать что именно вот это пересечение одно из трёх выбрано, тогда Записать можно
---
см. (13)
---
Истина если у меня выбрано именно это перечесление

Кто знает, что именно ЭТО ЗНАЧЕНИЕ выбрано? В представленном коде этого нет.
---
так со значением перечисления-то сравни.
---
```1c
    НЕ Перечисления.ВидыОпераций.А = Истина
```

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

```1c
    Если НЕ РольДоступна("ЭтаСамаяРоль") ИЛИ <ТвойКакойтоРеквизит <> Перечисления.ВидыОпераций.А Тогда
    Отказ = Истина;
    Сообщить("Нет роли и/или выбрали вид операции Списание А - Вам не положено");
    Иначе
    Сообщить("Можно выбрать операцию Списания");
    КонецЕсли;
```
---
Всем спасибо кто помогал! Реально помогло отдохнуть, прийти на работу и сделать

```1c
    Если НЕ РольДоступна("АСН_РазрешитьВидОперацииСписаниеУКорректировки") И ВидОперации = Перечисления.ВидыОперацийКорректировкаДолга.СписаниеЗадолженности
    Тогда Отказ = Истина;
    Сообщить("Нет роли и выбрали вид операции Списание А - Вам не положено");
    ИначеЕсли РольДоступна("АСН_РазрешитьВидОперацииСписаниеУКорректировки")
    Тогда Отказ = Ложь;
    Сообщить("Роль доступно, документ можно записать");
    КонецЕсли;
```
---
Ну тебе написали же

```1c
    Если Не А И Не РольДоступна Тогда
    //не записываем
    Иначе
    //записываем
    КонецЕсли;
```