Опять на ночь глядя на логику и программирования ставлю задачки (надоели уже, но учиться надо).

Прошу помощи вот в чём, я написал к каждому флажку простой код на каждый выбор ответа, вот этот код ниже просто при выборе блокирует другие, чтобы нельзя было выбрать другие и понял, что он очень огромный! Вопросов может быть 100, тогда код превратиться в очень большой, который и проверить сложно я подумал, а можно ли, сделать функцию с возвращаемым значением, но не понял как это сделать так как реквизиты (флажки) ответ1, ответ2, ответ3, ответ4 в другом вопросе это уже ответ1_1, ответ1_2, ответ1_3, ответ1_4. Может их можно как-то уникально назвать и взаимоисключать функцией, но сколь я себя, лист бумаги и конфигуратор не мучил, ничего не выходит :(

```1c
    //Вопрос1

    //Ответ1
    &НаКлиенте
    Процедура Ответ1ПриИзменении(Элемент)

    Если объект.Ответ1 = Истина Тогда
    Элементы.Ответ2.Доступность = ложь;
    Элементы.Ответ3.Доступность = ложь;
    Элементы.Ответ4.Доступность = ложь;

    ИначеЕсли

    объект.Ответ1 = Ложь Тогда
    Элементы.Ответ2.Доступность = истина;
    Элементы.Ответ3.Доступность = истина;
    Элементы.Ответ4.Доступность = истина;

    КонецЕсли

    КонецПроцедуры

    //Ответ2

    &НаКлиенте
    Процедура Ответ2ПриИзменении(Элемент)

    Если объект.Ответ2 = Истина Тогда
    Элементы.Ответ1.Доступность = ложь;
    Элементы.Ответ3.Доступность = ложь;
    Элементы.Ответ4.Доступность = ложь;

    ИначеЕсли

    объект.Ответ2 = Ложь Тогда
    Элементы.Ответ1.Доступность = истина;
    Элементы.Ответ3.Доступность = истина;
    Элементы.Ответ4.Доступность = истина;
    КонецЕсли

    КонецПроцедуры

    //Ответ3

    &НаКлиенте
    Процедура Ответ3ПриИзменении(Элемент)

    Если объект.Ответ3 = Истина Тогда
    Элементы.Ответ1.Доступность = ложь;
    Элементы.Ответ2.Доступность = ложь;
    Элементы.Ответ4.Доступность = ложь;

    ИначеЕсли

    объект.Ответ3 = Ложь Тогда
    Элементы.Ответ1.Доступность = истина;
    Элементы.Ответ2.Доступность = истина;
    Элементы.Ответ4.Доступность = истина;
    КонецЕсли

    КонецПроцедуры

    //Ответ4

    &НаКлиенте
    Процедура Ответ4ПриИзменении(Элемент)

    Если объект.Ответ4 = Истина Тогда
    Элементы.Ответ1.Доступность = ложь;
    Элементы.Ответ2.Доступность = ложь;
    Элементы.Ответ3.Доступность = ложь;

    ИначеЕсли

    объект.Ответ4 = Ложь Тогда
    Элементы.Ответ1.Доступность = истина;
    Элементы.Ответ2.Доступность = истина;
    Элементы.Ответ3.Доступность = истина;
    КонецЕсли
    КонецПроцедуры
```
---
```1c
    &НаКлиенте
    Процедура ОтветПриИзменении(Элемент)
    ИмяЭлемента = Элемент.Имя;
    ГалочкуПоставили = ЭтаФорма[ИмяЭлемента];
    НомерЭлемента = Число(Прав(ИмяЭлемента,1));
    ИмяЭлемента = Лев(ИмяЭлемента,СтрДлина(ИмяЭлемента)-1);
    Для ном=1 По 4 Цикл
    Элементы[ИмяЭлемента+ном].Доступность = НЕ ГалочкуПоставили ИЛИ (ном=НомерЭлемента);
    КонецЦикла;
    КонецПроцедуры
```
Этот код добавить обработчиком для всех элементов.
Если кол-во ответов разное, то где-то надо ещё хранить соответствие кол-во ответов - ИмяЭлемента
---
Не использовать флажки, очевидно, а использовать переключатель.
Код сведется к минимуму - его не нужно писать вообще.
---
Самое очевидное использовать переключатели, как писали ранее, но если принципиальность задачи использовать флажки (я так понимаю задание тестовое или просто задача из учебника), то можно написать универсальный код. Вот пример кода, только для обычных форм, переписать для управляемых и будет счатстье.

```1c
    ПроцедураИзменениеФлажка(Элемент)
    //Генерируемое число при формирование вопроса
    ВсегоОтветов = 2;//Должно быть известно максимальное количество ответов.
    ОграничитьДоступность = Элемент.Значение;

    НомерОтветаСтрокой = СтрокаЗаменить(Элемент.Имя,"Ответ",");
    НомерОтвета = Число(НомерОтветаСтрокой);
    Сч = 1;
    Пока Сч <= ВсегоОтветов Цикл
    Если Сч = НомерОтвета Тогда
    //Ничего не делаем, так как данный элемент доступен
    Иначе
    ЭлементыФормы["Ответ" + Сч].Доступность = Не ОграничитьДоступность;
    КонецЕсли;
    Сч = Сч + 1;
    КонецЦикла;
    КонецПроцедуры
```
---
Может, если вопрос предполагает только один ответ, использовать переключатель с вариантами? В чем смысл использовать именно флажки?
А так можно выкрутить из Элемент.Имя, например. Сделать цикл по схожим именам. Например называем флажки ВопросX_ОтветY. Дальше выделяем первую часть префикса и циклом находим элементы с таким же префиксом
---
суть вопроса не ясна и какая цель.
---
Вопрос в следующем, в коде представлены 4 ответа (флажки) к одному вопросу, каждая процедура это щёлк по каждому флажку, выполняют они почти одно и тоже, цель - свисти код к минимуму, потому что здесь код для четырех ответов, всего одного вопроса, если вопросов будет 100, то ответов 400, а это слишком много
---
смотри мою публикацию мобильное тестирование.
Элементы генерирую программно.
---
Обязательно, буду более признателен, если скинете ссылку.
---
Мобильное тестирование
---
Не использовать флажки, очевидно, а использовать переключатель.
Код сведется к минимуму - его не нужно писать вообще.
---
Ну я обязательно помучаю переключатель, но мне сейчас необходимо пройти, через огонь, воду и кривой самописный код))
---
Самое очевидное использовать переключатели, как писали ранее, но если принципиальность задачи использовать флажки (я так понимаю задание тестовое или просто задача из учебника), то можно написать универсальный код. Вот пример кода, только для обычных форм, переписать для управляемых и будет счатстье.

