Редактор анкет

Новости

Обновление дашборда: детализированные графики

Дата выхода: 31 марта 2026


Что нового

Stacked-графики

В столбчатых графиках теперь доступен режим детализации — stacked. Каждый столбец разбивается на цветные сегменты по вопросу детализации, что позволяет видеть не только общий результат, но и его структуру в одном графике.

Режим работает как для вертикальных, так и для горизонтальных столбчатых графиков. Включается в настройках блока дашборда.


Итоговые значения над столбцами

В столбчатых графиках с детализацией теперь отображается суммарное значение над каждым столбцом. Это позволяет быстро оценить общий результат, не складывая сегменты вручную.

Работает как для вертикальных, так и для горизонтальных столбчатых графиков.


Упорядоченная легенда

Элементы легенды теперь отображаются в стабильном, предсказуемом порядке — одинаковом при каждом открытии графика.

Вход

Для входа в систему необходимо пройти авторизацию 

Документы

Документы

Общие документы

Краткое описание

ПЭВМ_Социометр_Краткое_описание_ПЭВМ.pdf

Описание функционала

ПЭВМ_Социометр_Описание_функционала_ПЭВМ.pdf

Руководство пользователя

ПЭВМ_Социометр_Руководство_пользователя.pdf

Создание опроса

Создать и протестировать опрос

Создание опроса

Добавление

Добавить новый

image-1721581308327.png

Назвать

image-1683103086222.png

Открыть существующий

image-1721581627187.png



Создание опроса

Добавление вопроса

Добавление приветствия с комментарием для интервьюера.

image-1683103782861.png

Добавление вопроса

image-1683103945470.png

Создание опроса

Добавление вопроса с мультивыбором

1. Необходимо добавить вопрос и ответы к нему

image-1683186978627.png

2. Включить мультивыбор.

image-1683187119052.png



Создание опроса

Ротация ответов

Включение ротации обеспечивает случайный порядок вариантов ответов для каждого интервью

Включение ротации для всех ответов

image-1683452057330.png

Исключение ответа из ротации

image-1683452129542.png

Создание опроса

Добавление своего варианта ответа

Свой ответ - ответ сформулированный респондентом

Открыть свойство ответа

image-1683390752168.png

Установить тип

image-1683390930462.png



Создание опроса

Редактирование связанных вопросов

Связанный вопрос - вопрос, варианты ответа  которого, зависят от ответов вопроса-селектора

Выбор вопроса-селектора

image-1683189461759.png

Выбор возможных вариантов ответа

image-1683189652828.png

При ответе "Рыбки"  в вопросе Q4 будут доступны ответы A7 и A8 в вопросе Q5

image-1683189851305.png

Просмотр установленных связей

image-1683453106587.png

Печать карточки 

image-1683453203278.png

Создание опроса

Добавление табличного вопроса



Настройка ротации строк 

image-1683454447647.png

Включение ротации столбцов

image-1683454483733.png

Установка условий видимости строки

image-1683454690095.png

Установка условий видимости столбца

Условия видимости столбцов применяются для всех строк таблицы

image-1683454829680.png

Создание опроса

Условия видимости

На вопрос

image-1683190397091.png

На вариант ответа

image-1683190616805.png

На строку таблицы 

image-1683192456232.png

На столбец таблицы

 

image-1683192546853.png

В свойства секции 

Предварительно секцию требуется создать !

image-1683366014317.png

Создание опроса

Тестирование опроса

Запуск просмотра

image-1683392785508.png

Установка закладки

image-1683393039229.png

Переход на  установленную закладку

image-1683393093106.png

Создание опроса

Редактирование квот

Типы квот

Базовая -  Для опроса устанавливается общее количество интервью

Разрешить редактирование

image-1683739474474.png

Установить кол-во интервью и сохранить

image-1683739564010.png

Общая - для опроса устанавливается требуемое количество ответов по квотным вопросам

Разрешить редактирование

image-1683739474474.png

Сменить тип квоты

image-1683739722302.png

Добавить квотные вопросы

image-1683739820002.png

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

image-1683739916640.png

Редактирование требуемого количества интервью для каждого ответа на квотный вопрос

image-1683740469241.png

Автоматическое распределение пропорционально вышестоящей квоте

image-1683740933236.png

Сохранение квоты

image-1683741743615.png

Индивидуальная  - то-же что и базовая, но требуемое количество интервью устанавливается индивидуально для каждого интервьюера

