Участник сообщества #36
Участник сообщества #36
25 дек. 2025 г., 07:30(изменён)
Решено
0
0

Ошибка при обработке результатов опроса

Из чата сообщества

Приветствую всех! Нужна помощь. Я делаю обработку результатов опросов в поле "Программный код обработки результатов опроса" и нашел описание его использования в документации. При работе уже с данными в вариантах ответов не выводятся данные.

Вот ссылка на доку откуда взял https://clients.websoft.ru/view_doc.html?mode=wiki_base&object_id=6839938596759619310

Там я взял код и уже начал работать с ним. Но при обращении к entries найденного вопроса выводит undefined. Я уже проверил на правильность получаемых в поиске данных, все верно нужные данные

вот мой код, который я перековырял

_count = 0;
_tmp = 0;

for (qst in docPollResult.TopElem.questions) {
    _pq = ArrayOptFind(tePoll.questions, "This.id==" + CodeLiteral(qst.id));
    if (_pq != undefined) {
        if (_pq.type == "number" && OptReal(qst.value) != undefined) {
            _count += OptReal(qst.weight);
            alert(_count);
            _tmp++;
        }
        else if (_pq.type == "choice" || _pq.type == "combo") {
            _ent = ArrayOptFind(_pq.entries, "This.id==" + CodeLiteral(qst.value));
            alert(CodeLiteral(_pq.id));
            alert(CodeLiteral(_pq.title));
            alert(CodeLiteral(_pq.entries[0].entry.id)); // тут я уже увидел, что к title обращался, убрал не помогло
            if (_ent != undefined && OptReal(_ent.value) != undefined) {
                //alert(DataType(_ent))
                _count += OptReal(_ent.weight);
                alert(_count);
                _tmp++;
            }
        }
    }
}

if (_count > 0) {
    docPollResult.TopElem.custom_elems.ObtainChildByKey("count").value = _count;
}

alert(_count);
alert(_tmp);

Когда я отрабатываю эту строку alert(CodeLiteral(_pq.title.entries[0].entry.id)); выводит в лог это

10:20:23 [0HNI20IFSSFV3:000000AB] 75372124
10:20:23 [0HNI20IFSSFV3:000000AB] 'Вопрос 1'
10:20:23 [0HNI20IFSSFV3:000000AB] Unknown object property: entries
(Unknown source,   line 17)
(SafeEval(),  x-local://wtv/libs/poll_player_library.js,   line 1236)
(x-local://wtv/libs/poll_player_library.js,   line 1236)

вот кусок XML-ки, где видно, что оно есть

<is_multiple_select>0</is_multiple_select>
  <columns_num>1</columns_num>
  <questions>
    <question>
      <class>com.websoft.vclass.vo.poll.Question</class>
      <id>75372124</id>
      <type>choice</type>
      <title>Вопрос 1</title>
      <is_in_table>0</is_in_table>
      <show_header>1</show_header>
      <required>1</required>
      <subtype>0</subtype>
      <completed>0</completed>
      <entries>
        <entry>
          <id>59831502</id>
          <value>Ответ 1</value>
          <weight>1</weight>
        </entry>
        <entry>
          <id>82320570</id>
          <value>Ответ 2</value>
          <weight>2</weight>
        </entry>

То ли лыжи не едут, то ли я не так понимаю

Участник сообщества
Участник сообщества25 дек. 2025 г., 10:08(изменён)
Решение

Я разреши свой вопрос Прикладываю свой код

_count = 0;
_tmp = 0;

for (qst in docPollResult.TopElem.questions) {

    // Найти исходный вопрос
    _pq = ArrayOptFind(
        tePoll.questions,
        "This.id==" + CodeLiteral(qst.id)
    );
    if (_pq == undefined)
        continue;
    // Числовой вопрос
    if (_pq.type == "number" && OptReal(qst.value) != undefined) {
        _tmp++;
        _count += OptInt(_pq.weight);
    }

    // Choice / Combo
    else if (_pq.type == "choice" || _pq.type == "combo") {

        // Приводим qst.value к числу для корректного поиска
        _ent = ArrayOptFind(
            _pq.entries.entry,
            "This.id==" + OptInt(qst.value)
        );
        if (_ent != undefined) {
            _tmp++;
            _count += OptInt(_ent.weight);
        }
    }
}

// Сохраняем результат
if (_count > 0) {
    docPollResult.TopElem.custom_elems
        .ObtainChildByKey("count").value = _count;
}

alert("FINAL _count=" + _count);
alert("FINAL _tmp=" + _tmp);

Что было исправлено

_ent = ArrayOptFind(_pq.entries, "This.id==" + CodeLiteral(qst.value));

тут было CodeLiteral поменял на OptInt(qst.value) и _pq.entries на _pq.entries.entry, т.к. это не массив оказался, а контейнер XML Тут у меня как надо отработало, подсчитало вес ответов и записало в созданную кастомное поле в XML

Участник сообщества
Участник сообщества25 дек. 2025 г., 07:48(изменён)

Привет. А зачем вы к title обращаетесь? entries в корневом элементе. _pq.entries

Если нужно к первому именно, то лучше ArrayOptFirstElem

Чтобы ответить, необходимо войти в систему