@arcos said in Как из веб-интерфейса передать данные в потоки?:
Юзаю стандартный интерфейс.
В BAS есть стандартный интерфейс и веб интерфейс. Веб интерфейс ещё подразделяется на сгенерированный и пустой интерфейс
ДО нажатия на "Run" формирую некоторые данные, и нужно передать их в потоки. Второй день читаю документацию, перепробовал все варианты - ничего не работает. Глобал переменные создавать нельзя до старта, вот еще что пробовал:
Создал простую функцию в басе (ADD), которая принимает 2 параметра: name, data; создает ресурс name и добавляет в него data.
Затем вызываю функцию из веб-интерфейса:
await Api.RunFunction("ADD", {name: "testRes", data: "123"})
Результат: потоки крашатся с ошибкой: Все данные были обработаны для testRes
Пробовал явно создать ресурс testRes, и в функции просто закинуть в него параметр data.
Результат - ресурс testRes всегда пустой.
Уже хочется комп разбить, или бас удалить, почему код не работает?
Задача самая элементарная: передать переменную в потоки.
Какие то ужасти описываете. Не совсем понятно зачем создавать ресурс, вызывать функцию.. Если вы используете сгенерированный веб интерфейс, значит в интерфейсе есть кнопка "Старт", значит тип повторения, количество потоков, всё настроено в скрипте. Значит распределять данные в потоках проще всего через ресурсы, но раз у вас интерфейс генерирует поля, то данные проще собрать в объект, передать объект в виде json строки через ресурс с типом "строка", что бы в функции "OnApplicationStart" распарсить json строку и заполнить локальный ресурс, который уже будет использоваться в остальных потоках.
На случай если возникнут проблемы с vue, вот реализация добавления инпутов на js: https://codepen.io/FoxV/pen/JjmVJgw
Теперь по шагам:
Создаём скрипт с ресурсом res1 и типом строка, сохраняем и загружаем на сервер. Далее генерируем веб интерфейс, открываем его для редактирования, находим в окне html элемент ресурса "res1" по атрибуту data-resource-name="res1", добавляем в него атрибут hidden="true" что бы спрятать. После этого элемента добавляем кнопку с контейнером
<button id="createInput">Create Input Field</button>
<div id="input-container"></div>
В окне js добавляем обработчик клика:
var inputCount = 0;
$("#createInput").on("click", function () {
inputCount++;
var span = document.createElement("span");
span.class = "block"
var div = document.createElement("div");
var container = document.getElementById("input-container");
var input = document.createElement("input");
input.type = "text";
input.className = "test_resource";
input.id = "input-" + inputCount;
div.appendChild(input);
span.appendChild(div);
var deleteButton = document.createElement("button");
deleteButton.innerHTML = "Delete";
deleteButton.onclick = function () {
container.removeChild(span);
};
div.appendChild(deleteButton);
span.appendChild(div);
container.appendChild(span);
})
Затем находим функцию "GetResourceValue", добавляем код для получения значений всех созданных инпутов и отправки их в ресурс:
function GetResourceValue(ResourceName) {
if (ResourceName == "res1") {
var values = [];
document.querySelectorAll('.test_resource').forEach(input => {
values.push(input.value);
});
return JSON.stringify(values);
}
return GetValue(ResourceName)
}
Открываем скрипт BAS в режиме "записи", создаём функцию "OnApplicationStart", в ней создаём код для парсинга полученного массива из строки json, создаём локальный ресурс и заполняем его данными из массива:
a221e1d2-5664-430e-9bea-da6a32f11575-изображение.png
Всё! Теперь в функции Main можно использовать локальный ресурс как обычный ресрус:

Тестовый скрипт: 2679.xml
Экспортированный интерфейс: qw2.main.interface.27_05_2023_13_03.txt