Установка типа квоты

image-1683741890492.png

Редактирование требуемого количества интервью для каждого ответа на квотный вопрос

image-1683740469241.png

Автоматическое распределение пропорционально вышестоящей квоте

image-1683740933236.png

Равномерное распределение анкет по интервьюерам

image-1683742175104.png

Ручное распределение анкет

image-1683742299294.png

см управление интервьюерами


Создание опроса

Добавление сотрудников органицации

Добавить в свою организацию

image-1683742778029.png

Установка логина/пароля и периода активности (актуально для временных сотрудников )

image-1683743015555.png





Создание опроса

Управление интервьюерами в опросе

Если интервьюеров еще нет в сотрудниках организации - их необходимо добавить

Разблокировка внесения изменений на закладке "Интервьюеры"

image-1683743674454.png

Добавить 

image-1683743835499.png

Сохранить изменения

image-1683743974575.png

   

Установить требуемое кол-во интервью 

image-1683744111215.png

Равномерно распределить остаток несобранных  интервью между всеми интервьюерами

image-1683744658208.png

Выключить интервьюера из опроса 

Интервью от этого интервьюера больше не принимаются, все принятые - сохраняются, непринятые интервью возвращаются в общий пул и готовы для распределения по остальным интервьюерам. 

image-1683744227510.png

Заморозить интервьюера 

Выключить интервьюера из автоматического распределения.

image-1683744725801.png

Создание опроса

Использование мобильного устройства

Описание находится в соотв. разделе.  ссылка

Создание опроса

Прохождение он-лайн опроса

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

Получение единой ссылки на опрос

По этой ссылке может быть сформировано неопределенное количество интервью

image-1683746577914.png

Выбрать создание индивидуальных ссылок

По ссылке такого типа может быть сформировано настраиваемое количество интервью

image-1683746680843.png

Позволяет интервьюеру принимать интервью используя браузер.

Требуется on-line!

image-1700576800024.png

Создать 5 различных ссылок на опрос

image-1683746748973.png

Ссылки можно копировать индивидуально или экспортировать  весь массив в таблицу

image-1683746960838.png

При выгрузке массива интервью ссылка на каждое будет находится в соответствующем столбце таблицы.

Создание опроса

Контроль интервью

Переключение на страницу "Результаты"

image-1683824260257.png

Для просмотра интервью целиком его можно открыть

image-1683824391198.png

Просмотр одиночного интервью

image-1683824615106.png

 

image-1683825185049.png

 
   
Создание опроса

Выгрузка массива

Создание опроса

Контроль интервьюеров

Посмотреть местонахождение всех интервьюеров опроса

image-1700735035680.png

Посмотреть маршрут выбранного интервьюера

image-1700735339656.png

Написать интервьюеру сообщение

image-1700735480121.png

Дать команду мобильному устройству интервьюера

image-1700735592316.png

Пример получения статуса

image-1700735682280.png

Создание опроса

Сохранение прерванных интервью

При прохождении интервью возможно сохранение  прерванных анкет

Работает как для web-интервью, так и для мобильного приложения 



Включение 

image-1709652474697.png

Поиск незаконченных интервью

image-1708963880825.png

Выгрузка результатов

image-1708964021183.png

Создание опроса

Продолжение прерванных интервью

Продолжение прерванного интервью происходит при переходе по web-ссылке созданной в процессе прохождения анкеты.

Включение в свойствах опроса

image-1709652647511.png

Получение ссылки в приложении

image-1709651457054.png

При on-line прохождении

image-1709651750945.png



Справочники

Управление пользователями

Управление пользователями

Просмотр

Общий список 

image-1676311341117.png

Заблокированные

image-1676311665067.png

Управление пользователями

Экспорт

Экспорт 

image-1676312158910.png

Скопировать в буфер обмена

image-1676312246386.png

Управление пользователями

Импорт

Импорт

Иimage-1676312306211.png

Вставить таблицу из буфера обмена

image-1676312403687.png

Формат таблицы

image-1676312442127.png

Управление пользователями

Найти интервьюеров на карте

Всех

image-1676312596272.png

Фильтры по времени

image-1676317573531.png

Редактор

Редактор

Навигация

Общий список

image-1676318348578.png

Результаты

image-1676318141911.png

Фильтр по статусам

image-1676318221675.png

Групповая выгрузка отчетов