```1c
    ПроцедураИзменениеФлажка(Элемент)
    //Генерируемое число при формирование вопроса
    ВсегоОтветов = 2;//Должно быть известно максимальное количество ответов.
    ОграничитьДоступность = Элемент.Значение;

    НомерОтветаСтрокой = СтрокаЗаменить(Элемент.Имя,"Ответ",");
    НомерОтвета = Число(НомерОтветаСтрокой);
    Сч = 1;
    Пока Сч <= ВсегоОтветов Цикл
    Если Сч = НомерОтвета Тогда
    //Ничего не делаем, так как данный элемент доступен
    Иначе
    ЭлементыФормы["Ответ" + Сч].Доступность = Не ОграничитьДоступность;
    КонецЕсли;
    Сч = Сч + 1;
    КонецЦикла;
    КонецПроцедуры
```
---
Интересно, похимичу))
---
```1c
    &НаКлиенте
    Процедура ОтветПриИзменении(Элемент)
    ИмяЭлемента = Элемент.Имя;
    ГалочкуПоставили = ЭтаФорма[ИмяЭлемента];
    НомерЭлемента = Число(Прав(ИмяЭлемента,1));
    ИмяЭлемента = Лев(ИмяЭлемента,СтрДлина(ИмяЭлемента)-1);
    Для ном=1 По 4 Цикл
    Элементы[ИмяЭлемента+ном].Доступность = НЕ ГалочкуПоставили ИЛИ (ном=НомерЭлемента);
    КонецЦикла;
    КонецПроцедуры
```
Этот код добавить обработчиком для всех элементов.
Если кол-во ответов разное, то где-то надо ещё хранить соответствие кол-во ответов - ИмяЭлемента
---
А почему бы тогда просто не перебрать все элементы формы и проставить доступность согласно их значению (естественно проверив что это флажок)....
Главное чтобы других "флагов" на форме не было)))
---
После установки первого значения, ответ изменить нельзя будет. Так как код будет только ограничивать доступность, но не снимать, если ответ решили изменить до момента отправки.
---
ну хорошо, нам ничто не мешает учесть этот момент. Получаем значение измененного элемента и всем остальным флагам на форме в доступность присваиваем "НЕ ЗначениеИзмененногоЭлемента" и всё))) ну а текущий элемент, естественно оставляем доступным для изменения.
---
Ну в принципе так я и реализовал свой алгоритм выше. Можно конечно обходить все элементы и проверять на тип что флажок, но как писали до этого вы есть недостатки. А если флажки не относятся к опросу :-) И самое главное, это то что этот флажок теоретически может появится после написания данного кода, в следствие следующих доработок.
---
Но в предложенном вами алгоритме нужно знать количество ответов заранее, а если я захочу добавить вариант ответа, то должен не забыть исправлять процедуру каждый раз. Что тоже не добавляет универсальности... А про "этот флажок теоретически может появится после написания данного кода" ничто не помешает мне добавить флажок "ответ_2" и ваш алгоритм его не учтет. А в случае удаления какого-либо флажка потребуется также переписать алгоритм, иначе он рухнет с ошибкой.
---
Количество ответов, можно взять из справочника/регистра, где они хранятся для вопроса. Ведь сами вопросы и ответы хранятся в базе. У меня жестко задано количество ответов, но их можно получать при формирование вопроса на форме. ВсегоОтветов = СписокОтветов.Количество()
По поводу имени переменной, тоже может быть универсально, так как логично не рисовать форму, а формировать её программно, то и названия имен флажков будет стандартизировано. То есть вывод вопросов тоже должен быть универсальным, что бы каждый раз не пришлось переписывать форму, когда количество ответов будет увеличено.
В своей работе, если встречаются такие задачи, то делаю сразу универсально. Это немного дольше, чем просто нарисовать под максимальное количество вариантов, но зато потом не придется переписывать данный код.
---
Коллега выше все верно написал! Просто придумайте паттерн для создания таких объектов, чтоб имена "элементов были одинаковыми + уникальный ключ" и один обработчик на всех.
А по поводу количества вопросов и количества ответов - посмотрите в сторону вынесения вопросов и ответов в справочник и формирования формы динамически.
---
Зачем всё усложнять ?)) можно проще, одну процедуру написать и использовать для всех 4 переключателей ))
вот так :

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