Показать в вопросе только те варианты ответа, которые отметили в предыдущем вопросе

Часто возникает необходимость, отобразить в вопросе только те варианты ответа, которые респондент выбрал в одном из предыдущих вопросов, или наоборот - показать только оставшиеся варианты ответа, которые респондент не выбрал.

Самый простой способ сделать подобное - использовать Действия перед показом вопроса. Например, у нас есть вопрос с множественным выбором (вариант ответа 99 помечен флагом Блокирующий):

    Q1: Какие магазины Вы посещаете?
        1 - Магазин А
        2 - Магазин Б
        3 - Магазин В
        99 - Затрудняюсь ответить

Далее идет уточняющий вопрос с единственным выбором:

    Q2: Какой магазин, из тех, что Вы посещаете - любимый?
        1 - Магазин А
        2 - Магазин Б
        3 - Магазин В

Естественно, для вопроса Q2 надо не забыть прописать условие показа, чтобы он не задавался, когда в Q1 отметили код 99. Например, сделать в Q1 после ответа переход куда-то далее, через Q2, или у самого Q2 прописать условие показа Q1 < 99.

Чтобы отобразить в Q2 только те варианты ответа, коды которых выбраны в Q1, добавляем в Q2 два Действия перед показом:

    Скрыть все варианты ответа
    Показать варианты ответа, отмеченные в вопросе Q1

либо используем одно действие, заменяющее два указанных выше:

    Показать только варианты ответа, отмеченные в вопросе Q1

Действия добавляются без указания условия. Всё, этого достаточно. Если в Q2 есть исключающие варианты ответа, например Затрудняюсь ответить, то в свойствах этих ответов надо не забыть поставить флаг Всегда отображается.

Важный момент - необходимо всегда сначала скрывать все варианты ответа, прежде чем показывать необходимые (и наоборот, в зависимости от задачи), т.к. вопрос перед показом не сбрасывается в исходное состояние, и в случае если оператор будет ходить по анкете назад и менять ответы в Q1 - будет странный результат. Это не касается действий вроде Показать только варианты ответа, отмеченные в вопросе, т.к. они сами выполняют всё необходимое.

Всё то же самое можно, конечно, сделать и скриптами. Вместо действий, пишем в Q2 в скрипт перед показом:

Q.answers.hideAll();
Q.answers.showCodes(Q1.getCheckedCodes());

или проще:

Q.answers.showOnlyCodes(Q1.getCheckedCodes());
return Q.answers.hasVisible ? ok : skip;

Тут мы сразу проверяем, есть ли в итоге какие-то ответы для показа, и если их не осталось - пропускаем вопрос. Сделать такую же проверку можно и действием

    Пропустить, если нет видимых вариантов ответа или строк

Если наш вопрос Q2 - это табличный вопрос, и надо показать только те строки, коды которых отмечены в Q1, то это сделать можно только скриптом перед показом для Q2:

Q.rows.hideAll();
Q.rows.showCodes(Q1.getCheckedCodes());
return Q.rows.hasVisible ? ok : skip;

или так:

Q.rows.showOnlyCodes(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;

Ещё один встречающийся случай - показать в табличном вопросе только те строки, для которых также в табличном вопросе, например в Q1, отметили код 1 или 2:

Q.rows.hideAll();
Q1.rows.getVisible().forEach(function (row) {
    if (row.isChecked(1) || row.isChecked(2)) {
        Q.rows.show(row.code);
    }
});
return Q.rows.hasVisible ? ok : skip;