image-1676396582064.png

Редактор

Свойства опроса

Открытие

image-1676320583351.png

Редактирование

image-1699471921545.png

Просмотр имеющихся версий и смена активной.

image-1676321257258.png

Редактор

Вопросы анкеты

Добавление

image-1673937513769.png

Редактирование

image-1673937148564.png

Свойства вариантов ответов
Редактор

Ответы

Редактирование ответов

Не забудьте открыть вопрос на редактирование !

image-1676393652966.png


image-1676394740644.png


image-1699993419725.png








Для ответа типа РЕЙТИНГ 

Возможно установка специального типа виджета позволяющего принимать нулевые значенияimage-1699993369292.png



В интервью выгляди следующим образом :

image-1699994224224.png


Доступно для ответов типа одиночный выбор и для исключительных вариантов ответа в вопросах с мультивыбором.

При редактировании ответа возможно сразу установить переход на другой вопрос анкеты

2023-11-14_22-59-35.png

Редактор

Переходы

Типы

Безусловный 


При получении ответа

Создание

Удаление

Навигация

Редактор

Результаты

Список собранных анкет

image-1676318905234.png

Развернуть способы просмотра

image-1676319035366.png

Разворачивать каждое интервью

Координаты принятого интервью

image-1676319269999.png

Координаты IP адреса принятого интервью


Точность может быть низкой, зависит от поставщика услуги геопривязки и/или использования  интервьюером VPN.

image-1676319407706.png

Сводная таблица

image-1676319965315.png

Выгрузка отчетов

image-1676320065147.png

Подключение внешних систем BI

image-1676320172128.png

Редактор

Квоты

Редактор

Вычисляемый текст

Редактор

Секции

Группы вопросов могут объединятся в секции. Это полезно делать для вопросов связанных одной темой ( например вопросы для респондентов проживающих в определенном районе городе )

Создание

image-1683366327307.png

Просмотр имеющихся и навигация

image-1683366489631.png

 

Версии опроса

Информирование

Уведомления рассылаются по всем установленным у пользователя каналам информирования при возникновении одного из событий.

Каналы информирования

События 

Настройка

Привязать Telegram в своем профиле

image-1709655474935.png

image-1721581937904.png

Включить информирование в свойствах опроса

 

image-1721582216427.png

Режим интервьюера

Предназначен для временного выключения отображения некоторых вариантов ответа. Используется при показе анкеты респонденту.

Включить в свойствах вопроса

image-1710788759460.png

Включить в свойствах вариантов ответа

image-1710789038824.png

В приложении

 

image-1710789564001.png

Использование пользовательских кодов вопроса

UserCode - Код вопроса определяемый пользователем 

Включение и редактирование

image-1711387962563.png







Кан-бан

Табличное представление опросов при котором:


Для каждого столбца настраивается набор статусов опросов отбираемых в этот столбец

Общий вид доски

image-1721582698526.png

Настройка столбцов 

image-1721583001395.png

Смена статусов возможна как напрямую, так и перетаскиванием опроса в целевой столбец

image-1721583136601.png

Переключение между досками и создание новых

image-1721583222966.png

После поступления интервью происходит автоматическое обновление счетчиков

image-1721730601514.png

Статусы опросов

Общие положения:

Статус опроса определяет текущее положение опроса в его жизненном цикле.
Каждая организация может иметь свой собственный набор статусов.
Каждый статус может иметь владельца(ов).
Если владелец установлен, только он может назначить этот статус опросу.
Таким образом, можно назначать  например круг ответственных за запуск опроса в работу. 
Каждый статус опроса привязан к одному из системных статусов.

Просмотр существующих

image-1721584843208.png

Редактирование

image-1721585064591.png


 

 


Список опросов

Список опросов

Общий вид

Общий вид

image-1721740013093.png

Фильт по статусам и префиксам

image-1721747145391.png

Теги опроса

image-1721740527359.png

Облако тегов

image-1721740453246.png

Счетчик анкет

image-1721746938027.png

Переход в результаты и дашборды опроса

2024-07-23_18-03-03.png

Просмотр результатов

Просмотр результатов

Просмотр и прослушивание интервью

Список интервью

image-1723573343581.png

Выделить столбец для удобства контроля и автоперематываться на него. 

image-1723575345132.png

Прослушивание 

image-1723573447534.png

Прослушать предыдущий/следующий ответ в текущем интервью

image-1723573621544.png

Прослушать текущий ответ в предыдущем/следующем интервью

image-1723573552708.png

Перемотка вперед-назад и скорость воспроизведения

image-1723573731016.png

Скачать аудио-запись

image-1723573780471.png

Просмотр результатов

Контроль

Интервью проверено, идет в зачет.

image-1723574228752.png

Вопрос требует дальнейшего изучения

image-1723574397814.png

Брак. Интервью, помечается нецелевым, в квоте не участвует.

image-1723574172426.png

Поиск интервью по результату проверки

image-1723574562046.png

Просмотр результатов

Дашборды

Список дашбордов опроса

image-1723575497301.png

Редактирование свойств дашборда

image-1723575752261.png

Ссылка публичного доступа к дашборду ( без авторизации ). Действует только в разрешенный период.

image-1723575914314.png

Добавление нового графика на дашборд

image-1723575685752.png

Выбор типа графика  

image-1723576017963.png

Контроль результатов

Контроль результатов

4к34к

ваыва

Вычисляемый текст

При необходимости подставить в текст вопроса, ответа, комментария, строки таблицы. столбца таблицы имеющиеся в текущем интервью ответы на вопросы можно использовать Вычисляемый текст.  Вычисляемый текст всегда начинается с символов "@@", после которого идет код вопроса/ответа

@@Q5
Текст Вопроса Q5
@@Q5.A2
Текст Ответа 2 на вопрос 5
@@Q3.R5
Текст в строке 5 табличного вопроса 3
@@Q3.R5.A4
Текст в ответе 4 строки 5 табличного вопроса 3
   

Коды вопросов/ответов можно набирать на клавиатуре, а можно пользоваться окном подсказки, открывающимся при вводе  "@@"

image-1725572390578.png

PEXL

Синтаксис PEXL

PEXL (Poll Expression Language) — язык выражений для доступа к данным интервью, сравнения значений, логических условий, работы с переменными, параметрами, тегами ответов, подсчётами и псевдослучайными значениями.

Документ описывает синтаксис, реально поддерживаемый грамматикой pexl.g, парсером pexl.js и тестами проекта.


1. Общая модель выражений

Выражение PEXL вычисляется в контексте объекта interview и возвращает одно значение:

Примеры:

Q1
Q1 == "Q one"
Q1.A3 == "A three"
Q5.A >= 22
PARAM("PARAM1") == "PAR1"
$X = RAND(1, 10)

2. Лексические элементы

2.1. Пробелы

Пробельные символы допускаются между токенами и игнорируются.

Примеры:

Q1.A3=="A three"
Q1.A3 == "A three"
Q1 . A3

Практически использовать стоит обычную читаемую запись без разрыва внутри ссылок вида Q1.A3.

2.2. Числа

Поддерживаются только целые числа:

0
1
22
100500

Формально: последовательность цифр \d+.

Отрицательные, дробные и экспоненциальные числа синтаксисом не предусмотрены.

2.3. Строки

Поддерживаются строковые литералы в двойных кавычках:

"Hello"
"A three"
"06bf20de-9658-4afd-9e7b-d712697ccdc7"

Также лексер распознаёт литералы в одинарных кавычках, но в грамматике языка они не используются как допустимые значения выражений. Поэтому в корректном PEXL следует использовать двойные кавычки.

2.4. Ключевые слова и служебные токены

Поддерживаются следующие ключевые слова и служебные конструкции:

2.5. Операторы и знаки пунктуации


3. Базовая грамматика выражений

На верхнем уровне PEXL поддерживает два больших класса выражений:

  1. вычисление/сравнение значения;
  2. присваивание переменной.

Упрощённо:

STMT ::= STMT == STMT
       | STMT != IVALUE
       | STMT <  IVALUE
       | STMT >  IVALUE
       | STMT <= IVALUE
       | STMT >= IVALUE
       | STMT AND STMT
       | STMT OR STMT
       | NOT STMT
       | ( STMT )
       | IVALUE
       | ASSIGN_VALUE

Где IVALUE — это обычное вычисляемое значение, а ASSIGN_VALUE — присваивание переменной.


4. Приоритет операторов

Согласно грамматике проекта, используются такие приоритеты:

  1. NOT — самый высокий;
  2. сравнения: ==, !=, <, <=, >, >=;
  3. OR;
  4. AND;
  5. = (присваивание).

Важно: приоритеты в pexl.g заданы не совсем так, как в большинстве языков программирования. Для сложных выражений рекомендуется всегда явно ставить скобки.

Примеры безопасной записи:

Q1.A3 AND (NOT Q2.A1)
(Q1.A3 == "A three") AND (Q2.A1 == "A one")
($X = RAND(1, 10)) AND ($X >= 1)

5. Допустимые виды значений (IVALUE)

IVALUE может быть одним из следующих типов:

Подробно — ниже.


6. Ссылки на вопросы

6.1. Вопрос Qx

Форма:

Q<number>

Примеры:

Q1
Q2
Q10

Семантика:

Примеры:

Q1
Q1 == "Q one"
NOT Q123

6.2. Строка табличного вопроса Qx.Ry

Форма:

Q<number>.R<number>

Примеры:

Q3.R1
Q3.R2

Семантика:

Примеры:

Q3.R1 == "Q three R one"
Q3.R2

7. Ссылки на ответы

7.1. Конкретный ответ Qx.Ay

Форма:

Q<number>.A<number>

Пример:

Q1.A3

Семантика:

Примеры:

Q1.A3 == "A three"
Q7.A3 == 22

7.2. Конкретный ответ в строке таблицы Qx.Ry.Az

Форма:

Q<number>.R<number>.A<number>

Пример:

Q3.R1.A3

Примеры использования:

Q3.R1.A3 == "A three"
Q3.R2.A1

8. Текст ответа

8.1. Первый/основной текст ответа вопроса Qx.A

Форма:

Q<number>.A

Пример:

Q5.A

Семантика:

Примеры:

Q1.A == "A three"
Q5.A == 22
Q5.A >= 22

8.2. Текст ответа строки таблицы Qx.Ry.A

Форма:

Q<number>.R<number>.A

Пример:

Q3.R2.A

Примеры:

Q3.R2.A == "33"
Q3.R1.A == "A three"

9. Теги ответов

Тег кодируется как специальный токен вида:

T.<TAG_NAME>

Допустимые символы имени тега: буквы, цифры, _, -.

Примеры:

T.A_TAG_INT
T.A_TAG_STR
T.score-1

9.1. Тег конкретного ответа Qx.Ay.T.TAG

Форма:

Q<number>.A<number>.T.<TAG>
Q<number>.R<number>.A<number>.T.<TAG>

Примеры:

Q1.A3.T.A_TAG_INT
Q3.R1.A3.T.A_TAG_STR

Семантика:

Примеры:

Q1.A3.T.A_TAG_INT == 55
Q1.A3.T.A_TAG_STR == "Tag value"

9.2. Тег первого/основного ответа вопроса Qx.A.T.TAG

Форма:

Q<number>.A.T.<TAG>
Q<number>.R<number>.A.T.<TAG>

Примеры:

Q1.A.T.A_TAG_INT
Q3.R1.A.T.A_TAG_STR

Семантика:

Примеры:

Q1.A.T.A_TAG_INT == 55
Q1.A.T.A_TAG_STR == "Tag value"

10. Подсчёт количества ответов

10.1. Количество ответов вопроса Qx.COUNT

Форма:

Q<number>.COUNT

Пример:

Q2.COUNT

Семантика:

Примеры:

Q2.COUNT == 4
Q6.COUNT == 6

10.2. Количество ответов строки таблицы Qx.Ry.COUNT

Форма:

Q<number>.R<number>.COUNT

Пример:

Q3.R1.COUNT

10.3. Количество заполненных строк таблицы Qx.R.COUNT

Форма:

Q<number>.R.COUNT

Пример:

Q3.R.COUNT == 3

Семантика:


11. Доступ по UUID

11.1. Вопрос по UUID: QUUID("...")

Форма:

QUUID("<question_uuid>")

Семантика:

Примеры:

QUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7")
QUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7") == "Q one"

11.2. Конкретный ответ по UUID: ATUUID("...")

Форма:

ATUUID("<answer_template_uuid>")

Семантика:

Примеры:

ATUUID("a2101b08-b18e-4137-abb0-5eb2e44d751e")
ATUUID("a2101b08-b18e-4137-abb0-5eb2e44d751e") == "A three"

11.3. Текст ответа по UUID: AQUUID("...")

Форма:

AQUUID("<question_uuid>")

Семантика:

Примеры:

AQUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7") == "A three"
AQUUID("c82d8380-cae4-43c1-93be-3cf5a06449f3") >= 22

11.4. Тег конкретного ответа по UUID: TATUUID("answerUuid", "TAG")

Форма:

TATUUID("<answer_template_uuid>", "<TAG>")

Примеры:

TATUUID("a2101b08-b18e-4137-abb0-5eb2e44d751e", "A_TAG_INT") == 55
TATUUID("a2101b08-b18e-4137-abb0-5eb2e44d751e", "A_TAG_STR") == "Tag value"

11.5. Тег первого/основного ответа вопроса по UUID: TAQUUID("questionUuid", "TAG")

Форма:

TAQUUID("<question_uuid>", "<TAG>")

Примеры:

TAQUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7", "A_TAG_INT") == 55
TAQUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7", "A_TAG_STR") == "Tag value"

11.6. Количество ответов вопроса по UUID: CQUUID("...")

Форма:

CQUUID("<question_uuid>")

Примеры:

CQUUID("06bfcccc-9658-4afd-9e7b-d712697ccdc7") == 6

11.7. Количество строк таблицы по UUID: CRUUID("...")

Форма:

CRUUID("<table_uuid>")

Примеры:

CRUUID("7a33bdab-d53b-4958-a293-60e3fded8aa8") == 3

12. Параметры интервью

Форма:

PARAM("<name>")

Примеры:

PARAM("PARAM1")
PARAM("PARAM1") == "PAR1"
PARAM("PARAM1") == PARAM("param2")

Семантика:


13. Переменные

PEXL поддерживает две формы обращения к переменным.

13.1. Переменная вида $NAME

Форма:

$<name>

Допустимые символы имени: буквы, цифры, _, -.

Примеры:

$VAR1
$var2
$MY-VAR

Чтение:

$VAR1 == "VAL1"

Присваивание:

$VAR3 = "Test3"
$N = 22
$X = Q1
$Y = Q3.R1.A3
$R = RAND(1, 10)

13.2. Переменная вида VAR("NAME")

Форма:

VAR("<name>")

Примеры:

VAR("VAR1")
VAR("var2") == "val2"
VAR("VAR4") = "Test4"
VAR("VAR_QQ") = Q1

Семантика у $NAME и VAR("NAME") общая:

13.3. Что можно присваивать переменной

Правая часть присваивания может быть:

Примеры:

$VAR3 = "Test3"
$VAR_Q = Q1
$VAR_Q = Q3.R1.A3
$MY = $VAR3
VAR("VAR4") = "Test4"
VAR("VAR_QQ") = Q1

14. Псевдослучайные значения

14.1. Короткая форма RAND(n)

Форма:

RAND(<max>)

Семантика:

Пример:

RAND(5)

14.2. Полная форма RAND(min, max)

Форма:

RAND(<min>, <max>)

Семантика:

Примеры:

RAND(3, 7)
RAND(42, 42)
$X = RAND(1, 100)
RAND(10, 20) >= 10 AND RAND(10, 20) <= 20

Особенность реализации:

Совместимость с конвертерами:


15. Операторы сравнения

Поддерживаются:

Примеры:

Q1 == "Q one"
Q1.A3 == "A three"
Q5.A != 20
Q5.A < 123
Q5.A <= 22
Q5.A > 21
Q5.A >= 22

15.1. Правила сравнения

Реализация сравнения устроена так:

  1. Левая часть должна быть truthy, иначе результат выражения будет ложным.
  2. Если и левое, и правое значения распознаются как целые числа, сравнение выполняется как числовое.
  3. Иначе сравнение выполняется как обычное JS-сравнение значений/строк.

Примеры числового сравнения:

Q7.A3 == 22
Q7.A3 < Q7.A4
Q5.A >= 22

Примеры строкового сравнения:

Q7.A1 == "AAAA"
Q7.A1 < Q7.A2

15.2. Сравнение значения слева и справа

С обеих сторон могут стоять не только литералы, но и выражения:

Q7.A1 == Q7.A1
"BBBB" == Q7.A2
22 == Q7.A3
PARAM("PARAM1") == PARAM("param2")

16. Логические операторы

16.1. AND

Форма:

<expr> AND <expr>

Примеры:

Q1.A3 == "A three" AND Q2.A1 == "A one"
Q1 == "Q one" AND Q3.R1 == "Q three R one"

Семантика: логическое И.

16.2. OR

Форма:

<expr> OR <expr>

Пример:

Q1 == "Q one" OR Q1 == "Wrong Q"

16.3. NOT

Форма:

NOT <expr>

Примеры:

NOT Q1
NOT Q123
NOT Q1.A3 == "A three"
Q1.A3 AND NOT Q2222.A1 AND Q5555.A2

16.4. Скобки

Форма:

( <expr> )

Примеры:

Q1 AND (Q1 == "Q one" OR Q1 == "Wrong Q")
Q1.A3 AND (Q2.A1 == "A one" OR Q1111.A111 == "Wrong Q")
Q1.A3 AND (NOT Q2222.A1) AND Q5555.A2

17. Поведение при отсутствии данных

Если вопрос, ответ, тег или переменная не найдены, обычно возвращается null.

Типичные последствия:

Из тестов следует, что при проектировании выражений лучше явно учитывать возможность отсутствия значения.


18. Контекст циклов

Синтаксис выражения не меняется, но семантика поиска вопроса/ответа может зависеть от options, переданных в execute(...).

Поддерживаются режимы:

18.1. DOWHILE

Требует:

{ loopType: "DOWHILE", loopPass: <number> }

В этом режиме конструкции вроде:

ищут данные внутри соответствующей итерации loopPass, а при необходимости могут использовать значения вне цикла как fallback.

Примеры выражений:

Q2 == "Q two 2"
Q2.A1 == "A one. LoopPass2"
Q2.A == "A one. LoopPass2"
QUUID("10264445-3949-41b3-8b87-4cc20bf6c5c0") == "Q two 2"
ATUUID("4a8e4bd6-7500-4195-a731-158780787d21") == "A two. LoopPass2"

18.2. FOREACH

Требует:

{ loopType: "FOREACH", iterationTemplateAnswerId: "<uuid>" }

В этом режиме поиск значения выполняется в контексте конкретной итерации iterationTemplateAnswerId.

Примеры:

Q6 == "Q Loop"
Q6.A1 == "A six one"
Q6.A == "A six one 2"
AQUUID("06bfcccc-9658-4afd-9e7b-d712697ccdc7") == "A six one 2"
Q6.COUNT == 3

18.3. Ошибки конфигурации цикла

Реализация execute() выбрасывает ошибку, если:


19. Полный каталог синтаксических форм

Ниже перечислены все поддерживаемые формы пользовательских выражений.

19.1. Литералы

123
"text"

19.2. Вопросы и ответы

Q1
Q3.R1
Q1.A3
Q3.R1.A3
Q1.A
Q3.R2.A

19.3. Теги

Q1.A3.T.A_TAG_INT
Q3.R1.A3.T.A_TAG_STR
Q1.A.T.A_TAG_INT
Q3.R1.A.T.A_TAG_STR

19.4. Подсчёты

Q2.COUNT
Q3.R1.COUNT
Q3.R.COUNT

19.5. UUID-функции

QUUID("question-uuid")
ATUUID("answer-uuid")
AQUUID("question-uuid")
TATUUID("answer-uuid", "TAG")
TAQUUID("question-uuid", "TAG")
CQUUID("question-uuid")
CRUUID("table-uuid")

19.6. Параметры и переменные

PARAM("PARAM1")
$VAR1
VAR("VAR1")

19.7. Присваивания

$X = "abc"
$X = 10
$X = Q1
$X = Q1.A3
$X = Q1.A
$X = Q1.A3.T.A_TAG_INT
$X = Q2.COUNT
$X = AQUUID("question-uuid")
$X = TAQUUID("question-uuid", "TAG")
$X = RAND(1, 10)

VAR("X") = "abc"
VAR("X") = Q1
VAR("X") = Q1.A3

19.8. RAND

RAND(5)
RAND(1, 10)

19.9. Логика и сравнения

Q1 == "Q one"
Q1.A3 != "Wrong"
Q5.A < 100
Q5.A <= 22
Q5.A > 10
Q5.A >= 22
NOT Q123
Q1 AND Q2
Q1 OR Q2
(Q1 AND Q2) OR Q3

20. Практические рекомендации

  1. Используйте двойные кавычки для строк.

  2. Для сложной логики всегда ставьте скобки.

  3. Если значение может отсутствовать, учитывайте возможность null.

  4. Для числовых сравнений используйте числовые литералы:

Q5.A >= 22
  1. Для читаемости разделяйте длинные выражения пробелами:
Q1.A3 == "A three" AND Q2.A1 == "A one"

21. Примеры полных выражений

Простые проверки

Q1
Q1.A3
NOT Q123

Сравнение вопросов и ответов

Q1 == "Q one"
Q1.A3 == "A three"
Q3.R1 == "Q three R one"
Q3.R1.A3 == "A three"

Работа с числовыми ответами

Q5.A == 22
Q5.A != 20
Q5.A < 123
Q5.A >= 22

Теги

Q1.A3.T.A_TAG_INT == 55
Q1.A.T.A_TAG_STR == "Tag value"
TATUUID("a2101b08-b18e-4137-abb0-5eb2e44d751e", "A_TAG_INT") == 55
TAQUUID("06bf20de-9658-4afd-9e7b-d712697ccdc7", "A_TAG_STR") == "Tag value"

Параметры и переменные

PARAM("PARAM1") == "PAR1"
$VAR1 == "VAL1"
VAR("VAR1") == "VAL1"
$TMP = Q1.A
VAR("N") = RAND(1, 100)

Сложная логика

Q1.A3 AND (Q2.A1 == "A one" OR Q1111.A111 == "Wrong Q")
Q1 AND (Q1 == "Q one" OR Q1 == "Wrong Q")
Q1.A3 AND NOT Q2222.A1 AND Q5555.A2

22. Краткая формальная сводка

Вопрос:
  Qn
  Qn.Rm

Ответ:
  Qn.Am
  Qn.Rm.Ak

Текст ответа:
  Qn.A
  Qn.Rm.A

Теги:
  Qn.Am.T.TAG
  Qn.Rm.Ak.T.TAG
  Qn.A.T.TAG
  Qn.Rm.A.T.TAG

Подсчёты:
  Qn.COUNT
  Qn.Rm.COUNT
  Qn.R.COUNT

UUID:
  QUUID("uuid")
  ATUUID("uuid")
  AQUUID("uuid")
  TATUUID("uuid", "TAG")
  TAQUUID("uuid", "TAG")
  CQUUID("uuid")
  CRUUID("uuid")

Параметры:
  PARAM("name")

Переменные:
  $NAME
  VAR("NAME")

Присваивание:
  $NAME = <value>
  VAR("NAME") = <value>

RAND:
  RAND(n)
  RAND(min, max)

Логика:
  expr AND expr
  expr OR expr
  NOT expr
  (expr)

Сравнения:
  expr == expr
  expr != expr
  expr < expr
  expr > expr
  expr <= expr
  expr >= expr

23. Источник истины

Этот документ составлен по фактической реализации проекта:

Грамматики pexl.g, convert2UUID.g, convert2QA.g должны держаться в синхроне по набору поддерживаемых токенов и продакшнов: если в одной из них появляется новый оператор (например, RAND), его обязательно нужно добавить и в две другие, иначе сохранение/отображение выражений ломается.

Если реализация и документ когда-либо разойдутся, источником истины следует считать код и тесты.

Redirects / HOOKs

WEB интервью: Redirect/HK и входные параметры

Для чего это нужно

В WEB интервью ссылка для перехода (Redirect) и ссылка для хука (HK/hooks) могут автоматически получать значения из входной ссылки интервью.

Это позволяет:


Как это работает

1) Входные параметры берутся из URL запуска интервью

Пример входной ссылки:

https://app.example.com/?poll_id=1001&visit_id=abc123&project_id=prj55&source=telegram

Из неё система запоминает параметры (poll_id, visit_id, project_id, source и т.д.).

2) В Redirect/HK используются плейсхолдеры

В настройках URL можно писать параметры в виде:

$имя_параметра$

При выполнении Redirect/HK эти плейсхолдеры заменяются фактическими значениями.

Пример шаблона:

https://target.example.com/result/$project_id$?visit=$visit_id$&src=$source$

Результат:

https://target.example.com/result/prj55?visit=abc123&src=telegram

Важные правила

  1. Подстановка работает для всех параметров, которые пришли во входной ссылке.
  2. Подстановка работает и для:
    • обычных Redirect/HK;
    • сценария дубля (DOUBLE).
  3. Если параметр отсутствует, вместо него подставляется пустое значение.
  4. Спецсимволы в значениях кодируются автоматически (безопасно для URL).

Рекомендации по настройке